共享 JavaScript AMD 模块时如何选择依赖项名称?

How to choose the dependencies names when sharing a JavaScript AMD module?

我正在编写一个依赖于 HumanizeDuration.js 的工具(可以是任何其他依赖项)。使用 RequireJS,在 main.js:

require.config({
  paths: {
    "humanizeDuration": "./path/to/humanize-duration" /* .js */,
    "myTool": "./path/to/my-tool" /* .js */
  }
  // ...
});

my-tool.js中:

define(["humanizeDuration"], function (humanizeDuration) {
  // ...
}});

我想分享我的工具(例如 GitHub):

(function (global, factory) {

  if (typeof define === "function" && define.amd) {
    define(["humanizeDuration"], factory);
  } else if (typeof exports === "object") {
    module.exports = factory(require("humanizeDuration"));
  } else {
    global.MyTool = factory(global.humanizeDuration);
  }

}(this, function (humanizeDuration) {
  // ...
}));

问题是:我应该为依赖选择什么名字?由于这取决于开发人员如何配置他们的 main.js(对于 RequireJS),我错了吗?

在这里,我选择了 humanizeDuration,这样我可以告诉开发人员使用这个名称,但是如果他们使用另一个选择 humanize-duration 的工具呢?

如果您知道有一个最常用的名称将 HumanizeDuration.js 称为 AMD 模块,请使用它,但如果没有通用名称或您不能使用,则可以使用 humanizeDuration确定一个。确保 记录它 以便用户知道会发生什么。那么如果因为你的工具需要 humanizeDuration 但另一个工具需要 humanize-duration 而出现问题,你的工具的用户可以使用 map:

map: {
  '*': {
      "humanize-duration": "humanizeDuration"
  }
}

这告诉 RequireJS 在任何地方 ('*') humanize-duration 都是必需的,而是加载模块 humanizeDuration。显然,在这种情况下 humanizeDuration 就是 paths 中的内容。如果 humanize-durationpaths.

中,则整个事情可以反向映射