export
命令用於規定模塊的對外接口。
一個模塊就是一個獨立的文件。該文件內部的所有變量,外部無法獲取。如果你希望外部能夠讀取模塊內部的某個變量,就必須使用export
關鍵字輸出該變量。下面是一個 JS 文件,里面使用export
命令輸出變量。
// profile.js export var firstName = 'Michael'; export var lastName = 'Jackson'; export var year = 1958;
上面代碼是profile.js
文件,保存了用戶信息。ES6 將其視為一個模塊,里面用export
命令對外部輸出了三個變量。
export
的寫法,除了像上面這樣,還有另外一種。
// profile.js var firstName = 'Michael'; var lastName = 'Jackson'; var year = 1958; export {firstName, lastName, year};
上面代碼在export
命令后面,使用大括號指定所要輸出的一組變量。它與前一種寫法(直接放置在var
語句前)是等價的,但是應該優先考慮使用這種寫法。因為這樣就可以在腳本尾部,一眼看清楚輸出了哪些變量。
export
命令除了輸出變量,還可以輸出函數或類(class)。
export function multiply(x, y) { return x * y; };
上面代碼對外輸出一個函數multiply
。
export
命令對外輸出了指定名字的變量(變量也可以是函數或類)。
與export default命令的區別:import
命令接受一對大括號,里面指定要從其他模塊導入的變量名。大括號里面的變量名,必須與被導入模塊(profile.js
)對外接口的名稱相同。
如果想為輸入的變量重新取一個名字,import
命令要使用as
關鍵字,將輸入的變量重命名。
import { lastName as surname } from './profile.js';
export default
命令,為模塊指定默認輸出。
使用import
命令的時候,用戶需要知道所要加載的變量名或函數名,否則無法加載。但是,用戶肯定希望快速上手,未必願意閱讀文檔,去了解模塊有哪些屬性和方法。
為了給用戶提供方便,讓他們不用閱讀文檔就能加載模塊,就要用到export default
命令,為模塊指定默認輸出。
// export-default.js export default function () { console.log('foo'); }
上面代碼是一個模塊文件export-default.js
,它的默認輸出是一個函數。
與export命令的區別:其他模塊加載該模塊時,import
命令可以為該匿名函數指定任意名字。
// import-default.js import customName from './export-default'; customName(); // 'foo'
上面代碼的import
命令,可以用任意名稱指向export-default.js
輸出的方法,這時就不需要知道原模塊輸出的函數名。需要注意的是,這時import
命令后面,不使用大括號。
本質上,export default
就是輸出一個叫做default
的變量或方法,然后系統允許你為它取任意名字。所以,下面的寫法是有效的。
// modules.js function add(x, y) { return x * y; } export {add as default}; // 等同於 // export default add; // app.js import { default as foo } from 'modules'; // 等同於 // import foo from 'modules';
正是因為export default
命令其實只是輸出一個叫做default
的變量,所以它后面不能跟變量聲明語句。
總結:export命令對外接口是有名稱的且import
命令從模塊導入的變量名與被導入模塊對外接口的名稱相同,而export default命令對外輸出的變量名可以是任意的,這時import
命令后面,不使用大括號。
export default
命令用於指定模塊的默認輸出。顯然,一個模塊只能有一個默認輸出,因此export default
命令只能使用一次。所以,import命令后面才不用加大括號,因為只可能唯一對應export default
命令。