我有一个问题让我感到困惑,因为我最初认为我理解了这个问题。 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');
});
});
抱怨主干未定义'。因此我可以从我定义应用程序的地方神奇地使用它,但除此之外它不是。我觉得我在这里从根本上误解了一些东西 - 请有人能让我直截了当吗?
答案 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需要一个。)