// CommonJS模塊
let { stat, exists, readFile } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;
上面代碼的實(shí)質(zhì)是整體加載fs模塊(即加載fs的所有方法)万皿,生成一個(gè)對象(_fs)夫凸,然后再從這個(gè)對象上面讀取 3 個(gè)方法坠韩。這種加載稱為“運(yùn)行時(shí)加載”塑娇,因?yàn)橹挥羞\(yùn)行時(shí)才能得到這個(gè)對象屹堰,導(dǎo)致完全沒辦法在編譯時(shí)做“靜態(tài)優(yōu)化”杨凑。
// ES6模塊
import { stat, exists, readFile } from 'fs';
上面代碼的實(shí)質(zhì)是從fs模塊加載 3 個(gè)方法敷扫,其他方法不加載刽宪。這種加載稱為“編譯時(shí)加載”或者靜態(tài)加載厘贼,即 ES6 可以在編譯時(shí)就完成模塊加載,效率要比 CommonJS 模塊的加載方式高圣拄。當(dāng)然嘴秸,這也導(dǎo)致了沒法引用 ES6 模塊本身,因?yàn)樗皇菍ο蟆?/p>
ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼岳掐,再通過import命令輸入
由于 ES6 模塊是編譯時(shí)加載凭疮,使得靜態(tài)分析成為可能。有了它串述,就能進(jìn)一步拓寬 JavaScript 的語法执解,比如引入宏(macro)和類型檢驗(yàn)(type system)這些只能靠靜態(tài)分析實(shí)現(xiàn)的功能。