如何正确发布AMD模块,以便RequireJS可以找到依赖项?

时间:2014-08-31 09:45:17

标签: javascript module requirejs amd

AMD是我最喜欢的JS模块标准,原因很简单,它允许以可分析的方式正确指定模块依赖性。假设我的模块使用jquerylodash

define(['jquery', 'lodash'], function ($, _) { ... });

现在,我想发布这个模块。当然,我会在package.json和/或bower.json文件中指定这些依赖项,因此我可以确定它们将被安装。但是,我怎样才能确定AMD加载程序找到jquerylodash库(例如RequireJS)?

我的库的用户似乎被迫手动指定这些路径:

requirejs.config({
    paths: {
        jquery: '../lib/jquery/jquery-min',
        lodash: '../lib/lodash/dist/lodash'
    }
});

作为应用程序开发人员,我会很好。但 我不能只假设我的库的用户会自动执行此操作(更不用说匹配的名称)了,所以我必须记录额外的步骤。这让我担心。 NodeJS / CommonJS似乎有办法找到没有任何路径规范的正确文件。我不确定这是怎么做的,但我想他们会搜索最有可能的地方。

为AMD软件包处理此问题的首选方法是什么?

2 个答案:

答案 0 :(得分:3)

有一个关于如何使用requirejs here构建独立库的教程。

另请查看此example

基本上,您使用开始和结束代码段包装代码。并在配置中指定它。

{
    "baseUrl": "../lib",
    "paths": {
        "principium": "../principium"
    },
    "include": ["../tools/almond", "principium"],
    "exclude": ["jquery", "underscore"],
    "out": "../dist/principium.js",
    "wrap": {
        "startFile": "wrap.start",
        "endFile": "wrap.end"
    }
}

请注意,您排除了使用过的库jqueryunderscore,因为您希望图书馆的用户能够为您提供这些图书馆。您告诉用户有关依赖项的信息。这是推荐的方法。虽然您可以省略exclude并让依赖项包含在您的构建中,但这也很好。

答案 1 :(得分:1)

RequireJS只是一个模块加载器,而不是依赖管理系统。

如果您只想提供最简单的集成级别(使用最少的设置),请将依赖项与您的发行版捆绑在一起。不要求使用依赖管理系统,如npm或bower,但使用构建脚本生成单个文件。然后将模块导出为单个模块。您可以使用r.js优化器生成一个自包含模块(如果您不使用Require.js的高级功能,则使用almond.js作为最小内部模块加载器。)

后一种方法的主要缺点是JavaScript代码的总大小通常比原始方法大,因为用户总是加载jQuery的副本,无论之前是否已加载过jQuery。优点是您可以轻松地交换依赖关系,而无需要求用户更改其配置。

如果您不想内联依赖项,那么您可以将依赖项与库捆绑在一起,如下所示(例如,使用npm作为依赖项管理器):

define(['./node_modules/lodash/lodash'], function(_) {

如果用户希望覆盖依赖关系(例如,在使用构建工具后减少最终输出的文件大小),那么他们可以使用(再次假设npm):

require.config({
    paths: {
        // replace yourmodule's lodash with lodash.js from the module's root
        'node_modules/yourmodule/node_modules/lodash/lodash': 'lodash'
    }
});

最后一种方法比其他方法有两个缺点:

  1. 它不适用于命名模块,即定义为define('name', ...);的模块。
  2. 如果您有多个使用依赖项的模块,并将依赖项移动到其他文件夹,则必须搜索并替换所有显式依赖项路径。