在CommonJS中可以用require去加載模塊。
現(xiàn)在假設(shè)我們在web環(huán)境下,用require去加載模塊A。
但是模塊A由于網(wǎng)絡(luò)問題,使得加載速度很慢或者請求超時(shí)根本獲取不到。
由于js在瀏覽器端是異步加載的,最終這個(gè)沒有加載到的模塊A會導(dǎo)致后面依賴它的代碼出錯(cuò)。
所以CommonJS 規(guī)范雖然適用于服務(wù)器端,但不適用于瀏覽器端。
AMD規(guī)范很好地解決了異步加載和依賴的問題,
AMD的全稱是Asynchronous Module Definition,即異步模塊加載機(jī)制。
AMD 例子:
1.定義模塊moduleB,模塊moduleB依賴于模塊moduleX
define('moduleB', ['./moduleX'], function(x){
console.log(x);
return {
name: 'xxx'
}
})
2.引用模塊moduleA
require(['./moduleA'], function(a){
console.log(a.xxx);
})
//意思是函數(shù)依賴于moduleA,加載完后才再執(zhí)行。
結(jié)尾:
私人開發(fā)的規(guī)范:
CMD 應(yīng)用于 seaJS (代碼有BUG,沒人維護(hù),沒人使用)
AMD 應(yīng)用于 requireJS (過時(shí),但依然有人維護(hù),有人使用)
CommonJS 應(yīng)用于 NPM
官方開發(fā)的規(guī)范:
ESModules
ESModules是es6規(guī)范, 截止2017年8月,目前大部分瀏覽器不支持。
Node.js 從 8.5.0 開始原生支持 ES 模塊,不過還需要通過命令行參數(shù)控制。
8.5.0前的Node.js依然使用CommonJS。
ESModules 需要用babel轉(zhuǎn)換es6語法
2021年11月,目前主流的打包軟件都默認(rèn)使用ESModules,所以請直接使用官方統(tǒng)一的規(guī)范ESModules,CMD和AMD已經(jīng)成為歷史
ESModules例子:
定義模塊moduleA:
let xxx = {};
export xxx;
let yyy = {};
export yyy;
引用模塊moduleA:
import {* as A} from './moduleA';
引用后的調(diào)用:
console.log(A.xxx);
console.log(A.yyy);
更多資料: 在 Node.js 中使用原生的 ES 模塊