me di cuenta de la respuesta a mi pregunta, y la solución (que no eran los mismos aparentemente). Supongo que lo publicaré aquí en caso de que pueda ayudar a alguien más en el futuro.
Esencialmente, lo que quería era cargar mi marco dentro de su propio contexto. Encontré la opción de contexto bajo el configuration section en el sitio web de require y un example of how to use it. Originalmente probé esto haciendo algo como:
var req = require.config({
baseUrl: 'framework',
context: 'framework',
paths: {
jQuery: 'lib/jquery/jquery-1.7.min.js',
Underscore: 'lib/underscore/underscore.min.js',
Backbone: 'lib/backbone/backbone.min.js',
etc...
}
});
req(['main'], function() {});
Hubo dos problemas con esto. Primero, mi variable 'req' se definía fuera del marco, pero quería que el marco definiera sus propias rutas. Y segundo, cada vez que un archivo fuera del marco requeriría un archivo dentro del marco, que a su vez requeriría 'jQuery', por ejemplo, entonces jQuery (o lo que sea) no sería necesario desde el contexto de la instancia del marco de require y por lo tanto no pudo encontrar el archivo.
Lo que terminé haciendo fue definiendo main.js de mi marco a ser algo como esto:
var paths = {
jQuery: 'lib/jquery/jquery-1.7.min.js',
Underscore: 'lib/underscore/underscore.min.js',
Backbone: 'lib/backbone/backbone.min.js',
etc...
};
define(function() {
var exports = {};
exports.initialize = function(baseUrl, overridePaths, callback) {
if(!overridePaths) {
overridePaths = {};
}
if(baseUrl && baseUrl[baseUrl.length - 1] != '/') {
baseUrl = baseUrl + '/';
}
var fullpaths = {};
for(var path in paths) {
// Don't add baseUrl to anything that looks like a full URL like 'http://...' or anything that begins with a forward slash
if(paths[path].match(/^(?:.*:\/\/|\/)/)) {
fullpaths[path] = paths[path];
}
else {
fullpaths[path] = baseUrl + paths[path];
}
}
var config = {paths: fullpaths};
for(var pathName in overridePaths) {
config.paths[pathName] = overridePaths[pathName];
}
require.config(config);
// Do anything else you need to do such as defining more functions for exports
if(callback) {
callback();
}
}
return exports;
});
Y luego, en main.js de mi archivo de proyecto que acabo de hacer esto:
require(['framework/main'], function(framework) {
// NOTE: This setTimeout() call is used because, for whatever reason, if you make
// a 'require' call in here or in the framework without it, it will just hang
// and never actually go fetch the files in the browser. There's probably a
// better way to handle this, but I don't know what it is.
setTimeout(function() {
framework.initialize('framework', null, function() {
// Do stuff here
}
}, 0);
});
Esto toma todo lo que se transfiere al método initialize() de framework para 'baseURL' y lo antepone a cualquier ruta definida por el framework que no comience con una barra inclinada o 'anything: //', a menos que sean rutas de anulación. Esto permite que el paquete que utiliza el marco anule cosas como 'jQuery'.
¿Esto todavía permite que el paquete realice su propia llamada a require.config() y defina su propia lista de alias de ruta, siempre y cuando los archivos de referencia de los alias comiencen con './'? No quiero tener que usar la ruta relativa completa a todos los archivos, cada vez que los referencia con un define(). Desde entonces he reestructurado todo el proyecto, pero aún tengo curiosidad. –
Sé que esta respuesta está un poco anticuada, pero últimamente, puede usar rutas de acceso relativas para requerir módulos incluso sin paquetes. – hayavuk
Para referencia: http://requirejs.org/docs/api.html#packages – Skarllot