2013-01-11 44 views
53

我試圖用r.js優化我的代碼,但我一直運行到這個錯誤:Require.js錯誤:模塊加載超時:骨幹,jquerymobile

跟蹤依賴關係:初始化

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 
}); 

那我在這個構建過程中做錯了什麼?

+0

我有同樣的問題,但只發生在鉻,在你的情況呢? –

回答

99

Require.js有一個叫做waitSeconds的配置選項。這可能有幫助。

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); 
    } 
); 
+1

謝謝!我有同樣的問題,但我不認爲這實際上是一個超時問題。它必須歸因於jQuery的大小或複雜性,因爲只有在jQuery上聲明瞭依賴關係時纔會發生錯誤。將'waitSeconds'更改爲更大的值可以使構建成功完成。 –

+1

我可以證實這一點。我們有一個更大的項目,有大型圖書館的一些依賴項。有了requireJS 2.0.6,那很好。 requireJS 2.1.4會進入超時狀態。 'waitSeconds'的更高值解決了它。 –

+0

剛剛打開了一個pull請求來更新require.js的build.js示例,以便人們更快地瞭解該參數。見https://github.com/jrburke/r.js/pull/362 –

37

的錯誤

我最近有一個非常類似的問題,使用requireJSangularJS項目。

我使用Chrome金絲雀版本(Version 34.0.1801.0 canary),而且還安裝了一個穩定的版本(Version 32.0.1700.77),顯示與Developer console打開裝載應用程序時完全一樣的問題:

Uncaught Error: Load timeout for modules 

開發者控制檯是關鍵這裏是,因爲當控制檯未打開時我沒有收到錯誤。我嘗試重置所有Chrome設置,卸載任何插件,...迄今沒有任何幫助。

解決方案

最大的指針是谷歌的小組討論(見下面的參考資料)關於waitSeconds配置選項。設置爲0解決了我的問題。我不會檢查這個,因爲這只是將超時設置爲無限。但作爲開發過程中的修復,這很好。 Example config

<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> 

最常見的其他原因導致此錯誤是:在模塊

  • 錯誤
  • 在配置錯誤的路徑(檢查pathsbaseUrl選項)在配置
  • 複式

更多資源

來自requireJS的故障排除頁面:http://requirejs.org/docs/errors.html#timeout第2,3和4點可能是有意義的。

類似SO問題:Ripple - Uncaught Error: Load timeout for modules: app http://requirejs.org/docs/errors.html#timeout

一個相關的谷歌組討論:https://groups.google.com/forum/#!topic/requirejs/70HQXxNylYg

+0

將超時設置爲無限很好,因爲它可以讓我們避免設置確切的超時限制。謝謝 – jsbisht

16

萬一別人有這個問題,它仍然掙扎(像我),也可以從循環依賴,如出現這個問題A取決於B,而B取決於A.

RequireJS docs沒有提到循環依賴會導致「加載超時」錯誤,但我現在已經觀察到它對於兩種不同的循環依賴。

+2

你是如何找出循環問題的?你是否必須瀏覽每個定義的模塊? –

+0

當我添加並更改了一些模塊時,出現了我的問題,所以我能夠通過這些更改,追蹤哪些添加的依賴項創建了循環依賴性循環,並將其刪除。 – Aaron

+1

[xrayquire](https:// github。com/requirejs/xrayquire)(requirejs工具)可以檢查循環依賴關係 – Druska

0

我只在Mobile Safari 6.0.0(iOS 6.1.4)上運行測試時出現此錯誤。現在,waitSeconds: 0已經給了我一個成功的構建。我會更新如果我的構建再次失敗

+0

這就是2連續! –

1

該問題的原因是Require.js運行到超時,因爲項目可能依賴於大型庫。默認的超時時間是7秒。增加此配置選項的值(稱爲waitSeconds)當然可以解決這個問題,但這不是正確的方法。 正確的做法是到提高頁面加載時間。加速頁面加載的最佳工藝之一是縮小 - 壓縮代碼的過程。有一些很好的縮小工具,如r.jswebpack