2013-01-31 209 views
0

TL;問題底部的DR,用於那些不想閱讀我所有垃圾的人。將代碼轉換爲RequireJS

我目前的JavaScript模塊化方法是簡單地創建一個全局錨,比如「csc」(我的公司首字母縮寫詞),然後開始將模塊添加到該錨上。

所以我會擁有一個全球性的結構,如:

csc. 
    Utils 
    Map 
     .Geolocation 
    Storage. 
      Cookie 
      DB 

而且每個文件都存儲在目錄結構:

csc.js 
csc.Utils.js 
csc.Map.js 
csc.Storage.js 

這樣就無需加載我的整個代碼庫。

我試圖轉向使用RequireJS,但該庫使用的方法似乎有點不同。爲了保持我的命名空間結構,我可以在我的所有模塊中定義模塊,但仍然將它們粘貼到全局「csc」引用中。然而這似乎違背了Require的核心原則。

沒有讓他們全球性的,但是,我失去了我很好的命名空間,如「csc.Map.Geolocation」因爲我現在有一堆獨立的變量,就像這樣:

require(['csc', 'csc.Utils', 'csc.Map'], function (csc, utils, map) { 
}); 

我脫光我的問題到本質,萬一我可怕的以上描述並不足以:

有沒有一種方法,也許是模塊定義中,這三個變量恢復合併到在這個問題上所定義的結構?或者,我是否全力以赴,我是否應該堅持要求做事的方式? 我很喜歡遵循Require方法,但我也很喜歡將所有模塊鏈接起來並命名空間的能力。

+1

AMD的主要優勢之一是失去對命名空間的依賴。嘗試擁抱它。沒有技術理由繼續使用它們。 –

回答

1

不要因爲文檔的示例路徑層次結構而感到灰心,請注意,require並不嚴格執行任何特定的約定。您可以自由設計並遵循您自己的慣例。

UtilsMapStorage全部成爲目錄。他們執行基本動作應該被命名爲在其各自的目錄module.js,就像這樣:

core.js 
Utils/ 
     module.js 
Map/ 
    module.js 
    geolocation.module.js 
Storage/ 
     module.js 
     cookie.module.js 
     db.module.js 

module.js文件包含並返回自己的孩子。下面是存儲/ module.js的一個示例:

require(["Storage/cookie", "Storage/db"], function (cookie, db) { 
    var Storage = {}; 
    // do whatever you need with Storage 
    Storage.cookie = cookie 
    Storage.db = db 

    return Storage 
}); 

還要注意core.js文件中根。該文件將工作完全一樣,

require(["Utils/module", "Storage/module", "Map/module"], function (utils, storage, map) { 
    var Core = {}; 
    // do whatever you need with Storage 
    Core.Utils = utils 
    Core.Storage = storage 
    Core.Map = map 

    return Core 
}); 

現在,需要core.js無論你將需要訪問這些模塊(每個文件基本)。是的,這將加載開發的所有相關文件,但是當您編譯應用程序時,所有變量都將在匿名函數的範圍內,並且不能通過窗口對象直接訪問。

再一次,按照你認爲合適的方式調整它,這是你自己的慣例。