具有传递依赖性的AMD模块

时间:2014-08-18 03:02:44

标签: javascript amd bower

假设我想创建一个本身依赖于其他AMD模块的AMD模块。无论什么,但要有形,假设它的一些新的日期选择器小部件依赖于moment.js

所以我设置了一个看起来像这样的bower.json:

{
  "name": "sampleLib",
  "version": "0.0.1",
  "description": "test",
  "main": "myControl.js",
  "moduleType": [
    "amd"
  ],
  "dependencies": {
    "moment": "~2.8.1"
  }
}
好的,很酷。没问题。

我的问题是如何消耗它......我看到两种选择,我都不喜欢:

选项一

将我的代码和moment.js转换为统一脚本,然后发布。它很容易让客户消费,因为他们只需要依赖我的模块。在这种情况下:

  1. moment.js实际上是devDependency,因为我的客户不必下载它吗?
  2. 如果客户端依赖于 传递依赖于moment.js的另一个模块,那么客户端基本上是否有两次加载库?
  3. 选项二

    不要连接我的代码并将moment.js声明为bower.json中的依赖项。因此,当客户bower install成为我的图书馆时,他们也会关闭moment.js。这很酷。但我担心的是命名空间...假设我依赖于时刻作为'lib / moment',但是客户端的结构是否仅仅依赖于时刻作为'时刻'?在运行时,我的代码是否因为未定义lib / moment而失败?我担心这太脆了,有没有办法加强这个,除了好的文档?

    TL; DR

    发布具有依赖关系的AMD模块的最强大的方法是什么?

1 个答案:

答案 0 :(得分:1)

选项1 - 虽然连接更容易分发代码,但是您遇到了其中一个问题 - 您可能会遇到与其他库冲突的风险。您还可以增加js库的大小。

选项2 - 我认为你并不是指这里的命名空间,而是模块的路径。那是对的吗? RequireJS有一个配置块,您可以更改基本路径和映射,以解决您所指的问题。 http://requirejs.org/docs/1.0/docs/api.html#config

所以,在你的情况下,如果你想发布一个AMD模块和依赖项,我仍然会选择2。