commonjs module和es6 module


CommonJS與ES6 Module最本質的區別在於CommonJS對模塊依賴的解決是“動態的”而ES6 Module是“靜態的”;

即commonjs是運行時加載模塊,ES6是在靜態編譯期間就確定模塊的依賴;

ES6在編譯期間會將所有import提升到頂部,commonjs不會提升require;

兩者的模塊導入導出語法不同,commonjs是module.exports,exports導出,require導入;ES6則是export導出,import導入;

commonjs導出的是一個值拷貝,會對加載結果進行緩存,一旦內部再修改這個值,則不會同步到外部。ES6是導出的一個引用,內部修改可以同步到外部;

CommonJS

  1. 對於基本數據類型,屬於復制。即會被模塊緩存。同時,在另一個模塊可以對該模塊輸出的變量重新賦值。
  2. 對於復雜數據類型,屬於淺拷貝。由於兩個模塊引用的對象指向同一個內存空間,因此對該模塊的值做修改時會影響另一個模塊。
  3. 當使用require命令加載某個模塊時,就會運行整個模塊的代碼。
  4. 當使用require命令加載同一個模塊時,不會再執行該模塊,而是取到緩存之中的值。也就是說,CommonJS模塊無論加載多少次,都只會在第一次加載時運行一次,以后再加載,就返回第一次運行的結果,除非手動清除系統緩存。
  5. 循環加載時,屬於加載時執行。即腳本代碼在require的時候,就會全部執行。一旦出現某個模塊被"循環加載",就只輸出已經執行的部分,還未執行的部分不會輸出。

ES6模塊

  1. ES6模塊中的值屬於【動態只讀引用】。
  2. 對於只讀來說,即不允許修改引入變量的值,import的變量是只讀的,不論是基本數據類型還是復雜數據類型。當模塊遇到import命令時,就會生成一個只讀引用。等到腳本真正執行時,再根據這個只讀引用,到被加載的那個模塊里面去取值。
  3. 對於動態來說,原始值發生變化,import加載的值也會發生變化。不論是基本數據類型還是復雜數據類型。
  4. 循環加載時,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM