【JS學習】export 和 export default 的區別


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命令。


免責聲明!

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



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