CommonJS與ES6 Module最本質的區別在於CommonJS對模塊依賴的解決是“動態的”而ES6 Module是“靜態的”;
即commonjs是運行時加載模塊,ES6是在靜態編譯期間就確定模塊的依賴;
ES6在編譯期間會將所有import提升到頂部,commonjs不會提升require;
兩者的模塊導入導出語法不同,commonjs是module.exports,exports導出,require導入;ES6則是export導出,import導入;
commonjs導出的是一個值拷貝,會對加載結果進行緩存,一旦內部再修改這個值,則不會同步到外部。ES6是導出的一個引用,內部修改可以同步到外部;
CommonJS
- 對於基本數據類型,屬於復制。即會被模塊緩存。同時,在另一個模塊可以對該模塊輸出的變量重新賦值。
- 對於復雜數據類型,屬於淺拷貝。由於兩個模塊引用的對象指向同一個內存空間,因此對該模塊的值做修改時會影響另一個模塊。
- 當使用require命令加載某個模塊時,就會運行整個模塊的代碼。
- 當使用require命令加載同一個模塊時,不會再執行該模塊,而是取到緩存之中的值。也就是說,CommonJS模塊無論加載多少次,都只會在第一次加載時運行一次,以后再加載,就返回第一次運行的結果,除非手動清除系統緩存。
- 循環加載時,屬於加載時執行。即腳本代碼在require的時候,就會全部執行。一旦出現某個模塊被"循環加載",就只輸出已經執行的部分,還未執行的部分不會輸出。
ES6模塊
- ES6模塊中的值屬於【動態只讀引用】。
- 對於只讀來說,即不允許修改引入變量的值,import的變量是只讀的,不論是基本數據類型還是復雜數據類型。當模塊遇到import命令時,就會生成一個只讀引用。等到腳本真正執行時,再根據這個只讀引用,到被加載的那個模塊里面去取值。
- 對於動態來說,原始值發生變化,import加載的值也會發生變化。不論是基本數據類型還是復雜數據類型。
- 循環加載時,ES6模塊是動態引用。只要兩個模塊之間存在某個引用,代碼就能夠執行。
// common.js B文件 //calculator.js module.exports={name:"calculator"}; A文件 //index.js const name=require('./calculator.js').name;
// es6 module //calculator.js export const name='calculator'; //index.js import {name} from './calculator.js';
原文:https://www.cnblogs.com/unclekeith/archive/2017/10/17/7679503.html