RequireJS Multi Injecting

时间:2014-10-16 02:36:04

标签: requirejs amd

我正在构建一个模块化的单页面应用程序,它消耗来自不同来源的多个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做这个(或类似的东西)?

1 个答案:

答案 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));
});

(其中multiRequirefindModules由模块注册表提供。)