Require.js错误:模块的加载超时:backbone,jquerymobile

我正在尝试使用r.js来优化我的代码,但我一直运行到这个错误:

跟踪:init的依赖关系

Error: Load timeout for modules: backbone,jquerymobile 

我正在运行的命令是这样的:

 $ java -classpath /Users/dixond/build-tools/rhino1_7R4/js.jar:/Users/dixond/build-tools/closurecompiler/compiler.jar org.mozilla.javascript.tools.shell.Main /Users/dixond/build-tools/r.js/dist/r.js -o /Users/dixond/Sites/omm_mobile/js/build.js 

我的build.js文件如下所示:

 ( { //appDir: "some/path/", baseUrl : ".", mainConfigFile : 'init.js', paths : { jquery : 'libs/jquery-1.8.3.min', backbone : 'libs/backbone.0.9.9', underscore : 'libs/underscore-1.4.3', json2 : 'libs/json2', jquerymobile : 'libs/jquery.mobile-1.2.0.min' }, packages : [], shim : { jquery : { exports : 'jQuery' }, jquerymobile : { deps : ['jquery'], exports : 'jQuery.mobile' }, underscore : { exports : '_' }, backbone : { deps : ['jquerymobile', 'jquery', 'underscore'], exports : 'Backbone' } }, keepBuildDir : true, locale : "en-us", optimize : "closure", skipDirOptimize : false, generateSourceMaps : false, normalizeDirDefines : "skip", uglify : { toplevel : true, ascii_only : true, beautify : true, max_line_length : 1000, defines : { DEBUG : ['name', 'false'] }, no_mangle : true }, uglify2 : {}, closure : { CompilerOptions : {}, CompilationLevel : 'SIMPLE_OPTIMIZATIONS', loggingLevel : 'WARNING' }, cssImportIgnore : null, inlineText : true, useStrict : false, pragmas : { fooExclude : true }, pragmasOnSave : { //Just an example excludeCoffeeScript : true }, has : { 'function-bind' : true, 'string-trim' : false }, hasOnSave : { 'function-bind' : true, 'string-trim' : false }, //namespace: 'foo', skipPragmas : false, skipModuleInsertion : false, optimizeAllPluginResources : false, findNestedDependencies : false, removeCombined : false, name : "init", out : "main-built.js", wrap : { start : "(function() {", end : "}());" }, preserveLicenseComments : true, logLevel : 0, cjsTranslate : true, useSourceUrl : true }) 

而我的init.js看起来像这样:

  requirejs.config({ //libraries paths: { jquery: 'libs/jquery-1.8.3.min', backbone: 'libs/backbone.0.9.9', underscore: 'libs/underscore-1.4.3', json2 : 'libs/json2', jquerymobile: 'libs/jquery.mobile-1.2.0.min' }, //shimming enables loading non-AMD modules //define dependencies and an export object shim: { jquerymobile: { deps: ['jquery'], exports: 'jQuery.mobile' }, underscore: { exports: '_' }, backbone: { deps: ['jquerymobile', 'jquery', 'underscore', 'json2'], exports: 'Backbone' } } }); requirejs(["backbone",], function(Backbone) { //Execute code here }); 

我在这个构build过程中做了什么错误?

Require.js有一个叫做waitSeconds的configuration选项。 这可能有帮助。

RequireJS waitSeconds

这是一个使用waitSeconds的例子:

 requirejs.config({ baseUrl: "scripts", enforceDefine: true, urlArgs: "bust=" + (new Date()).getTime(), waitSeconds: 200, paths: { "jquery": "libs/jquery-1.8.3", "underscore": "libs/underscore", "backbone": "libs/backbone" }, shim: { "underscore": { deps: [], exports: "_" }, "backbone": { deps: ["jquery", "underscore"], exports: "Backbone" }, } }); define(["jquery", "underscore", "backbone"], function ($, _, Backbone) { console.log("Test output"); console.log("$: " + typeof $); console.log("_: " + typeof _); console.log("Backbone: " + typeof Backbone); } ); 

错误

我最近和使用requireJSangularJS项目有一个非常类似的问题。

我正在使用Chrome canary版本( Version 34.0.1801.0 canary ),但是也安装了稳定版本( Version 32.0.1700.77 ),显示在使用Developer console打开时加载应用程序时出现完全相同的问题:

 Uncaught Error: Load timeout for modules 

开发者控制台在这里是关键的,因为当控制台没有打开时我没有得到错误。 我试图重置所有的铬设置,卸载任何插件,…迄今没有任何帮助。

解决scheme

大指针是关于waitSecondsconfiguration选项的Google小组讨论(请参阅下面的资源)。 设置为0解决了我的问题。 我不会检查这个,因为这只是将超时设置为无限。 但是在开发过程中作为一个修补程序,这很好。 configuration示例 :

 <script src="scripts/require.js"></script> <script> require.config({ baseUrl: "/another/path", paths: { "some": "some/v1.0" }, waitSeconds: 0 }); require( ["some/module", "my/module", "a.js", "b.js"], function(someModule, myModule) { //This function will be called when all the dependencies //listed above are loaded. Note that this function could //be called before the page is loaded. //This callback is optional. } ); </script> 

这个错误最常见的其他原因是:

  • 模块中的错误
  • configuration错误的path(检查pathsbaseUrl选项)
  • 在configuration中双重input

更多资源

来自requireJS的故障排除页面: http: //requirejs.org/docs/errors.html#timeout第2,3和4点可能是有用的。

类似SO问题: 纹波 – 未捕获的错误:加载超时的模块:应用程序http://requirejs.org/docs/errors.html#timeout

相关的Google小组讨论: https : //groups.google.com/forum/#!topic/ requirejs/ 70HQXxNylYg

如果别人有这个问题,而且仍然在挣扎(像我一样),这个问题也可能由循环依赖造成,例如A依赖于B,而B依赖于A.

RequireJS文档没有提到循环依赖可能会导致“加载超时”错误,但我现在已经观察到了两种不同的循环依赖。

waitSeconds = 7的默认值(7秒)

如果设置为0,则完全禁用超时。

src: http : //requirejs.org/docs/api.html

这个问题的原因是Require.js运行到超时,因为项目可能依赖于大型库。 默认的超时时间是7秒。 增加此configuration选项(称为waitSeconds)的值当然可以解决这个问题,但这不是正确的方法。 正确的做法是提高页面加载时间 。 加速页面加载的最佳技术之一是缩小 – 压缩代码的过程。 有一些很好的工具可以像r.js或者webpack一样缩小 。

在Mobile Safari 6.0.0(iOS 6.1.4)上运行testing时,我只收到此错误。 waitSeconds: 0现在给了我一个成功的构build。 如果我的构build再次失败,我会更新