命名冲突使用RequireJS构建JavaScript库

时间:2016-04-22 07:54:24

标签: javascript requirejs r.js

我们决定开始将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,但它没有得到明确的答案,而且不是我想要的。

1 个答案:

答案 0 :(得分:0)

使用RequireJS时,通常的做法(实际建议做法)不要命名模块。对它们进行命名会使模块的可移植性降低,并会对优化工具产生负面影响。

RequireJS将负责根据文件创建模块名称。在我的经验中运作良好。

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

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

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

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