所以我试图设置Typescript和Chutzpah用于测试目的。 Typescript设置为以这种格式输出:
define(['require', 'exports', './someModule'], function(require, exports, someModule) {
//examplecode
});
哪个工作正常,当someModule实际上是一个带有index.js的目录时会出现问题。
/app
app.js
/someModule
index.js
require.js无法以这种方式解析someModule并且测试失败。
有没有办法告诉require.js这是一个模块?
答案 0 :(得分:3)
RequireJS不会自动检查是否存在index.js
并将其作为您的模块加载。您需要告诉RequireJS,当您要加载someModule
时,它应该加载someModule/index
。我在require.config
的电话中设置map
:
require.config({
[ ... ]
map: {
'*': {
someModule: 'someModule/index',
}
},
});
您必须调整您在那里提供的名称,使其成为相对于baseUrl
的路径。从你在问题中提供的信息中得知它应该是什么,这一点并不清楚。
(为了记录,还有一个packages
设置,您可以调整以执行您想要的操作,但放置一些packages
说"这是一个包&#34 ;,这不是你在这里看到的。所以我不会用它来做你想做的事。)
答案 1 :(得分:1)
我也不喜欢map
中的配置。我完成此操作的最简单方法是为require编写一个插件。
让我们将插件命名为mod
,将其用作mod!module/someModule
,您也可以将其称为index
,如index!module/someModule
所示,你最好。
define(function(require, exports, module) {
// loading module/someModule/index.js with `mod!`
var someModule = require('mod!module/someModule');
// whatever this is about ..
module.exports = { .. };
});
因此,假设您在需要的配置中设置了paths
,其中包含某种项目结构:
- 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
需要配置:
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'
}
});
阅读有关如何编写插件的所有方面read the docs at requirejs.org。最简单的版本是重写所请求的"模块的name
"您正尝试访问并将其传递回load
。
应用程序/插件/ 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);
});
}
};
});
})();
这不是生产代码,它只是一种简单的方式来证明需要配置并不意味着解决这样的问题。