ES6 模塊與 CommonJS 模塊存在以下差異:
1、CommonJS 模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用
-
CommonJS 模塊輸出的是值的拷貝,也就是說,一旦輸出一個值,模塊內部的變化就影響不到這個值。
-
ES6 Modules 的運行機制與 CommonJS 不一樣。JS 引擎對腳本靜態分析的時候,遇到模塊加載命令import,就會生成一個只讀引用。等到腳本真正執行時,再根據這個只讀引用,到被加載的那個模塊里面去取值。換句話說,ES6的import 有點像 Unix 系統的“符號連接”,原始值變了,import加載的值也會跟着變。因此,ES6模塊是動態引用,並且不會緩存值,模塊里面的變量綁定其所在的模塊。
2、CommonJS 模塊是運行時加載,ES6 模塊是編譯時輸出接口
-
運行時加載: CommonJS 模塊就是對象;即在輸入時是先加載整個模塊,生成一個對象,然后再從這個對象上面讀取方法,這種加載稱為“運行時加載”。
- 編譯時加載: ES6 模塊不是對象,而是通過 export 命令顯式指定輸出的代碼,import時采用靜態命令的形式。即在import時可以指定加載某個輸出值,而不是加載整個模塊,這種加載稱為“編譯時加載”
PS:CommonJS 加載的是一個對象(即module.exports屬性),該對象只有在腳本運行完才會生成。而 ES6 模塊不是對象,它的對外接口只是一種靜態定義,在代碼靜態解析階段就會生成。
