骨干使jquery和下划线在任何地方都可以使用,而无需调用它们

时间:2016-03-15 08:32:56

标签: backbone.js requirejs

我定义了这样的东西:

require.config({
    shim: {
        underscore: {
            exports: '_'
        },
        backbone: {
            deps: [
                'underscore',
                'jquery'
            ],
            exports: 'Backbone'
        },      
    },

    paths: {
        jquery: 'libs/external/jquery',
        underscore:'libs/external/underscore',
        backbone: 'libs/external/backbone',
        text: 'libs/external/text',
        router: ''
    }
});

然后在我的观点中,我每次都需要jquery和下划线,这很烦人:

define('myview',[
    'jquery',
    'backbone',
    'underscore',
    'somemodule'
    ], function($, backbone, underscore) {

我知道有一种方法可以定义一些库,可以称为跨视图/模型/集合等等,而不需要它们,但我不记得正确的实现。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

它们已经可以在不定义它们的情况下使用。

  1. jQuery已将自身导出为全局变量

    来自http://requirejs.org/docs/jquery.html

      

    jQuery将自己注册为全局变量" $"和" jQuery",即使它检测到AMD / RequireJS。 AMD方法建议不要使用全局函数,但是关闭这些jQuery全局变量的决定取决于你是否拥有依赖于它们的非AMD代码。 jQuery有一个noConflict函数,支持释放对全局变量的控制,这可以在requirejs.config中自动执行

    因此,除非您定义noConflict,否则您可以访问$jQuery,因为它们已附加到window对象

  2. Backbone和Underscore也可用作全局变量,因为它们是在shim配置中导出的。
    请参阅http://requirejs.org/docs/api.html#config-shimRequireJS - What is the purpose of the "exports" property in shim

  3. 因此,以下代码应该可以正常工作

    define(['myview'], function(MyView) {
        console.log($); // window.$
        console.log(Backbone); // window.Backbone
        console.log(_); // window._
    }