关于javascript:打包AMD,CommonJS等的js库

Packaging a js library for AMD, CommonJS and more

当打包需要与AMD、CommonJS或全局一起使用的JavaScript库时,通常使用如下定义:

1
2
3
4
5
6
7
8
9
(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是我的主要用例,也就是我自己使用库的方式),我也不确定该怎么做。假设我的库发布模块foobarbar依赖于foo,两者都有external作为依赖项。我可以试着做一些像

1
2
3
4
5
6
7
8
// mylib/foo.js
define(['external'], function(external) {
  // whatever
});
// mylib/bar.js
define(['./foo', 'external'], function(foo, external) {
  // whatever
});

不过,我不能保证我的客户能够正确解决"外部"问题。为了实现这一点,客户机需要在其RequireJS定义中显式地添加external的路径。如果只有一个依赖关系,这仍然是可行的,但是我更愿意保护客户机不必知道库使用外部的。这应该在我的bower.jsonpackage.json文件中声明,但是客户机不应该手动处理可传递的依赖项。一旦一个库有多个依赖项,每个依赖项都有其他依赖项,事情就会变得复杂起来。

What is the correct way to handle dependencies in a library, especially considering the possibility of supporting multiple module standards?


我将使用r.js将模块合并到一个文件中(当然,只有内部依赖项)。

我不确定我是否正确理解了您的问题,但是合并到一个文件中的几个模块可以解决您的问题。

您关注的是这个问题,RequireJS文档已经发布了一个示例:http://requireJS.org/docs/node.html

编辑:看看jquery.js的尾部-他们处理过这样的方法:https://gist.github.com/er1z/7721573