我 正在 尝试 加载 Backbone.js 和 下划线使用 最 新 版本 的 Backbone 和 Underscore , 这 看 起来 有点 棘手 。 首先 , Underscore 会 自动 将 自己 注册 为 一 个 模块 ,但是 Backbone 假设 Underscore 是 全局 可用 的 。 我 还 应该 注意 到 Backbone 似乎 没有 将 自己 注册 为 一 个 模块 , 这 使得 它 与 其他 库 不 一致 。这 是 我 能 想到 的 最 好 的 main.js :
require(
{
paths: {
'backbone': 'libs/backbone/backbone-require',
'templates': '../templates'
}
},
[
// jQuery registers itself as a module.
'http://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js',
// Underscore registers itself as a module.
'http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.2.1/underscore-min.js'
], function() {
// These nested require() calls are just due to how Backbone is built. Underscore basically says if require()
// is available then it will automatically register an "underscore" module, but it won't register underscore
// as a global "_". However, Backbone expects Underscore to be a global variable. To make this work, we require
// the Underscore module after it's been defined from within Underscore and set it as a global variable for
// Backbone's sake. Hopefully Backbone will soon be able to use the Underscore module directly instead of
// assuming it's global.
require(['underscore'], function(_) {
window._ = _;
});
require([
'order!http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.5.3/backbone-min.js',
'order!app'
], function(a, app) {
app.initialize();
})
});
中 的 每 一 个
我 应该 提到 的 是 , 当 它 工作 时 , 优化 器 会 阻塞 它 。
Tracing dependencies for: main
js: "/home/httpd/aahardy/requirejs/r.js", line 7619: exception from uncaught JavaScript throw: Error: Error: Error evaluating module "undefined" at location "/home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js":
JavaException: java.io.FileNotFoundException: /home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js (No such file or directory)
fileName:/home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js
lineNumber: undefined
http://requirejs.org/docs/errors.html#defineerror
In module tree:
main
格式
有 没有 更 好 的 处理 方法 ? 谢谢 !
6条答案
按热度按时间2eafrhcq1#
更新:自版本1.3.0起,Underscore删除了AMD(RequireJS)支持。
您可以使用amdjs/Backbone 0.9.1和amdjs/Underscore 1.3.1 fork以及James Burke(RequireJS的维护者)提供的AMD支持。
关于AMD support for Underscore and Backbone的更多信息。
模块已正确注册,不需要订单插件:
下划线实际上是可选的,因为Backbone现在可以自己获取其依赖项:
如果有一些AMD sugar,您也可以这样写:
关于优化程序错误:仔细检查你的构建配置。我假设你的路径配置是关闭的。如果你有一个类似于RequireJS Docs的目录设置,你可以用途:
xhv8bpkk2#
作为参考,从1.1.1版(~ 2013年2月)开始,Backbone也是registers itself as an AMD module。它可以和requirejs一起工作,而不需要使用它的shim配置。(James Burke's amdjs fork也从1.1.0版开始没有更新过)
ruoxqz4g3#
好消息,下划线1.6.0现在支持requirejs define!!!
低于此的版本需要填充程序,或者需要underscore.js,然后盲目地希望“_”全局变量没有; t been stashed(公平地说,这是一个公平的赌注)
只需通过以下方式将其加载
juud5qan4#
我会直接写下来,你可以在www.example.com上阅读说明requirejs.org,你可以把下面的代码作为日常使用的一个片段;(我用约曼)(因为很多东西都更新了,我在2014年2月发布了这个。)
确保在index.html中包含脚本
然后,在main.js中
app.js
我希望我有用!
gv8xihay5#
djp7away6#
RequireJS 2.X现在使用新的
shim
配置,更好地有机地处理非AMD模块,如Backbone和Underscore。shim
配置易于用途:(1)一国的依赖关系(deps
),如果有的话,(其可以来自paths
配置,或者其本身可以是有效路径)。(下)(可选)指定正在填充的文件中的全局变量名,该文件应导出到需要它的模块函数中。(如果不指定导出,则只需要使用global,因为没有任何内容会被传递到require/define函数中。)下面是一个简单的例子,使用
shim
加载Backbone。它还为下划线添加了一个导出,尽管它没有任何依赖项。我个人认为,通过内置的
shim
功能,不使用分叉版本的Backbone & Underscore的优势超过了使用另一个流行答案中推荐的AMD分叉的优势,但无论哪种方式都有效。