ES6 模塊的設計思想,是儘量的靜態化,使得編譯時就能確定模塊的依賴關係,以及輸入和輸出的變數。 ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼,再通過import命令輸入。 需要特別註意的是,export命令規定的是對外的介面,必須與模塊內部的變數建立一一對應關係。 export ...
ES6 模塊的設計思想,是儘量的靜態化,使得編譯時就能確定模塊的依賴關係,以及輸入和輸出的變數。
ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼,再通過import命令輸入。
// ES6模塊 import { stat, exists, readFile } from 'fs';
需要特別註意的是,export命令規定的是對外的介面,必須與模塊內部的變數建立一一對應關係。
export常用的寫法如下:
1 // 寫法1 2 export var firstName = 'Michael'; 3 export var lastName = 'Jackson'; 4 export var year = 1958; 5 6 // 寫法2 7 var firstName = 'Michael'; 8 var lastName = 'Jackson'; 9 var year = 1958; 10 11 export {firstName, lastName, year}; 12 13 // 寫法3 14 15 var firstName = 'Michael'; 16 var lastName = 'Jackson'; 17 var year = 1958; 18 19 export { 20 firstName as variable1, 21 lastName as variable2, 22 year as variable3 23 }; 24 25 // 方法1 26 export function multiply(x, y) { 27 return x * y; 28 }; 29 30 // 方法2 31 function v1() { ... } 32 function v2() { ... } 33 34 export { v1,v2 }; 35 36 // 方法3 37 function v1() { ... } 38 function v2() { ... } 39 export { 40 v1 as streamV1, 41 v2 as streamV2, 42 v2 as streamLatestVersion 43 };
import命令具有 [ 提升效果 ] ,會提升到整個模塊的頭部,首先執行。
import是靜態執行,所以不能使用表達式和變數。
1 import { lastName as surname } from './profile'; 2 foo(); 3 // import命令是編譯階段執行的,在代碼運行之前,所以foo已經被賦值 4 import { foo } from 'my_module';
import語句會執行所載入的模塊,因此可以有下麵的寫法。
import 'lodash';
模塊的整體載入,即用星號(*
)指定一個對象,所有輸出值都載入在這個對象上面。
【註意】,模塊整體載入所在的那個對象(上例是circle),應該是可以靜態分析的,所以不允許運行時改變。下麵的寫法都是不允許的。
1 // circle.js 2 3 export function area(radius) { 4 return Math.PI * radius * radius; 5 } 6 7 export function circumference(radius) { 8 return 2 * Math.PI * radius; 9 } 10 11 // main.js 12 13 import { area, circumference } from './circle'; 14 15 console.log('圓面積:' + area(4)); 16 console.log('圓周長:' + circumference(14)); 17 18 // 第二種寫法 19 import * as circle from './circle'; 20 21 console.log('圓面積:' + circle.area(4)); 22 console.log('圓周長:' + circle.circumference(14));
export default命令,為模塊指定預設輸出。
1 // export-default.js 2 export default function () { 3 console.log('foo'); 4 } 5 6 // import-default.js 7 import customName from './export-default'; 8 customName(); // 'foo'
本質上,export default就是輸出一個叫做default的變數或方法,然後系統允許你為它取任意名字。所以,下麵的寫法是有效的。
1 // modules.js 2 function add(x, y) { 3 return x * y; 4 } 5 export {add as default}; 6 // 等同於 7 // export default add; 8 9 // app.js 10 import { default as xxx } from 'modules'; 11 // 等同於 12 // import xxx from 'modules';
正是因為export default命令其實只是輸出一個叫做default的變數,所以它後面不能跟變數聲明語句。
1 // 正確 2 export var a = 1; 3 4 // 正確 5 var a = 1; 6 export default a; 7 8 // 錯誤 9 export default var a = 1;