2012-07-15 111 views
4

我正在使用requireJS建立一个网站。requireJS与骨干依赖项

这是我第一次使用requireJS。

i相路径在main.js配置requireJS:

require.config({ 
    paths: { 
    'jquery': 'libs/jquery/1.7.2/jquery', 
    'underscore': 'libs/underscore/1.3.3-amdjs/underscore', // AMD support 
    'backbone': 'libs/backbone/0.9.2-amdjs/backbone', // AMD support 
    'marionette': 'libs/marionette/0.9.3-amd/backbone.marionette', // AMD support 
    'templates': '../templates' 
} 
}); 

,并在模型,视图集合我使用;

define([  
'jquery', 
'backbone' 
], function ($) { 
    var Geo = Backbone.Model.extend({}); 

    return Geo; 
}); 

什么是我不明白的是:为什么我必须保持定义的jQuery &骨干作为一个依赖。 我的意思是这个项目和模型将永远不会没有jQuery /主干运行。

那么为什么不加入jQuery和骨干到index.html作为脚本标签,并保存在每一个可能的对象引用它们。我知道它会污染全球命名空间,但这不合理吗?

任何建议appriciated。

欢呼声,

回答

2

@Guy,它是可选的定义它们,但是如果你想要保持一致,比你更好。这是Require.JS建议的体系结构。这并不意味着每次将它们定义为迭代时它都会尝试加载jQuery或Backbone。

另外,在您的示例中,您不需要在回调function()参数中使用$。 jQuery和$将已经在窗口中。

define([  
'jquery', 
'backbone' 
], function ($) { 
    var Geo = Backbone.Model.extend({}); 

    return Geo; 
}); 

此外,在生产,因为我们有时会用很大的依赖性,我们这样做是这样的:你每次在依赖列出require然后明确指定瓦尔时间,因为一些依赖没有AMD支持,做不归还你所期望的:

define([  
    'require' 
    'moduleA', 
    'moduleB' 
], function (require) { 
    var moduleA = require('moduleA'), 
     moduleB = require('moduleB'); 

    /* code */ 
    return; 
}); 
0

我觉得你的理解是正确的,因为jQuery是无处不在,将被用作index.html页面完全在我的项目,我这样做是在全球参考。

0

我觉得如果你使用r.js来优化你的项目是每一个js文件中添加RequireJS非常有用。

0

如果创建模块A和B,并希望它们拖放到另一个项目中,依赖被清楚地声明。如果另一个项目只使用没有jQuery的ExtJS?或者如果他们使用zepto而你特别需要jquery的库?简单地为jquery添加一个配置就足够了.jquery将在需要时加载。

你不能依靠公共库的存在。将模块包装在requirejs外壳中可以保证库的依赖关系存在。而且这是一个更快的:) http://jsperf.com/requirejs-include-faster(好吧,显然除了ie ..去图)

另外,除非你真的使用jQuery,你不应该要求它。你为什么要在骨干模型中使用?即使在视图中,你也可以使用这个。$ el,它给出一个jquery对象来追踪 - this。$ el.find('。someclass')