require.js 需要具有 index.js 的模块
require.js require a module with index.js
所以我正在尝试设置 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 这是一个模块吗?
RequireJS 不会自动检查 index.js
是否存在并将其加载为您的模块。你需要告诉 RequireJS 当你想加载 someModule
时,它应该加载 someModule/index
。我在 require.config
:
的调用中设置了 map
require.config({
[ ... ]
map: {
'*': {
someModule: 'someModule/index',
}
},
});
您必须调整您在此处提供的名称,使其成为相对于您的 baseUrl
的路径。从您在问题中提供的信息中不清楚它应该是什么。
(郑重声明,还有一个 packages
设置,你可以调整它来做你想做的事情,但是把一些东西 packages
说 "this is a package",这不是你看起来的样子在这里。所以我不会用它来做你想做的事。)
我也不喜欢 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 = { .. };
});
所以让我们假设您在 require 的配置中设置了 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。最简单的版本是重写您尝试访问的请求 "module" 的 name
并将其传递回 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);
});
}
};
});
})();
这不是生产代码,它只是一种简单的方式来证明需要配置并不是为了解决这样的问题。
所以我正在尝试设置 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 这是一个模块吗?
RequireJS 不会自动检查 index.js
是否存在并将其加载为您的模块。你需要告诉 RequireJS 当你想加载 someModule
时,它应该加载 someModule/index
。我在 require.config
:
map
require.config({
[ ... ]
map: {
'*': {
someModule: 'someModule/index',
}
},
});
您必须调整您在此处提供的名称,使其成为相对于您的 baseUrl
的路径。从您在问题中提供的信息中不清楚它应该是什么。
(郑重声明,还有一个 packages
设置,你可以调整它来做你想做的事情,但是把一些东西 packages
说 "this is a package",这不是你看起来的样子在这里。所以我不会用它来做你想做的事。)
我也不喜欢 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 = { .. };
});
所以让我们假设您在 require 的配置中设置了 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。最简单的版本是重写您尝试访问的请求 "module" 的 name
并将其传递回 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);
});
}
};
});
})();
这不是生产代码,它只是一种简单的方式来证明需要配置并不是为了解决这样的问题。