Do RequireJS模块“;继承;依赖关系?
如果我有一个需要应用程序命名空间的模块,例如:Do RequireJS模块“;继承;依赖关系?,requirejs,Requirejs,如果我有一个需要应用程序命名空间的模块,例如: define(["app"], function(App){ [...] }); 。。。名称空间需要所有模块使用的库,例如: define(["jquery", "underscore", "backbone"], function($, _, Backbone){ [...] }); 。。。然后,我的所有模块都可以访问命名空间所需的库,即,我可以使用$、\uu和主干 我喜欢这种行为,因为我可以避免重复,但我怀疑我在某种程度上作
define(["app"], function(App){
[...]
});
。。。名称空间需要所有模块使用的库,例如:
define(["jquery", "underscore", "backbone"], function($, _, Backbone){
[...]
});
。。。然后,我的所有模块都可以访问命名空间所需的库,即,我可以使用$
、\uu
和主干
我喜欢这种行为,因为我可以避免重复,但我怀疑我在某种程度上作弊,我应该在每个模块中都需要库
有人能帮我澄清一下吗?是的,有点麻烦。您只能访问jQuery、下划线和主干,因为它们也定义在全局范围内。主干和Underocre不是真正的AMD模块,它们必须使用垫片配置。jQuery在全球范围内声明自己是AMD模块,因此它在任何地方都能工作 所以,是的,它是这样工作的,但它不是最优的。真正的AMD模块(非填隙)将无法以这种方式工作,因为它们需要在定义函数参数中传递,并且您将无法仅拉动一个模块在单独的环境中对其进行测试,等等。这样,您就无法加载不同版本的脚本来处理不同的模块/应用程序部分/页面 AMD的目标是将模块化引入您的代码中,使每个模块都声明自己的依赖项,并在不依赖全局范围的情况下开箱即用(这是一件好事,可以防止名称冲突和与第三方/从事同一项目的其他开发人员冲突) 如果您发现每次重新声明基本依赖项都是多余的,那么创建一个样板文件,在创建另一个模块时只需复制/粘贴它(总比没有好)。而且,也许一些命令行工具可以为您构建AMD模块包装器 Soooo,是的,它是有效的,但是如果你的项目变得更大或者需要逐件更新,它将无法扩展
希望这有帮助 以上答案的好消息:下划线1.6.0现在包装为amd模块:) 请参阅“lib.chartjs”,了解如何在非amd包装的“填充”javascript库中导出全局变量
requirejs.config({
paths: {
"moment": "PATH_TO/js/moment/2.5.0/moment.min",
"underscore": "PATH_TO/js/underscore/1.6.0/underscore",
"jquery": "PATH_TO/js/jquery/1.10.2/jquery.min",
"lib.jssignals": "PATH_TO/js/jssignals/1.0.0-268/signals.min",
// WORKAROUND : jQuery plugins + shims
"lib.jquery.address": "PATH_TO/js/jqueryaddress/1.6/jquery-address"
"lib.jquery.bootstrap":"PATH_TO/js/bootstrap/3.0.3/bootstrap",
"lib.chartjs": "PATH_TO/js/chartjs/0.2/Chart.min",
},
shim: {
"lib.jquery.address": {deps: ["jquery"]},
"lib.jquery.bootstrap": {deps: ["jquery"]},
"lib.chartjs": {deps: ["jquery"], exports: "Chart"},
}
});