【问题标题】:Packaging a js library for AMD, CommonJS and more为 AMD、CommonJS 等打包一个 js 库
【发布时间】: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 是我的主要用例,即我自己使用库的方式),我也不确定要走哪条路。假设我的库发布了模块foobar,其中bar 取决于foo,两者都具有external 作为依赖项。我可以尝试做类似的事情

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

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

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

【问题讨论】:

    标签: javascript module requirejs amd commonjs


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不幸的是,r.js 的输出仍然有一些缺点。首先,它本身依赖于 RequireJS,这使得它不适合 CommonJS 和全局用例。此外,我宁愿不在我的库中包含外部依赖项,而是将它们作为依赖项。不过,我会尝试阅读您发布的文档,也许这会起作用。
    • 顺便说一句,如果从问题中不清楚,我的问题是发布一个库,具有以下约束。 1. 库由几个模块组成; 2.库有外部依赖; 3. 客户端应该能够在 AMD、CommonJS 或全局中使用该库。
    • 谢谢。 :-) 你建议的方法相当于我问题中的第一个狙击手。问题是,这仅适用于没有依赖关系的单个单体库。我要解决的问题是如何在存在外部和内部依赖项的情况下使其工作。
    • 那么你为什么不使用类似的方法编写解析器呢? #1 - 测试环境并检查存在哪个(AMD/Node)依赖管理器,#2 - 加载。这是我遇到的第一个想法:gist.github.com/er1z/7721672
    • 好吧,这可能行得通!我将尝试使用这种方法并让您知道它是否有效。我可能不得不解决一些问题,因为这样做会破坏 r.js 缩小脚本,但似乎很有希望
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2012-11-20
    • 2018-04-04
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多