繁体   English   中英

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

[英]How to properly publish an AMD module so that RequireJS can locate the dependencies?

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

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

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

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

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

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

处理AMD软件包的首选方法是什么?

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

另请看一下这个例子

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

{
    "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并让依赖项包含在您的构建中,但这也很好。

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. 如果您有多个使用依赖项的模块,并将依赖项移动到其他文件夹,则必须搜索并替换所有显式依赖项路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM