3

如果我有一个需要应用程序命名空间的模块,例如:

define(["app"], function(App){
    [...]
});

...并且命名空间需要我所有模块使用的库,例如:

define(["jquery", "underscore", "backbone"], function($, _, Backbone){
    [...]
});

...然后我的所有模块都可以访问命名空间所需的库,即我可以使用$_Backbone.

我喜欢这种行为,因为我可以避免重复,但我怀疑我在作弊,并且我应该在每个模块中都需要库。

任何人都可以让我直接在这里吗?

4

2 回答 2

2

是的,这有点骇人听闻。您只能访问 jQuery、下划线和主干,因为它们也被定义在全局范围内。Backbone 和 undersocre 不是真正的 AMD 模块,它们必须使用 shim 配置。jQuery 在全局范围内声明自己并作为 AMD 模块,因此它可以在任何地方工作。

所以,是的,它就是这样工作的,但它不是最佳的。真正的 AMD 模块(非垫片)不会以这种方式工作,因为它们需要在定义函数参数中传递,并且您将无法仅拉出一个模块以在单独的环境中对其进行测试,等等。这种方式,您不能加载不同版本的脚本来处理不同的模块/应用程序部分/页面。

AMD 的目标是为您的代码带来模块化,因此每个模块都声明它自己的依赖项,并且将在不依赖全局范围的情况下开箱即用(这是防止名称冲突和与第三方/其他开发人员冲突的一件好事从事同一个项目)。

如果您发现每次都重新声明基本依赖项是多余的,请创建一个样板文件,您只需在创建另一个模块时复制/粘贴该文件(总比没有好)。而且,也许一些命令行工具可以为您构建 AMD 模块包装器。

太好了,是的,它可以工作,但是如果您的项目变得更大或需要逐个更新,它将无法扩展。

希望这有帮助!

于 2012-09-26T02:11:26.793 回答
0

上述答案的好消息:下划线 1.6.0 现在被包装为 amd 模块:)

请参阅“lib.chartjs”以在未包装的“垫片”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"},
    }
});
于 2014-02-20T17:06:33.637 回答