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"},
    }
});