0

我有一个问题让我很困惑,因为我最初认为我理解了 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');
    });
});

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

4

1 回答 1

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 感知的(定义'app'调用 ( define(...)) 的文件,在这种情况下您不需要垫片。

仅在某些特殊情况下,使用没有值的 shimexports是正确的。例如与其他东西挂钩的插件。exports(即便如此,由于某些 IE 限制,文档说您应该使用:请参阅“但是,如果您想在 IE 中获得 404 负载检测......”。)

(此外,这可能无法解决您的问题,但 jQuery 1.9.1 不需要 shim,所以我怀疑 jQuery 2.x 需要一个。)

于 2013-11-06T18:49:43.410 回答