AMD是我最喜欢的JS模块标准,原因很简单,它允许以可分析的方式正确指定模块依赖性。假设我的模块使用jquery
和lodash
:
define(['jquery', 'lodash'], function ($, _) { ... });
现在,我想发布这个模块。当然,我会在package.json
和/或bower.json
文件中指定这些依赖项,因此我可以确定它们将被安装。但是,我怎样才能确定AMD加载程序找到jquery
和lodash
库(例如RequireJS)?
我的库的用户似乎被迫手动指定这些路径:
requirejs.config({
paths: {
jquery: '../lib/jquery/jquery-min',
lodash: '../lib/lodash/dist/lodash'
}
});
作为应用程序开发人员,我会很好。但 我不能只假设我的库的用户会自动执行此操作(更不用说匹配的名称)了,所以我必须记录额外的步骤。这让我担心。 NodeJS / CommonJS似乎有办法找到没有任何路径规范的正确文件。我不确定这是怎么做的,但我想他们会搜索最有可能的地方。
为AMD软件包处理此问题的首选方法是什么?
答案 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"
}
}
请注意,您排除了使用过的库jquery
和underscore
,因为您希望图书馆的用户能够为您提供这些图书馆。您告诉用户有关依赖项的信息。这是推荐的方法。虽然您可以省略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'
}
});
最后一种方法比其他方法有两个缺点:
define('name', ...);
的模块。