CommonJS規範、AMD規範和CMD規範的區別

首先,CommonJS規範的特點:

  • 對於基本數據類型,屬於複製。即會被模塊緩存。同時,在另一個模塊可以對該模塊輸出的變量重新賦值。
  • 對於複雜數據類型,屬於淺拷貝。由於兩個模塊引用的對象指向同一個內存空間,因此對該模塊的值做修改時會影響另一個模塊。
  • 當使用require命令加載某個模塊時,就會運行整個模塊的代碼。
  • 當使用require命令加載同一個模塊時,不會再執行該模塊,而是取到緩存之中的值。也就是說,CommonJS模塊無論加載多少次,都只會在第一次加載時運行一次,以後再加載,就返回第一次運行的結果,除非手動清除系統緩存。
  • 循環加載時,屬於加載時執行。即腳本代碼在require的時候,就會全部執行。一旦出現某個模塊被"循環加載",就只輸出已經執行的部分,還未執行的部分不會輸出。

一,CommonJS與AMD:

CommonJS規範加載模塊是同步的,也就是說,只有加載完成,才能執行後面的操作。

AMD規範則是非同步加載模塊,允許指定回調函數。

由於Node.js主要用於服務器編程,模塊文件一般都已經存在於本地硬盤,所以加載起來比較快,不用考慮非同步加載的方式,所以CommonJS規範比較適用。但是,如果是瀏覽器環境,要從服務器端加載模塊,這時就必須採用非同步模式,因此瀏覽器端一般採用AMD規範。

 

二,CMD和AMD:

1.對於依賴的模塊AMD是提前執行,CMD是延遲執行。不過RequireJS從2.0開始,也改成可以延遲執行(根據寫法不同,處理方式不通過)。

2.AMD推崇依賴前置(在定義模塊的時候就要聲明其依賴的模塊),CMD推崇依賴就近(只有在用到某個模塊的時候再去require——按需加載)。

3.AMD的api默認是一個當多個用,CMD嚴格的區分推崇職責單一。例如:AMD裏require分全局的和局部的。CMD裏面沒有全局的 require,提供 seajs.use()來實現模塊系統的加載啓動。CMD裏每個API都簡單純粹。

 

三,拓展閱讀:

AMD 是 RequireJS 在推廣過程中對模塊定義的規範化產出,CMD是SeaJS 在推廣過程中被廣泛認知。RequireJs出自dojo加載器的作者James Burke,SeaJs出自國內前端大師玉伯。二者的區別,玉伯在12年如是說

RequireJS 和 SeaJS 都是很不錯的模塊加載器,兩者區別如下:

1. 兩者定位有差異。RequireJS 想成爲瀏覽器端的模塊加載器,同時也想成爲 Rhino / Node 等環境的模塊加載器。SeaJS 則專注於 Web 瀏覽器端,同時通過 Node 擴展的方式可以很方便跑在 Node 服務器端

2. 兩者遵循的標準有差異。RequireJS 遵循的是 AMD(異步模塊定義)規範,SeaJS 遵循的是 CMD (通用模塊定義)規範。規範的不同,導致了兩者API 的不同。SeaJS 更簡潔優雅,更貼近 CommonJS Modules/1.1 和 Node Modules 規範。

3. 兩者社區理念有差異。RequireJS 在嘗試讓第三方類庫修改自身來支持 RequireJS,目前只有少數社區採納。SeaJS 不強推,而採用自主封裝的方式來“海納百川”,目前已有較成熟的封裝策略。

4. 兩者代碼質量有差異。RequireJS 是沒有明顯的 bug,SeaJS 是明顯沒有 bug。

5. 兩者對調試等的支持有差異。SeaJS 通過插件,可以實現 Fiddler 中自動映射的功能,還可以實現自動 combo 等功能,非常方便便捷。RequireJS無這方面的支持。

6. 兩者的插件機制有差異。RequireJS 採取的是在源碼中預留接口的形式,源碼中留有爲插件而寫的代碼。SeaJS 採取的插件機制則與 Node 的方式一致開放自身,讓插件開發者可直接訪問或修改,從而非常靈活,可以實現各種類型的插件。

優點: 同樣實現了瀏覽器端的模塊化加載。 可以按需加載,依賴就近。

缺點: 依賴SPM打包,模塊的加載邏輯偏重。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章