4

我正在使用 requireJS 构建一个网站。

这是我第一次使用 requireJS。

我用 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 作为脚本标签,并在每个可能的对象中保存引用它们。我知道它会污染全局命名空间,但这不是很合理吗?

任何建议。

干杯,

4

4 回答 4

2

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

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

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

    return Geo;
});

此外,在生产中,因为我们有时会使用很多依赖项,所以我们这样做:每次require在依赖项中列出然后显式分配 var,因为某些依赖项不支持 AMD 并且不会返回您期望的结果:

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

    /* code */
    return;
});
于 2012-07-15T05:31:27.480 回答
0

我认为你的理解是正确的,因为jQuery无处不在,将index.html页面作为全局引用完全在我的项目中,我这样做了。

于 2012-07-15T03:24:56.957 回答
0

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

于 2012-07-15T04:06:22.510 回答
0

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

您不能依赖公共库的存在。将模块包装在 requirejs shell 中可以保证库的依赖项将存在。而且它有点快:) http://jsperf.com/requirejs-include-faster(嗯。显然除了ie ..去图)

此外,除非您实际使用 jquery,否则您不必要求它。为什么要在骨干模型中使用?即使在视图中,您也可以使用 this.$el 来返回一个 jquery 对象以进行搜索 - this.$el.find('.someclass')

于 2012-07-15T05:13:46.740 回答