ES6 Module

ES Module 是在 ECMAScript 6 中引入的模塊化功能匈挖。模塊功能主要由兩個(gè)命令構(gòu)成览绿,分別是 export 和 import。export 命令用于規(guī)定模塊的對(duì)外接口掏呼,import 命令用于輸入其他模塊提供的功能蟆融。
那么在遇到 import 和 export 時(shí)發(fā)生了什么呢?ES6 的模塊加載機(jī)制可以概括為四個(gè)字 一靜一動(dòng) 属铁。
一靜:import 靜態(tài)執(zhí)行
一動(dòng):export 動(dòng)態(tài)綁定
import 靜態(tài)執(zhí)行是指眠寿,import 命令會(huì)被 JavaScript 引擎靜態(tài)分析,優(yōu)先于模塊內(nèi)的其他內(nèi)容執(zhí)行红选。
export 動(dòng)態(tài)綁定是指澜公,export 命令輸出的接口,與其對(duì)應(yīng)的值是動(dòng)態(tài)綁定關(guān)系喇肋,通過(guò)該接口可以實(shí)時(shí)取到模塊內(nèi)部的值坟乾。
其使用方式如下:

//foo.js
console.log('foo is running');
import {bar} from './bar'
console.log('bar = %j', bar);
setTimeout(() => console.log('bar = %j after 500 ms', bar), 500);
console.log('foo is finished');

//bar.js
console.log('bar is running');
export let bar = false;
setTimeout(() => bar = true, 500);
console.log('bar is finished');

//執(zhí)行 node foo.js 時(shí)會(huì)輸出如下內(nèi)容:
bar is running
bar is finished
foo is running
bar = false
foo is finished
bar = true after 500 ms

import 命令是在編譯階段執(zhí)行,在代碼運(yùn)行之前先被 JavaScript 引擎靜態(tài)分析蝶防,所以優(yōu)先于 foo.js 自身內(nèi)容執(zhí)行甚侣。同時(shí)我們也看到 500 毫秒之后也可以取到 bar 更新后的值也說(shuō)明了 export 命令輸出的接口與其對(duì)應(yīng)的值是動(dòng)態(tài)綁定關(guān)系。這樣的設(shè)計(jì)使得程序在編譯時(shí)就能確定模塊的依賴關(guān)系间学,這是和 CommonJS 模塊規(guī)范的最大不同殷费。還有一點(diǎn)需要注意的是印荔,由于 import 是靜態(tài)執(zhí)行,所以 import 具有提升效果即 import 命令的位置并不影響程序的輸出详羡。
export 和 export default
在一個(gè)文件或模塊中仍律,export 可以有多個(gè),export default 僅有一個(gè), export 類似于具名導(dǎo)出实柠,而 default 類似于導(dǎo)出一個(gè)變量名為 default 的變量水泉。同時(shí)在 import 的時(shí)候,對(duì)于 export 的變量窒盐,必須要用具名的對(duì)象去承接草则,而對(duì)于 default,則可以任意指定變量名

循環(huán)依賴

//foo.js
console.log('foo is running');
import {bar} from './bar'
console.log('bar = %j', bar);
setTimeout(() => console.log('bar = %j after 500 ms', bar), 500);
export let foo = false;
console.log('foo is finished');

//bar.js
console.log('bar is running');
import {foo} from './foo';
console.log('foo = %j', foo)
export let bar = false;
setTimeout(() => bar = true, 500);
console.log('bar is finished');

//執(zhí)行 node foo.js 時(shí)會(huì)輸出如下內(nèi)容:
bar is running
foo = undefined
bar is finished
foo is running
bar = false
foo is finished
bar = true after 500 ms

foo.js 和 bar.js 形成了循環(huán)依賴蟹漓,但是程序卻沒(méi)有因陷入循環(huán)調(diào)用報(bào)錯(cuò)而是執(zhí)行正常炕横,這是為什么呢?還是因?yàn)?import 是在編譯階段執(zhí)行的葡粒,這樣就使得程序在編譯時(shí)就能確定模塊的依賴關(guān)系份殿,一旦發(fā)現(xiàn)循環(huán)依賴,ES6 本身就不會(huì)再去執(zhí)行依賴的那個(gè)模塊了塔鳍,所以程序可以正常結(jié)束伯铣。這也說(shuō)明了 ES6 本身就支持循環(huán)依賴,保證程序不會(huì)因?yàn)檠h(huán)依賴陷入無(wú)限調(diào)用轮纫。雖然如此腔寡,但是我們?nèi)匀灰M量避免程序中出現(xiàn)循環(huán)依賴,因?yàn)榭赡軙?huì)發(fā)生一些讓你迷惑的情況掌唾。注意到上面的輸出放前,在 bar.js 中輸出的 foo = undefined ,如果沒(méi)注意到循環(huán)依賴會(huì)讓你覺(jué)得明明在 foo.js 中 export foo = false 糯彬,為什么在 bar.js 中卻是 undefined呢凭语,這就是循環(huán)依賴帶來(lái)的困惑。在一些復(fù)雜大型項(xiàng)目中撩扒,你是很難用肉眼發(fā)現(xiàn)循環(huán)依賴的似扔,而這會(huì)給排查異常帶來(lái)極大的困難。對(duì)于使用 webpack 進(jìn)行項(xiàng)目構(gòu)建的項(xiàng)目搓谆,推薦使用 webpack 插件 circular-dependency-plugin來(lái)幫助你檢測(cè)項(xiàng)目中存在的所有循環(huán)依賴炒辉,盡早發(fā)現(xiàn)潛在的循環(huán)依賴可能會(huì)免去未來(lái)很大的麻煩。

https://www.colabug.com/2227753.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泉手,一起剝皮案震驚了整個(gè)濱河市黔寇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斩萌,老刑警劉巖缝裤,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屏轰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡憋飞,警方通過(guò)查閱死者的電腦和手機(jī)霎苗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搀崭,“玉大人叨粘,你說(shuō)我怎么就攤上這事猾编×龆茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵答倡,是天一觀的道長(zhǎng)轰传。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瘪撇,這世上最難降的妖魔是什么获茬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮倔既,結(jié)果婚禮上恕曲,老公的妹妹穿的比我還像新娘。我一直安慰自己渤涌,他們只是感情好佩谣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著实蓬,像睡著了一般茸俭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上安皱,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天调鬓,我揣著相機(jī)與錄音,去河邊找鬼酌伊。 笑死腾窝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的居砖。 我是一名探鬼主播虹脯,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悯蝉!你這毒婦竟也來(lái)了归形?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鼻由,失蹤者是張志新(化名)和其女友劉穎暇榴,沒(méi)想到半個(gè)月后厚棵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔼紧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年婆硬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸例。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彬犯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出查吊,到底是詐尸還是另有隱情谐区,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布逻卖,位于F島的核電站宋列,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏评也。R本人自食惡果不足惜炼杖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盗迟。 院中可真熱鬧坤邪,春花似錦、人聲如沸罚缕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怕磨。三九已至喂饥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肠鲫,已是汗流浹背员帮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留导饲,地道東北人捞高。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像渣锦,于是被迫代替她去往敵國(guó)和親硝岗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 系列文章導(dǎo)航 模塊(一) CommonJs,AMD, CMD, UMD 本文參考阮一峰 ES6入門(mén) Module的...
    合肥黑閱讀 6,095評(píng)論 0 4
  • 先給 module 在網(wǎng)上找個(gè)自己感覺(jué)妥當(dāng)?shù)亩x袋毙,module: 開(kāi)發(fā)者將程序分解成離散功能塊型檀,這些功能塊就稱為 ...
    YeLqgd閱讀 1,267評(píng)論 0 2
  • 已默認(rèn)讀者了解本篇自言自語(yǔ)的context,且對(duì)于module有所了解听盖,對(duì)于module的相關(guān)擴(kuò)展說(shuō)明將穿插在內(nèi)容...
    蔣啟鉦閱讀 1,089評(píng)論 0 4
  • Node.js Buffer(緩沖區(qū))01胀溺、創(chuàng)建 Buffer 類JavaScript 語(yǔ)言自身只有字符串?dāng)?shù)據(jù)類型...
    夜幕小草閱讀 244評(píng)論 0 0