我正在构建一个模块化的单页面应用程序,它消耗来自不同来源的多个require配置文件。我希望在我的应用程序中能够使用特定类型的所有模块的列表。像这样的东西:
define('module-type/an-implementation',...)
define('module-type/another-implementation',...)
require('module-type/*', function(modules){
$.each(modules,function(m){ m.doStuff(); });
})
这是依赖注入器使用多个依赖注入的类似模式(例如https://github.com/ninject/ninject/wiki/Multi-injection)
有没有办法用require做这个(或类似的东西)?
答案 0 :(得分:1)
RequireJS在需要它们之前不知道哪些模块存在。一旦需要/依赖于一个模块,RequireJS将根据模块的名称和RequireJS的配置确定从哪里请求模块。一旦加载了模块,就可以检查/执行它以找出它的依赖关系并依次处理它们,直到加载所有依赖项并执行所有模块体。
为了能够“使用特定类型的所有模块的列表”,需要能够找到所有这些模块。 RequireJS没有任何方法可以知道存在哪些模块,因此单独使用它不足以实现“多注入”。
可以在构建系统的帮助下创建和填充某种模块注册表:例如每次添加/删除或重命名源目录中的文件时,都可以生成一个文件(比如module-registry.js
),然后可以进行多次注入:
multiRequire('module-type/*', function(modules){
$.each(modules,function(m){ m.doStuff(); });
})
反过来会调用
require(findModules(pattern), function() {
callback(Array.prototype.slice.call(arguments, 0));
});
(其中multiRequire
和findModules
由模块注册表提供。)