[英]How to properly publish an AMD module so that RequireJS can locate the dependencies?
AMD是我最喜欢的JS模块标准,原因很简单,它允许以可分析的方式正确指定模块依赖性。 假设我的模块使用jquery
和lodash
:
define(['jquery', 'lodash'], function ($, _) { ... });
现在,说我想发布这个模块。 当然,我会在package.json
和/或bower.json
文件中指定这些依赖bower.json
,因此我可以确定它们将被安装。 但是,我怎样才能确定AMD加载器(例如RequireJS)找到了jquery
和lodash
库?
似乎我的库的用户将被强制手动指定这些路径:
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"
}
}
请注意,您排除使用的库jquery
和underscore
因为您希望库的用户为您包含它们。 您告诉用户有关依赖项的信息。 这是推荐的方法。 虽然您可以省略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'
}
});
最后一种方法比其他方法有两个缺点:
define('name', ...);
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.