Module 語法

Module 語法

ES6 模塊不是對象,而是通過 export 命令顯示指定輸出的代碼,再通過 import 命令輸入。

import {stat,exists,readFile} from 'fs';

上述代碼的實質(zhì)是從 fs 模塊加載3個方法,其它方法不加載,這種加載稱為"編譯時加載"或者靜態(tài)加載。即ES6 可以在編譯時就完成模塊加載。

由于 ES6 模塊是編譯時加載,使得靜態(tài)分析稱為可能,有了它,就能進(jìn)一步擴(kuò)寬 JavaScript 的語法,比如引入宏和類型檢驗,這些只能靠靜態(tài)分析實現(xiàn)的功能。

除了靜態(tài)加載帶來的各種好處, ES6 模塊還有以下好處。

export 命令

模塊功能主要由兩個命令構(gòu)成: exportimport, export命令用于規(guī)定模塊的對外接口, import 命令用于輸入其他模塊提供的功能。

一個模塊就是一個獨立的文件,該文件內(nèi)部的所有變量,外部無法獲取,如果你希望外部能夠讀取模塊內(nèi)部的某個變量,就必須使用 export關(guān)鍵字輸出該變量。

//profile.js
export var firstName = '張';
export var lastName = "某人";

上述代碼是 profile.js 文件,ES6 將其視為一個模塊,里面用 export 命令對外部輸出了三個變量。

exportde寫法,除了上面樣子還有另外一種

var firstName = '張';
var lastName = '某人';

export {firstName, lastName};

上面代碼在 export 命令后面,使用大括號指定所要輸出的一組變量,

export 命令出了輸出變量,還可以輸出函數(shù)或類(class).

export function multiply(x,y){
return x * y;
};

上述代碼對外輸出一個函數(shù) multiply。

通常情況下, export 輸出的變量就是本來的名字,但是可以使用 as 關(guān)鍵字重命名。

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

export {
v1 as streamV1;
v2 as streamV2;
v2 as streamLatestVerson;
}

上面代碼使用 as 關(guān)鍵字,重命名了函數(shù) v1v2的對外接口,重命名后, v2可以用不同的名字輸出兩次。

需要特別注意的是, export 命令規(guī)定的是對外的接口,必須與模塊內(nèi)部的變量建立一一對應(yīng)關(guān)系。

//報錯
export 1;

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

上面兩種寫法都會報錯,因為沒有提供對外的接口,第一種寫法直接輸出1,第二種寫法通過變量 m, 還是直接輸出1,1只是一個值,不是接口,正確的寫法是下面這樣.

// 寫法1
export var m=1;

// 寫法2
var m = 1;
export {m};

// 寫法3
var n=1;
export {n as m};

同樣, functionclass 的輸出,也必須遵守這樣的寫法.

// 報錯
function f(){}
export f;

// 正確
export function f(){};

// 正確
function f(){}
export {f};

另外, export 語句輸出的接口,與其對應(yīng)的值是動態(tài)綁定關(guān)系,即通過該接口,可以取到模塊內(nèi)部實時的值。

export var foo = 'bar';

import 命令

使用 export 命令定義了模塊的對外接口以后,其他 JS 文件就可以通過 import 命令加載這個模塊。

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

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

如果想為輸入的變量重新取一個名字,import命令要使用as 關(guān)鍵字,將輸入的變量重命名。

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

import 后面的 from 指定模塊文件的位置,可以是相對路徑,也可以是絕對路徑,.js 路徑可以省略,如果只是模塊名,不帶有路徑,那么必須有配置文件,告訴 JavaScript 引擎該模塊的位置。

import命令具有提升效果,會提升到整個模塊的頭部,首先執(zhí)行.

foo();
import {foo} from 'my module';

上面代碼不會報錯,因為 import的執(zhí)行早于 foo的調(diào)用,這種行為的本質(zhì)是: import 命令時編譯階段執(zhí)行的,在代碼運行之前。

由于 import是靜態(tài)執(zhí)行,所以不能使用表達(dá)式和變量,這些只有在運行時才能得到結(jié)果的語法結(jié)構(gòu).

// 報錯
import {'f'+'oo'} from 'my_module';

模塊的整體加載

除了指定加載某個輸出值,還可以使用整體加載,即用星號 (*) 指定一個對象,所有輸出值都加載在這個對象上面。

export function area(radius) {
return Math.PI * radius* radius;
}

export function circumference(radius) {
return 2*Math.PI * radius;
}

現(xiàn)在加載這個模塊

import (area, circumferernce) from './circle';

上面的寫法是逐一制定要加載的方法,整體加載的寫法如下:

import * as circle from './circle';

注意整體加載所在的那么對象,應(yīng)該是可以靜態(tài)分析的,所以不允許運行時改變。

export default 命令

在使用 import 命令的時候,用戶需要知道索要加載的變量名或函數(shù)名,否則無法加載,但是用戶肯定希望快速上手,未必愿意閱讀文檔,去了解模塊有哪些屬性和方法。

為了給用戶提供方便,讓他們不用閱讀文檔就能加載模塊,就要用到 export default 命令,為模塊指定默認(rèn)輸出。

// export default.js
export default function(){
}

上面代碼是一個模塊文件 export-default.js, 它的默認(rèn)輸出是一個函數(shù)。其他模塊加載該模塊時,import命令可以為該匿名函數(shù)指定任意名字。

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

上面代碼的 import 命令,可以用任意名稱指向 export-default.js 輸出的房啊,這時就不需要知道原模塊輸出的函數(shù)名,需要注意的是,這時 import命令后面,不使用大括號。

export default 命令用在非匿名函數(shù)前,也是可以的。

默認(rèn)輸出和正常輸出

// 第一組
export default function crc32(){
//輸出
}

import crc32 from 'crc32'; // 輸入

// 第二組

export function crc32(){
// 輸出
};

import {crc32} from 'crc32';// 輸入

export default 命令用于指定模塊的默認(rèn)輸出,顯然,一個模塊只能有一個默認(rèn)輸出,因此 export default 命令只能使用一次,所以, import命令后面才不用加大括號,因為只可能對應(yīng)一個方法。

本質(zhì)上, export default 就是輸出一個叫做 default 的變量或房啊,然后系統(tǒng)允許你為它取任意名字,export default a 的含義是將變量 a的值賦給變量 default。

同樣的,因為 export default 本質(zhì)是將該命令后面的值,賦給 default 變量以后再默認(rèn),所以直接將一個值寫在 export default之后。

有了 export default 命令,輸入模塊時就非常直觀了,以輸入

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ES6模塊不是對象,而是export命令顯示指定輸出的代碼,輸入時也采用靜態(tài)命令的形式。 上面是從fs模塊里加載3...
    竹天亮閱讀 7,606評論 2 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 這種加載稱為“運行時加載”,因為只有運行時才能得到這個對象,導(dǎo)致完全沒辦法在編譯時做“靜態(tài)優(yōu)化”。 ES6 模塊不...
    codeSirCao閱讀 528評論 0 0
  • 以下內(nèi)容是我在學(xué)習(xí)和研究ES6時,對ES6的特性、重點和注意事項的提取、精練和總結(jié),可以做為ES6特性的字典;在本...
    科研者閱讀 3,150評論 2 9
  • 半夜一點醒來,老公在客廳里,開著燈很亮!讓我回憶起剛結(jié)婚還沒有兒子的那幾年!每天晚上他都打游戲打到很晚!說幾句就開...
    竺子閱讀 136評論 0 0