【问题标题】:Name collisions building a JavaScript library with RequireJS使用 RequireJS 构建 JavaScript 库的名称冲突
【发布时间】:2016-04-22 07:54:24
【问题描述】:

我们决定开始将 RequireJS 用于我们正在开发的 JavaScript 库。我对 RequireJS 比较陌生,我想知道我必须做什么才能确保我们库的模块名称不会与使用我们库的任何应用程序模块发生冲突。例如,如果我定义模块 encoding.js:

define("encoding", ["dependency"], function(myDep) {
    ...
})

似乎使用我的库并且本身具有 encoding.js 的应用程序会导致名称冲突。是否有任何 ReuireJS 选项可以用来“屏蔽”我的库名称,使其免受使用我们库的任何应用程序的影响?

另外,我知道第一个参数“encoding”是可选的。我添加它的原因是我们使用了 minify-maven-plugin 来构建我们的库。这使得库中的所有模块最终都在一个文件中,然后似乎我需要添加模块名称,否则我会收到不匹配的匿名定义模块错误(http://requirejs.org/docs/errors.html#mismatch)。我想我可能会改用 r.js 优化工具。是否也可以设置它来消除名称冲突问题?

实际上,我想我们可能会通过将 define 调用封装在如下内容中来使我们的库与 RequireJS 无关:

(function(root, factory) {
    if (typeof define === "function" && define.amd) {
        define("encoding", ["dependency"], factory);
    } else {
        root.MyLib.Encoding = factory(MyLib.Deps);
    }
}(this, function() {
    ...
}))

我找到了这个话题:Creating a reusable RequireJs library,但没有得到明确的答案,也不是我想要的。

【问题讨论】:

    标签: javascript requirejs r.js


    【解决方案1】:

    在使用 RequireJS 时,通常的做法(实际上是推荐的做法)不命名模块。命名它们会降低模块的可移植性,并对优化工具产生不利影响。

    RequireJS 将负责根据文件创建模块名称。根据我的经验,效果很好。

    所以你的编码模块(encoding.js)看起来像这样

    define(["dependency"], function(myDep) {
      ...
    })
    

    假设这里没有任何特殊的目录结构,编码模块可以像这样在encoding_app.js中使用

    requirejs(["encoding", "othermodule"],
      function (encoder, other) {
      }
    );
    

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2014-10-03
      相关资源
      最近更新 更多