首页 文章

为AMD,CommonJS等打包js库

提问于
浏览
1

打包需要与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是我的主要用例,也就是我自己使用该库的方式),我不确定是哪种方式 . 假设我的库发布模块 foobar ,其中 bar 取决于 foo ,两者都具有 external 作为依赖项 . 我可以尝试做类似的事情

// mylib/foo.js
define(['external'], function(external) {
  // whatever
});
// mylib/bar.js
define(['./foo', 'external'], function(foo, external) {
  // whatever
});

不过,我无法保证我的客户能正确解决'external' . 为此,客户端需要在其RequireJS定义中显式添加 external 的路径 . 如果只有一个依赖项,这仍然是可行的,但我更愿意保护客户端不必知道库使用外部 . 这应该在我的 bower.jsonpackage.json 文件中声明,但客户端不应该手动混淆传递依赖 . 一旦库有多个依赖项,每个依赖项都有其他依赖项,那么事情就会变得多毛 .

处理库中依赖关系的正确方法是什么,特别是考虑到支持多个模块标准的可能性?

1 回答

  • 1

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

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

    您专注于问题,RequireJS文档已经发布了一个示例:http://requirejs.org/docs/node.html

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

相关问题