2012-09-20 57 views
3

如果我有需要的应用程序命名空间的模块,如:做RequireJS模块“继承”依赖关系吗?

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

...和命名空间要求所有的我的模块使用的库,例如:

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

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

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

任何人都可以在这里设置我吗?

回答

2

是的,这是有点hacky。您只能访问jQuery,下划线和主干,因为它们也被定义在全局范围内。主干和底层不是真正的AMD模块,他们必须使用Shim配置。 jQuery在全球范围内宣布自己,并作为一个AMD模块,因此它可以在任何地方工作。

所以,它是这样工作的,但它不是最优的。真正的AMD模块(非Shimmed)将不会以这种方式工作,因为它们需要在定义函数参数中传递,并且您将无法只在一个单独的环境中只抽取一个模块进行测试等。这样,您无法加载不同版本的脚本以使用不同的模块/应用程序部分/页面。

AMD的目标是为您的代码带来模块化,以便每个模块都声明自己的依赖关系,并且可以在不依赖全局范围的情况下开箱即用(这是防止名称冲突和与第三方冲突的好方法派对/其他开发人员在同一个项目上工作)。

如果您发现每次重新声明基础依赖关系都是重复声明,请创建一个样板文件,在创建另一个模块(比没有任何事情更好)时只需复制/粘贴该文件。而且,也许一些命令行工具可以为你构建AMD模块封装。

Soooo,它可以工作,但如果您的项目变得更大或需要逐件更新,它不会扩展。

希望得到这个帮助!

0

了以上回答好消息:强调1.6.0现在被包装为AMD模块:)

看到在不裹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"}, 
    } 
});