Module 語法

Module 語法

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

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

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

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

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

export 命令

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

一個模塊就是一個獨(dú)立的文件缰儿,該文件內(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)系。

//報(bào)錯
export 1;

// 報(bào)錯
var m = 1;
export m;

上面兩種寫法都會報(bào)錯赡茸,因?yàn)闆]有提供對外的接口缎脾,第一種寫法直接輸出1,第二種寫法通過變量 m, 還是直接輸出1占卧,1只是一個值遗菠,不是接口,正確的寫法是下面這樣.

// 寫法1
export var m=1;

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

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

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

// 報(bào)錯
function f(){}
export f;

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

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

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

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';

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

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

// 報(bào)錯
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)分析的,所以不允許運(yùn)行時改變跳仿。

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àn)橹豢赡軐?yīng)一個方法虐杯。

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趾代,一起剝皮案震驚了整個濱河市贯底,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撒强,老刑警劉巖丈甸,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尿褪,居然都是意外死亡睦擂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門杖玲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顿仇,“玉大人,你說我怎么就攤上這事摆马【饰牛” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵囤采,是天一觀的道長述呐。 經(jīng)常有香客問我,道長蕉毯,這世上最難降的妖魔是什么乓搬? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任思犁,我火速辦了婚禮,結(jié)果婚禮上进肯,老公的妹妹穿的比我還像新娘激蹲。我一直安慰自己,他們只是感情好江掩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布学辱。 她就那樣靜靜地躺著,像睡著了一般环形。 火紅的嫁衣襯著肌膚如雪策泣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天抬吟,我揣著相機(jī)與錄音着降,去河邊找鬼。 笑死拗军,一個胖子當(dāng)著我的面吹牛任洞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播发侵,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼交掏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刃鳄?” 一聲冷哼從身側(cè)響起盅弛,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叔锐,沒想到半個月后挪鹏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愉烙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年讨盒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步责。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡返顺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔓肯,到底是詐尸還是另有隱情遂鹊,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布蔗包,位于F島的核電站秉扑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏调限。R本人自食惡果不足惜舟陆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一误澳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吨娜,春花似錦、人聲如沸淘钟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米母。三九已至勾扭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铁瞒,已是汗流浹背妙色。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慧耍,地道東北人身辨。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像芍碧,于是被迫代替她去往敵國和親煌珊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

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