模組化之AMD、CMD、UMD、commonJS

wade3po發表於2019-04-30

做後臺的對模組化的思想很清晰,都是類、繼承什麼的,而JavaScript早期開始就沒有包、類模組的概念,甚至只有函式作用域。

我理解的模組就是實現特定功能的檔案或者程式碼,模組化就是隔離、組織這些複雜功能程式碼。模組可以讓我們更方便的載入不同的功能。

現在還有什麼元件化、外掛化,我覺得都是模組化思想。比如登入是模組、搜尋是模組、訂單是模組,UI庫的吐司是元件、select是元件、pick是元件,jq的時間外掛、視屏外掛。這三者具體怎麼區分還真不知道怎麼去描述,但是我覺得思想都是一樣的。

模組化的優點:

避免變數汙染、命名衝突

提高程式碼複用率

提高可維護性

方便依賴管理

這些優點應該是不需要解釋吧,一看就能知道了。

早之前JavaScript的模組化有以下幾種:

函式:每一個函式就是一個模組

物件:一個模組就是一個物件,有屬性有方法

立即執行函式:跟函式原理一樣

而模組化有一個重點就是規範,不能各自寫各自的,需要統一使用一個規範,現在主流的幾個模組化規範:commonJS、AMD、CMD、UMD

CommonJS:

這應該是最早的JavaScript模組化程式設計,主要是用於服務端,nodeJS就是使用commonJS,我們最常用的webpack也是使用commonJS。CommonJS規範中一個檔案就是一個模組,通過exports暴露模組內的內容,通過require載入模組使用,且commonJS是同步的,因為在服務端檔案就在本地,可以不用考慮非同步。

AMD(Asynchronous Module Definition):

CommonJS出來之後,由於是同步,瀏覽器並不適合,我們不可能等所有都載入完成才顯示頁面。於是AMD規範就出來了。AMD是requireJS推廣過程的規範產出,支援非同步,所以AMD也是通過require載入模組目前主要有兩個Javascript庫實現了AMD規範:require.js和curl.js。

CMD(Cmomon Module Definition):

CMD是大神玉伯提出的,然後根據這個規範寫了個seaJS。因為AMD想相容瀏覽器和後臺,所以大神就搞了個專注於瀏覽器的CMD。要說requireJS和seaJS最大的區別就是載入的機制:

SeaJS只會在真正需要使用(依賴)模組時才執行該模組

RequireJS會先儘早地執行(依賴)模組, 相當於所有的require都被提前了

UMD(Universal Module Definition):

通用模組定義,相容AMD和commonJS的規範,也就是AMD和commonJS的一個糅合。AMD非同步載入,commonJS同步載入,而UMD就是判斷環境,有nodejs模組(require)就使用commonJS,有AMD模組(define)就使用AMD。

ES6:

ES6提供了模組化export和import的實現。可以說ES6模組化的實現是替代UMD,伺服器和瀏覽器都會實現ES6的模組化。

最後總結一下:

CommonJS:同步載入,適用於伺服器,node、webpack使用;

AMD:非同步載入,瀏覽器使用,實現的requireJS想相容伺服器和瀏覽器,預載入。

CMD:非同步載入,專注於瀏覽器,實現的是seaJS,玉伯大神提出的,使用時載入。

UMD:AMD和commonJS的結合,可以服務端使用也可以瀏覽器使用。

ES6:語言標準的模組化,取代UMD,伺服器和瀏覽器都能使用。

只是分享一下這幾個規範的大致理解,至於requireJS、seaJS怎麼使用,就自行查詢資料。

Coding 個人筆記

模組化之AMD、CMD、UMD、commonJS

相關文章