11.24 JS中AMD、CMD、CommonJS、ES6 Module的區別

第一輪面試官問我AMD和CMD的區別,我只回答說AMD是提前加載,CMD是按需加載。第二輪面試官又問了我CommonJS和ES6 Module的區別,emmm…,我大致回答說新的比舊的好~~,雖然面試官並沒有說什麼,不過顯然這樣的答案並不是有助於面試、有助於自己的技術積累的。

所以有必要進行一次梳理,以便更清晰地瞭解它們的特點及差異。

AMD

AMD一開始是CommonJS規範中的一個草案,全稱是Asynchronous Module Definition,即異步模塊加載機制。後來由該草案的作者以RequireJS實現了AMD規範,所以一般說AMD也是指RequireJS。

RequireJS的基本用法

通過define來定義一個模塊,使用require可以導入定義的模塊。

JS中AMD、CMD、CommonJS、ES6 Module的區別

RequireJS的特點

對於依賴的模塊,AMD推崇依賴前置,提前執行。也就是說,在define方法裡傳入的依賴模塊(數組),會在一開始就下載並執行。

CMD

CMD是SeaJS在推廣過程中生產的對模塊定義的規範,在Web瀏覽器端的模塊加載器中,SeaJS與RequireJS並稱,SeaJS作者為阿里的玉伯。

SeaJS的基本用法

JS中AMD、CMD、CommonJS、ES6 Module的區別

SeaJS的特點

對於依賴的模塊,CMD推崇依賴就近,延遲執行。也就是說,只有到require時依賴模塊才執行。

CommonJS

CommonJS規範為CommonJS小組所提出,目的是彌補JavaScript在服務器端缺少模塊化機制,NodeJS、webpack都是基於該規範來實現的。

CommonJS的基本用法

JS中AMD、CMD、CommonJS、ES6 Module的區別

CommonJS的特點

所有代碼都運行在模塊作用域,不會汙染全局作用域;

模塊是同步加載的,即只有加載完成,才能執行後面的操作;

模塊在首次執行後就會緩存,再次加載只返回緩存結果,如果想要再次執行,可清除緩存;

require返回的值是被輸出的值的拷貝,模塊內部的變化也不會影響這個值。

ES6 Module

ES6 Module是ES6中規定的模塊體系,相比上面提到的規範, ES6 Module有更多的優勢,有望成為瀏覽器和服務器通用的模塊解決方案。

ES6 Module的基本用法

JS中AMD、CMD、CommonJS、ES6 Module的區別

ES6 Module的特點(對比CommonJS)

CommonJS模塊是運行時加載,ES6 Module是編譯時輸出接口;

CommonJS加載的是整個模塊,將所有的接口全部加載進來,ES6 Module可以單獨加載其中的某個接口;

CommonJS輸出是值的拷貝,ES6 Module輸出的是值的引用,被輸出模塊的內部的改變會影響引用的改變;

CommonJS this指向當前模塊,ES6 Module this指向undefined;

目前瀏覽器對ES6 Module兼容還不太好,我們平時在webpack中使用的export/import,會經過babel轉換為CommonJS規範。

總結

這裡比較全面的把JavaScript中的幾大模塊化規範羅列出來,希望藉此對JavaScript模塊化有一個大致的認識,而未對細節進行具體分析,感興趣的可以自行探索。


分享到:


相關文章: