我正在使用一个由“核心”加上多个“扩展”组成的外部库。每个扩展都取决于核心。想想jQuery或者Rx。
我需要做的是将核心与一些扩展捆绑在一起,并将其作为单个模块提供。从表面上看,似乎这样的事情应该有效:
// lib.js
define(
"lib",
["./Lib/lib", "./Lib/ext1", "./Lib/ext2"],
function(lib) { return lib; }
);
然而,问题是扩展期望“核心”可以通过模块ID“lib”获得。换句话说,“ext1”定义如下:
// Lib/ext1.js
define( ["lib"], function(lib) { lib.ext.someFunc = ... } );
可以在这里发现问题:因为名称“lib”指的是我的“捆绑”模块而不仅仅是“核心”,它在ext1加载时尚未可用,因此整个链变为圆形并且掉落开。
当然,我可以将核心映射到“lib”,然后为我的捆绑模块命名:
// main.js
require.config( { paths: { lib: "Lib/lib" } } );
// lib.js
define(
"bundled-lib",
["./Lib/lib", "./Lib/ext1", "./Lib/ext2"],
function(lib) { return lib; }
);
但由于以下几个原因,这种做法非常不受欢迎:
使用其他名称显然不方便。我可以使用没有好的常识名称,“lib”几乎是唯一的选择,其他任何东西看起来都很难看。
但更重要的是,这可能导致难以捕获的错误。在路上,当我忘记了这个小小的黑客时,我可能只是遵循我的常识并导入“lib”而不是“bundled-lib”,然后我的扩展将不会被加载。或者有时他们会。如果正确导入“bundled-lib”的其他模块恰好在新的“lib” - 导入模块之前加载,那么它将起作用。否则,它不会。这意味着我的应用程序将崩溃或取决于是否已使用某些功能。
所以底线是,我想将核心与扩展捆绑在一起,调用捆绑“lib”,但不知何故有扩展只导入核心,而不是修改扩展本身
任何想法?
答案 0 :(得分:1)
这听起来与jQuery和jQuery插件非常相似。看起来你对这些含义有所了解,所以你只需要决定选择哪种方法。
我不会使用返回'lib'的模块,它已经有了这些扩展。如果您觉得在引用扩展库时只需要单一依赖,那么请使用“bundled-lib”方法。
坚持最佳实践,不要在将来混淆自己,我相信最好不要捆绑,但对于那些依赖扩展的模块,包括对核心库和那些扩展的依赖:
define(['lib', 'ext1'], function(lib){
// module definition...
});
这样很清楚这个模块的依赖关系是什么。我相信你已经考虑过了,我希望它可以帮助你做出决定。
答案 1 :(得分:0)
所以在问了这个问题几个小时之后,我就找到了答案。
答案是 - RequireJS的map config 基本上,事实证明,我可以定义每个模块单独看到的模块名称映射。
特别是,我在问题中描述的问题将通过以下配置解决:
require.config( {
map: {
'ext1': { 'lib': 'Lib/lib' }
'ext2': { 'lib': 'Lib/lib' }
}
} );
这将使ext1和ext2都将模块'Lib / lib'视为'lib',而不会影响所有其他模块。