我正在尝试使用 RequireJS 加载 Backbone 和 Underscore(以及 jQuery)。使用最新版本的 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
有没有更好的方法来处理这个?谢谢!
RequireJS 2.Xshim现在使用新配置 更好地有机地解决了非 AMD 模块,例如 Backbone 和 Underscore 。
shim
shim配置使用简单:(1)一个声明依赖项()deps,如果有的话,(可能来自paths配置,也可能是有效路径本身)。(2)(可选)从您正在填充的文件中指定全局变量名称,该名称应导出到需要它的模块函数。(如果你没有指定导出,那么你只需要使用全局,因为没有任何东西会传递到你的 require/define 函数中。)
deps
paths
这是shim加载 Backbone 的简单示例用法。它还为下划线添加了导出,即使它没有任何依赖项。
require.config({ shim: { underscore: { exports: '_' }, backbone: { deps: ["underscore", "jquery"], exports: "Backbone" } } }); //the "main" function to bootstrap your code require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone) { // or, you could use these deps in a separate module using define });
注意: 这个简化的代码假定 jquery、backbone 和 underscore 位于与这个“main”代码相同的目录中名为“jquery.js”、“backbone.js”和“underscore.js”的文件中(它成为 require 的 baseURL )。如果不是这种情况,您将需要使用路径配置。
我个人认为,对于内置shim功能,不使用分叉版本的 Backbone 和 Underscore 的优势超过了使用其他流行答案中推荐的 AMD 分叉的好处,但无论哪种方式都有效。