我有一个问题一直困扰着我,因为我最初以为我理解了RequireJS的“shim”配置部分。使用下面的代码,我定义了一个名为“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');
});
});我可以使用主干,而不必显式地引入它。为什么会这样呢?这是因为我“要求(‘应用程序’”后立即在同一个文件?)
我造成的混乱的另一个方面是,我带来的任何其他资源:
require(['app', 'routers/main'], function (app, MainRouter) {
app.expose('vent', _.extend({}, Backbone.Events));
app.initialize(function () {
new MainRouter();
this.vent.trigger('initialized');
});
});抱怨脊梁是“未定义的”。所以,从我定义应用程序的地方可以神奇地获得它,但除此之外,它不是。我觉得我从根本上误解了这件事--有人能帮我纠正一下吗?
发布于 2013-11-06 18:49:43
这看上去不对:
'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(...))的文件,在这种情况下,您不需要使用shim。
只有在某些特殊情况下,才能使用没有exports值的垫片。例如,连接到其他东西的插件。(即使如此,由于IE的一些限制,文档说您应该使用exports:参见“但是,如果您想在IE中获得404负载检测,请注意.”。)
(而且,这可能解决不了您的问题,但是jQuery 1.9.1不需要shim,所以我怀疑jQuery 2.x是否需要。)
https://stackoverflow.com/questions/19818289
复制相似问题