【发布时间】:2013-12-16 15:35:17
【问题描述】:
在打包需要与 AMD、CommonJS 或作为全局一起使用的 javascript 库时,通常使用如下定义:
(function(name, definition) {
if (typeof module != 'undefined') module.exports = definition();
else if (typeof define == 'function' && typeof define.amd == 'object') define(definition);
else this[name] = definition();
}('mod', function() {
//Here goes the code you would normally have inside define() or add to module.exports
return MyModule
};
}));
假设您的库仅包含一个文件,没有外部依赖项,这很有效。我不确定在发布包含各种相互依赖的模块(可能具有外部依赖项)的库时该怎么做。
即使我只想支持 AMD(AMD + Bower 是我的主要用例,即我自己使用库的方式),我也不确定要走哪条路。假设我的库发布了模块foo 和bar,其中bar 取决于foo,两者都具有external 作为依赖项。我可以尝试做类似的事情
// mylib/foo.js
define(['external'], function(external) {
// whatever
});
// mylib/bar.js
define(['./foo', 'external'], function(foo, external) {
// whatever
});
不过,我不能保证我的客户会正确解析“外部”。为此,客户端需要在其 RequireJS 定义中显式添加 external 的路径。如果只有一个依赖项,这仍然是可行的,但我宁愿保护客户端不必知道库使用外部。这应该在我的bower.json 和package.json 文件中声明,但是客户端不应该手动处理传递依赖。一旦一个库有多个依赖项,每个依赖项都有其他依赖项,事情就会变得棘手。
在库中处理依赖关系的正确方法是什么,尤其是考虑到支持多个模块标准的可能性?
【问题讨论】:
标签: javascript module requirejs amd commonjs