2013-02-25 50 views
3

我有以下main.jsRequireJS忽略了一些路徑

requirejs.config({ 
    paths: { 
     'backbone': 'backbone-min', 
     'underscore': 'underscore-min', 
     'loader': 'loader-min' 
    } 
}) 

這種 '架min.js' 文件只是一個優化從loader.js JS:

define(['backbone', 'underscore'], function() { 
}) 

我的HTML頁面包含以下:

<script data-main="/js/main" src="/js/require.js"></script> 
<script type="text/javascript"> 
    requirejs(['loader'], function(loader) { 
     .... 
    }) 
</script> 

順便說一句,正如我從Fire看到的錯誤控制檯,只有以下網址瀏覽器負載:

GET /js/require.js 
GET /js/main.js 
GET /js/loader.js !!! Notice it's loader.js, not loader-min.js 
GET /js/backbone-min.js 
GET /js/underscore-min.js 

所以,這個問題對於模塊loader它會嘗試加載文件loader.js,而不是路徑在main.js配置。未縮小/優化文件,忽略requirejs.config值。

最奇怪的是,它仍然使用正確的值爲backboneunderscore。大多數情況下,但不是全部時間。有時它在加載時失敗/js/backbone.js

似乎RequireJS在main.js被完全加載並由瀏覽器解釋之前開始工作。它預期的行爲?或我的應用程序有問題?

如何確保requirejs(...)函數僅在處理完'main.js'後執行?

回答

5

您的main.js文件是異步加載的。然而,這個腳本標籤(下面)是連續分析的。所以沒有辦法預測執行順序(儘管下面的腳本很可能在異步調用返回之前執行)。

<script type="text/javascript"> 
    // require() and not requirejs() 
    require(['loader'], function(loader) { 
     .... 
    }) 
</script> 

你main.js的末尾添加需要調用的文件是這樣的:在執行任何要求或定義調用之前

require.config({ 
// configuration. 
}); 

require(['loader'], function(loader) { 
// callback 
}) 

這樣RequireJS總是「配置」。

編輯: 我做什麼通常是:

<script src="/js/require.js"></script> <!-- No data-main attribute --> 
<script src="/js/config.js"></script> <!-- Explicitly load configuration --> 

<script type="text/javascript"> 
    require.config({ 
     baseURL: "path/to/base" 
    }); 
    require(["module"], function(module){ 
     // code 
    }); 
</script> 

這樣,我在什麼加載其中明確控制。它也保持我的config.js文件乾燥。

我通常在我的引導程序HTML中設置baseURL,因爲這樣我可以對我的Jasmine測試套件使用相同的配置文件。

+1

如果我有其他模塊,uniq每頁和用戶類型,不僅'loader.js'。這是否意味着無法繼續將它們作爲單獨的腳本使用,我應該將它們全部放入一個巨大的main.js中? – 2013-02-25 11:27:58

+0

我的意思是,requirejs的主要目標是使它可以使用小模塊並只加載所需的代碼 – 2013-02-25 11:28:58

+0

我編輯了我的答案以回答上述兩個問題。希望這可以解決問題。 – 2013-02-25 11:44:16