ES 6 系列 - Module 的語法


es 6 大幅度優化了模塊化編程的規范。

 

寫在前面:在 es6 之前,說起 js 的模塊化,一般都避不開 CommonJs 和 AMD 兩種方案。這兩種方案,前者應用於服務器,后者應用於瀏覽器。而 es 6 通過 export 和 import 這兩個關鍵字,完全取代上面兩種方案,且使用起來更簡單。

 

一、export 命令

  出口,用於規定模塊的對外接口(這就意味着數據必須被包裝成對象的格式)。

  一個模塊就是一個獨立的文件,該文件內部的所有變量,外部無法獲取。如果希望能獲取到內部的某個變量,就必須使用 export 將變量輸出:

// profile.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;

   通常寫成,也建議這樣寫:

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;

export {firstName, lastName, year};

  以及輸出函數或者類:

function v1() { ... }
function v2() { ... }

export {
  v1 as streamV1,
  v2 as streamV2,
  v2 as streamLatestVersion
};

  export 輸出時,只有三種固定格式,其他均會報錯:

// 寫法一
export var m = 1;    // 聲明時輸出

// 寫法二
var m = 1;
export {m};      // 包裝成數據對象輸出

// 寫法三
var n = 1;
export {n as m};    // 使用別名輸出,基本上相當於第二種



// 報錯
export 1;

// 報錯
var m = 1;
export m;

  還有一點就是,export 輸出的接口,與其對應的值是動態綁定關系,即通過接口,可以獲取到模塊內部實時的值:

export var foo = 'bar';
setTimeout(() => foo = 'xyz', 500);


// 輸出變量 foo, 值為 bar , 500 ms 后變成 xyz

 

二、import 命令

  入口,加載 export 的模塊中的變量、方法等。

// main.js
import {firstName, lastName, year} from './profile.js';

function setName(element) {
  element.textContent = firstName + ' ' + lastName;
}

  當然,引入的變量也可以修改變量名:

import { lastName as surname } from './profile.js';

   一個規范:import 進來的變量、方法、對象本身無法修改,但是,如果是對象的話,其中的某個屬性還是可以修改的,但但是,從規范上,不要進行任何修改,將引入的全部當做只讀,否則改 bug 會很頭疼。

 

  如果 export 時未采用 {xxx,xxx} 方式,那么在 import 時,想要引入所有值,可以使用 * 來代替:

// main.js

import { area, circumference } from './circle';

console.log('圓面積:' + area(4));
console.log('圓周長:' + circumference(14));


// 可以簡寫成
import * as circle from './circle';

console.log('圓面積:' + circle.area(4));
console.log('圓周長:' + circle.circumference(14));

 

 

三、export default 命令

  使用 import 的時候會有一個問題,如果不知道需要加載的模塊中的變量名或者函數名,那就很尷尬。小模塊沒什么,點進去翻翻就知道,但是像 Vue、ElementUI 這種框架的時候,想要快速上手,先去翻翻文檔?

// export-default.js
export default function () {
  console.log('foo');
}


// import-default.js
import customName from './export-default';
customName(); // 'foo'

 

   如上例所示,通過 export default 出來的通常在 import 時候不需要 {},且 import 時可以任意命名。

 


免責聲明!

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



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