我在http://kilon.org/blog/2012/08/build-backbone-apps-using-requirejs/关注Uzi Kilon的BackboneJS / RequireJS / backbone.LocalStorage示例。
当我git clone https://github.com/uzikilon/Todos
它工作得很好 - 但它使用旧版本的backbone.localstorage。但是,如果我用新版本lib/backbone.localStorage
替换http://cdnjs.cloudflare.com/ajax/libs/backbone-localstorage.js/1.1.0/backbone.localStorage-min
,那么我在这里得到“未捕获的TypeError:undefined不是函数”:https://github.com/uzikilon/Todos/blob/master/js/models/Todo.js#L3 - 为什么?我认为这与http://requirejs.org/docs/api.html#config-shim中的棘手细节有关,或者可能与http://blog.mostlystatic.com/2013/01/backbone-localstorage-uncaught.html有关。
require.config({
baseUrl: "./js/",
paths: {
jquery: 'lib/jquery-1.8.2',
underscore: 'lib/underscore-1.4.2',
backbone: 'lib/backbone-0.9.2',
// 'backbone.localStorage': 'lib/backbone.localStorage'
'backbone.localStorage': 'http://cdnjs.cloudflare.com/ajax/libs/backbone-localstorage.js/1.1.0/backbone.localStorage-min'
},
shim: {
underscore: {
exports: "_"
},
backbone: {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
},
'backbone.localStorage': {
deps: ['backbone'],
exports: 'Backbone'
}
}
});
答案 0 :(得分:9)
问题在于最新的Backbone localStorage是AMD兼容的,因为该示例中的版本不是,因此是shim配置。
修复
删除backbone.localStorage的shim
配置,您将不需要它:
'backbone.localStorage': {
deps: ['backbone'],
exports: 'Backbone'
}
然后,在Todo.js
中更改定义调用:
define(['underscore', 'backbone.localStorage'], function(_, Backbone) {
为:
define(['underscore', 'backbone', 'backbone.localStorage'], function(_, Backbone) {
<强>为什么吗
垫片exports
配置被用来说'当我要求backbone.localStorage时,请给我Backbone'。
这允许'backbone.localStorage'在Todo模块中简单地用作Backbone。
但现在backbone.localStorage
支持AMD并显式返回define
调用中的值。所以Todo.js中Backbone
的值不再是Backbone库,而是Backbone.LocalStorage
的构造函数
据我了解,AMD模块会忽略shim
配置,或者至少不应该使用它:
仅使用其他“shim”模块作为shimmed脚本的依赖项,或者 没有依赖关系的AMD库,并在它们之后调用define() 也创建一个全局(如jQuery或lodash)。否则,如果您使用 在构建之后,AMD模块作为shim配置模块的依赖项, 直到调整后的代码之后才能评估AMD模块 构建执行,并将发生错误。最终解决方案是 将所有已调整的代码升级为可选的AMD define()调用。
为了解决问题,需要在Todo.js中添加额外的依赖项,以便回调参数匹配。
希望这是有道理的。