如何正确配置RequireJS Shim

时间:2013-11-06 17:09:15

标签: javascript backbone.js requirejs

我有一个问题让我感到困惑,因为我最初认为我理解了这个问题。 RequireJS的配置部分。使用下面的代码,我定义了一个名为' app'这也恰好是根目录中另一个脚本/对象的名称:

requirejs.config({
    baseUrl: 'scripts',

    shim: {
        'vendor/jquery-2.0.3.min': {
            exports: '$'
        },
        'vendor/underscore-min': {
            exports: '_'
        },
        'vendor/backbone': {
            deps: ['vendor/underscore-min'],
            exports: 'Backbone'
        },
        'library/marionette/backbone.marionette': {
            deps: ['vendor/backbone'],
            exports: 'Marionette'
        },
        'library/backbone.stickit' : {
            deps: ['vendor/backbone'] 
        },
        'library/backbone.subroute' : {
            deps: ['vendor/backbone'],
            exports: 'Backbone.SubRoute'
        },
        'app': {
            deps: [
              'vendor/jquery-2.0.3.min', 
              'vendor/underscore-min', 
              'vendor/backbone',
              'library/backbone.stickit',
              'library/backbone.subroute',
              'library/marionette/backbone.marionette'
            ]
        }
    }
});

如果我在以下之后立即定义方法:

require(['app'], function (app) { 
    app.expose('vent', _.extend({}, Backbone.Events));

    app.initialize(function () {    
      this.vent.trigger('initialized');
    });
});

我可以使用Backbone而无需明确地将其引入。为什么会这样?是因为我需要([' app']"紧接在同一个文件中?

我创造的这个混乱的另一个方面是我带来的任何其他资源:

require(['app', 'routers/main'], function (app, MainRouter) { 
    app.expose('vent', _.extend({}, Backbone.Events));

    app.initialize(function () {    
      new MainRouter();

      this.vent.trigger('initialized');
    });
});

抱怨主干未定义'。因此我可以从我定义应用程序的地方神奇地使用它,但除此之外它不是。我觉得我在这里从根本上误解了一些东西 - 请有人能让我直截了当吗?

1 个答案:

答案 0 :(得分:1)

这看起来不对:

    'app': {
        deps: [
          'vendor/jquery-2.0.3.min', 
          'vendor/underscore-min', 
          'vendor/backbone',
          'library/backbone.stickit',
          'library/backbone.subroute',
          'library/marionette/backbone.marionette'
        ]
    }

'app'不支持AMD(它不使用define(...)),在这种情况下,您需要exports值,以便RequireJS知道'app'导出的内容,或 支持AMD(定义{{​​1}}次调用的文件('app'),在这种情况下,您不需要垫片。

没有define(...)值的垫片仅适用于某些特殊情况。例如插入其他东西的插件。 (即便如此,由于某些IE限制,文档会说您应该使用exports:请参阅"Note however if you want to get 404 load detection in IE..."。)

(另外,这可能不会解决您的问题,但jQuery 1.9.1不需要垫片,所以我怀疑jQuery 2.x需要一个。)