參考: 前端模組化
ES6 在語言標準的層面上,實現了模組功能,而且實現得相當簡單,旨在成為瀏覽器和伺服器通用的模組解決方案。
其模組功能主要由兩個命令構成:export
和import
。export
命令用於規定模組的對外介面,
import
命令用於輸入其他模組提供的功能。
使用import
命令的時候,使用者需要知道所要載入的變數名或函式名
/** 定義模組 math.js **/
var basicNum = 0;
var add = function (a, b) {
return a + b;
};
// export命令用於規定模組的對外介面
export { basicNum, add };
/** 引用模組 **/
// import命令用於輸入其他模組提供的功能
import { basicNum, add } from './math';
function test(ele) {
ele.textContent = add(99 + basicNum);
}
複製程式碼
其實ES6還提供了export default
命令,為模組指定預設輸出,對應的import
語句不需要使用大括號。這也更趨近於ADM的引用寫法。
/** export default **/
//定義輸出
export default { basicNum, add };
//引入
import math from './math';
function test(ele) {
ele.textContent = math.add(99 + math.basicNum);
}
複製程式碼
ES6的模組不是物件,import
命令會被 JavaScript 引擎靜態分析,在編譯時就引入模組程式碼,而不是在程式碼執行時載入,所以無法實現條件載入。也正因為這個,使得靜態分析成為可能。
ES6 模組與commonJS模組的差異
1. commonJS 模組輸出的是一個值的拷貝,ES6模組輸出的是值的引用
- commonJS模組一旦輸出一個值,模組內部的變化就影響不到這個值。
- ES6模組如果使用
import
從一個模組載入變數,那些變數不會被快取,而是成為一個指向被載入模組的引用,原始值變了,import
載入的值也會跟著變。需要開發者自己保證,真正取值的時候能夠取到值。
2. commonJS 模組是執行時載入,ES6 模組是編輯時輸出介面
-
執行時載入:commonJS 模組就是物件;即在輸入時是先載入整個模組,生成一個物件,然後再從這個物件上讀取方法,這種載入稱為“執行時載入”。commonJS指令碼程式碼在
require
的時候,就會全部執行。一旦出現某個模板被“迴圈載入”,就只能輸出已經執行的部分,還未執行的部分不會輸出。 -
編譯時載入:ES6 模組不是物件,而是通過
export
命令顯式指定輸出的程式碼,import
時指定載入某個輸出值,而不是載入整個模組,這種載入稱為“編譯時載入”。