一探颈、ES6標(biāo)準(zhǔn)發(fā)布后,module成為標(biāo)準(zhǔn)训措,標(biāo)準(zhǔn)的使用時以export指令導(dǎo)出接口,以import引入模塊怀大,但是在以往的node模塊中,我們采用的是CommonJS規(guī)范屏鳍,使用require引入模塊,使用module.exports導(dǎo)出接口
1山涡、NodeJS模塊化遵循了CommonJS規(guī)范鸭丛,根據(jù)CommonJS規(guī)范鳞溉,每個文件就是一個模塊熟菲,NodeJS會為每一個JS文件生成一個module對象,這個module對象會有一個exports屬性呆贿,并且這個exports屬性是一個空對象:
module={
exports:{}
}
2、NodeJS模塊化的步驟:創(chuàng)建模塊母蛛、導(dǎo)出模塊(exports)彩郊、加載模塊(require)、使用模塊
3违帆、導(dǎo)出模塊exports:module對象的exports屬性用來對外暴露變量的畴、方法和整個模塊丧裁,當(dāng)其他文件require該模塊的時候,實際上就是讀取了該模塊module對象的exports屬性
4缓呛、導(dǎo)入模塊——require:是 CommonJS/AMD規(guī)范引入方式,是運行時加載匿情,因此理論上require可以放在運行代碼的任何地方,本質(zhì)上require是賦值過程玲躯,其實require的結(jié)果就是對象、數(shù)字朽缴、字符串、函數(shù)等,再把require的結(jié)果賦值給某個變量
5薪鹦、導(dǎo)入模塊——import:import是ES6的一個語法標(biāo)準(zhǔn),如果要兼容瀏覽器的話必須轉(zhuǎn)化成ES5的語法,是編譯時調(diào)用瘪匿,因此必須放在文件開頭,本質(zhì)上import是解構(gòu)過程棋弥,但是目前所有的引擎都還沒有實現(xiàn)import核偿,我們在node中使用babel支持ES6,也僅僅是將ES6轉(zhuǎn)碼為ES5再執(zhí)行疆液,import語法會被轉(zhuǎn)碼為require
二款筑、module.exports蹋砚、exports與export、export default的區(qū)別
1尼荆、用法上的不同:前兩者用法是后面加等號,后兩者的用法是后面直接接具體的導(dǎo)出唧垦,不需要等號
module.exports = ...
exports = ...
export ...
export default ...
2捅儒、exports實際上是module.exports的引用,在NodeJS中每一個JS文件都被看做是一個模塊振亮,NodeJS會為每一個JS文件生成一個module對象巧还,這個mosule對象有一個exports屬性,并且這個exports屬性是一個空對象坊秸。同時麸祷,還有一個exports,引用的是module的exports屬性褒搔,即:exports=module.exports
3阶牍、export和exports的區(qū)別:首先兩者是完全不同的兩個東西,export是ES6引入的語法站超,用于導(dǎo)出模塊中的變量荸恕,對象,函數(shù)死相,類融求。對應(yīng)的導(dǎo)入關(guān)鍵字是import,而exports是一個對象算撮,不是語法生宛。
4县昂、export和export default的區(qū)別:兩者都是ES6的導(dǎo)出語法,區(qū)別在于export default在一個模塊中最多只能有一個陷舅,而export在一個模塊中可以有多個倒彰;export default的對象、變量莱睁、函數(shù)待讳、類,可以沒有名字仰剿。export的必須有名字创淡;export default對應(yīng)的import和export對應(yīng)的import有所區(qū)別(其中test是導(dǎo)出模塊所在的JS文件名),如:
export default const a = 1; => import a from 'test'
export const a = 1; => import {a} from 'test'
兩者在import時都可以取別名南吮,如把導(dǎo)入的a取名為b:
export default對應(yīng)的取別名方式:import b from 'test'
export對應(yīng)的取別名方式:import {a as b} from 'test'