javascript - require.js requerir un módulo con index.js
Así que estoy tratando de configurar Typescript y Chutzpah con fines de prueba. Typescript está configurado para generar salida en este formato:
define(['require', 'exports', './someModule'], function(require, exports, someModule) {
//examplecode
});
Lo cual funciona bien, el problema ocurre cuando someModule es en realidad un directorio con un index.js.
/app
app.js
/someModule
index.js
require.js no puede resolver someModule de esta manera y la prueba falla.
¿Hay alguna manera de decirle a require.js que esto es un módulo?
Respuesta #1
RequireJS no verificará automáticamente la presencia de index.js ni cargará eso como tu módulo. Necesitas decirle a RequireJS que cuando quieras cargar someModule, debería cargar someModule/index. Yo establecería un map en mi llamada a require.config:
require.config({
[ ... ]
map: {
'*': {
someModule: 'someModule/index',
}
},
});
Tienes que ajustar el nombre que das allí para que sea una ruta relativa a tu baseUrl. No está claro, a partir de la información que proporcionas en tu pregunta, cuál debería ser.
(Para que conste, también hay una configuración packages que probablemente podrías ajustar para hacer lo que quieres, pero poner algo packages dice "esto es un paquete", lo cual no parece ser lo que tienes aquí. Así que no lo usaría para lo que estás intentando hacer.)
Respuesta #2
Tampoco me gustó la configuración en map. La forma más simple en que logré esto fue escribiendo un plugin para require.
Nombrémos el complemento mod, donde se va a usar como mod!module/someModule, también puedes llamarlo index como en index!module/someModule, lo que mejor te convenga.
define(function(require, exports, module) {
// loading module/someModule/index.js with `mod!`
var someModule = require('mod!module/someModule');
// whatever this is about ..
module.exports = { .. };
});
Así que supongamos que tienes paths configurados en la configuración de require con algún tipo de estructura de proyecto:
- app
- modules
- someModule/index.js // the index we want to load
- someModule/..
- someModule/..
- etc
- plugins
- mod.js // plugin to load a module with index.js
Requiere configuración:
require.config({
paths: {
'module': 'app/modules',
// the plugin we're going to use so
// require knows what mod! stands for
'mod': 'app/plugins/mod.js'
}
});
Para leer todos los aspectos de cómo escribir un complemento, lea la documentación en requirejs.org. La versión más simple sería simplemente reescribir el name del "módulo" solicitado al que está intentando acceder y devolverlo a load.
app/plugins/mod.js
(function() {
define(function () {
function parse(name, req) {
return req.toUrl(name + '/index.js');
}
return {
normalize: function(name, normalize) {
return normalize(name);
},
load:function (name, req, load) {
req([parse(name, req)], function(o) {
load(o);
});
}
};
});
})();
Este no es código de producción, es solo una forma simple de demostrar que requires config no estaba destinado a resolver problemas como este.
