2013-08-25 16 views
5

我使用r.js優化程序根據構建配置文件合併js文件,如documentation中的建議。這是我的集結config.js如何使用r.js從構建中排除urlArgs

({ 
    baseUrl: ".", 
    paths: { 
     jquery: '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min', 
    }, 
    name: "main", 
    out: "main-built.2013-07-30.js" 
}) 

正如你可以看到它是基於main.js文件,這裏是它的代碼:

requirejs.config({ 
    baseUrl: 'scripts', 
    urlArgs: "bust=" + (new Date()).getTime(), 
    paths: { 
     jquery: [ 
      '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min', 
      'lib/jquery-1.9.1.min', 
     ], 
    }, 
}); 

require([ 
    'layout', 
    'cue', 
], function() { 

}); 

如果我在保持urlArgs: "bust=" + (new Date()).getTime() main.js所有外部文件(這裏是從CDN加載的jquery)看起來像.../jquery.js?bust=1377412213

因此它是PITA評論每當我做一個構建時,都會把這行刪除。我已經閱讀了所有的文檔並通過Google搜索解決方案,但一切都徒勞無功。也許我做錯了?

回答

1

以下解決方案將工作你的情況,你會重命名main.js文件中的r.js建設:

urlArgs: require.specified('main') ? "bust="+(new Date()).getTime() : null 

上面的代碼將檢查命名爲「主」的模塊,這將在開發中相匹配,但不在生產中,其中模塊被命名爲「main-built.2013-07-30」。

我已經在開發和生產構建測試,它的工作原理! :-)

在require.specified()函數: With requirejs is it possible to check if a module is defined without attempting to load it?

+1

是的,這是有效的。 2年後:) – dVaffection

2

對此方晚了,但在這裏我使用的解決方案:追加urlArgs參數與配置與隨後的調用。

HTML:

<script src="js/libs/require.js"></script> 
<script src="js/config.js"></script> 
<script>require(['main-app']);</script> 

配置文件:

requirejs.config({ 
    paths: {...}, 
    shim: {...} 
});  

// Apply the cache bust only for the browser. 
if (window) { 
    requirejs.config({ 
    urlArgs: REQUIRE_NOCACHE ? "bust="+(new Date()).getTime() : null 
    }); 
} 

優化只需要第一requirejs.config聲明,它忽略了後面的代碼。第二個requirejs.config聲明擴展而不是覆蓋第一個,因此urlArgs仍然被成功應用於瀏覽器中的模塊。希望有所幫助。

+0

什麼是* REQUIRE_NOCACHE *? – dVaffection

+0

'REQUIRE_NOCACHE'只是我在開發環境中聲明的全局布爾變量。當它存在時,它確保在頁面刷新時緩存被中斷。 – Jes

+0

你如何組織你的開發和產品環境? – dVaffection

相關問題