【问题标题】:requireJS with Backbone dependencies具有 Backbone 依赖项的 requireJS
【发布时间】:2012-07-15 01:28:39
【问题描述】:

我正在使用 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/backbone,这个项目和模型将永远无法运行。

所以为什么不将 jquery 和主干添加到 index.html 作为脚本标签,并在每个可能的对象中保存引用它们。我知道它会污染全局命名空间,但这不是很合理吗?

任何建议。

干杯,

【问题讨论】:

    标签: jquery backbone.js requirejs


    【解决方案1】:

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

    此外,在您的示例中,您不需要在回调 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;
    });
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          如果您创建模块 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')

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-18
            • 1970-01-01
            • 2015-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多