2012-09-21 26 views
4

我有一個require.config在我的主要像下面。如果我們已經在config中定義了一些映射,如何使用requireJS優化項目?

require.config({
的baseUrl: '腳本/',

paths:{ 
     jquery:'shell/lib/jquery/jquery-1.7.1' 
    // many libraries and modules are aliased here 

}, 
map:{ 
    '*':{ 
     'underscore':'shell/lib/underscore/underscore' 
      // a few other modules are mapped here 
    } 
}  

});

我這樣做是因爲映射中定義的文件正在使用內部依賴關係(在它們各自的文件夾中)使用相對路徑。 現在當我運行優化器時,路徑中定義的模塊被保存爲模塊ID,如jquery保存爲jquery而map中的模塊獲得完整路徑,如'underscore'爲'shell/lib/underscore/underscore',而不是「下劃線」。

這是導致問題,因爲我在其他模塊中也使用'underscore',那裏的優化文件是'underscore'而不是'shell/lib/underscore/underscore'。

當我們給地圖配置或缺少某些東西時,有沒有一些特定的方法來優化?請告訴我如何解決它。

感謝

+0

這不是很清楚你爲什麼要把Underscore放到地圖中。當應用中的不同模塊取決於不同版本的Underscore時,地圖很有用。如果您的所有應用都依賴於Underscore的一個版本,請將其輸入路徑。請在評論中澄清,我會盡力幫助你。 – Eye

+0

該下劃線是一個寫在下劃線庫上的包裝器.js文件,它表示require [(「。/underscore-1.3.3「)......這樣做是因爲一個團隊測試並定義了要使用哪些開源庫以及其他團隊使用它們。這樣的實現也被用於編寫像動畫這樣的開源庫的自定義擴展.js。提前致謝。 –

回答

1

我不知道要理解這個問題:

這是因爲我在其他模塊中使用「下劃線」也引起問題,有優化的文件是有「底線」而不是'shell/lib/underscore/underscore'。

這似乎是預期的行爲,您將underscore映射到所有模塊的該路徑。所以基本上你要告訴r.js:每次你發現underscore依賴項重寫它到shell/lib/underscore/underscore。如果您的模塊使用「內部通道」和你想要做的做相反的(讓他們參考underscore),你需要做相反的映射:

'some/path/underscore': 'underscore' 

在所有的模塊將指向相同的話下劃線模塊。即使那些使用一些奇怪的路徑進行下劃線。

在極端的情況下,您需要控制如何在磁盤上寫入模塊r.js。您可以使用onBuildWrite屬性(請參閱https://github.com/jrburke/r.js/blob/master/build/example.build.js#L517)。

例如:

onBuildWrite: function (moduleName, path, contents) { 
    if (path === './src/somefile.js') { 
      return contents.replace(/^define\('src\/underscore'/, "define('underscore'"); 
    } else { 
      return contents; 
    } 
} 

這個例子是一個「黑客」,告訴給r.js:當您處理somefile.js,與underscore替換src/underscore(恰好能滿足您的地圖做什麼......但僅僅是告訴你如何使用onBuildWrite來做討厭的事情)。

相關問題