1.概述
歷史上,JavaScript一直沒有模塊(module)的體系,無法將一個(gè)大程序拆分成互相依賴的小文件卷仑,再用簡(jiǎn)單的方法拼裝起來寞蚌。其他語言都有這項(xiàng)功能田巴,比如Ruby的requrire,Python的import,甚至就連css都有@import挟秤,但是JavaScript任何這方面的支持都沒有壹哺,這對(duì)開發(fā)大型的、復(fù)雜的項(xiàng)目形成了巨大的障礙艘刚。
在ES6之前管宵,社區(qū)制定了一些模塊加載方案,最主要的有CommonJS和AMD兩種攀甚。前者用于服務(wù)器箩朴,后者用于瀏覽器。ES6在語言標(biāo)準(zhǔn)的層面上秋度,實(shí)現(xiàn)了模塊功能炸庞,而且實(shí)現(xiàn)的相當(dāng)簡(jiǎn)單采蚀,可以完全取代CommonJS和AMD規(guī)范昔汉,成為瀏覽器和服務(wù)器通用的模塊解決方案。
ES6模塊的設(shè)計(jì)思想是盡量的靜態(tài)化对碌,使得編譯時(shí)就能確定模塊的依賴關(guān)系,以及輸入和輸出的變量滥壕。CommonJS和AMD模塊纸颜,都只能在運(yùn)行時(shí)確定這些東西。比如绎橘,CommonJS模塊就是對(duì)象胁孙,輸入時(shí)必須查找對(duì)象屬性。
// CommonJS 模塊
let { stat , exists , readFile } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readFile = _fs.readFile;
上面代碼的實(shí)質(zhì)是整體加載fs模塊(即加載fs的所有方法)金踪,生成一個(gè)對(duì)象(_fs)浊洞,然后再從這個(gè)對(duì)象上面讀取3個(gè)方法。這種加載成為“運(yùn)行時(shí)加載”胡岔,因?yàn)橹挥羞\(yùn)行時(shí)才能得到這個(gè)對(duì)象法希,導(dǎo)致完全沒有辦法在編譯時(shí)做“靜態(tài)優(yōu)化”。
ES6模塊不是對(duì)象靶瘸,而是通過export命令顯示指定輸出的代碼苫亦,再通過import命令輸入。