CommonJS模塊規(guī)范
對于node執(zhí)行的每一個js文件,都會自動創(chuàng)建一個module模塊對象,如同一個封閉的函數(shù)一樣,把一個函數(shù)封閉起來,外部怎樣才能去引用呢?必然需要對完暴露出來一個“門”,也就是暴露出來一個接口。。
exports 和 module.exports 二者的關(guān)系:?
1.module.exports才是真正的接口,exports只不過是它的一個輔助工具, 最終返回給調(diào)用的是module.exports而不是exports。module.exports 初始值為一個空對象 {},而exports為指向module.exports 的引用
2. 在require() 的時候,返回的是 module.exports 而不是 exports,因此,直接賦值exports常常會出現(xiàn)錯誤,而賦值為module.exports常常是解決這一問題的折中辦法
3.所有的exports收集到的屬性和方法,都賦值給了Module.exports。當(dāng)然,這有個前提,就是module.exports本身不具備任何屬性和方法。
如果,module.exports已經(jīng)具備一些屬性和方法,那么exports收集來的信息將被忽略。
ES6模塊規(guī)范
不同于CommonJS,ES6使用 export 和 import 來導(dǎo)出、導(dǎo)入模塊。
export跟export default 有什么區(qū)別呢?
1、export與export default均可用于導(dǎo)出常量、函數(shù)、文件、模塊等
2、你可以在其它文件或模塊中通過import+(常量 | 函數(shù) | 文件 | 模塊)名的方式,將其導(dǎo)入,以便能夠?qū)ζ溥M行使用
3、在一個文件或模塊中,export可以有多個,export default僅有一個
4、通過export方式導(dǎo)出,在導(dǎo)入時要加{ },export default則不需要
export default function(){
? console.log('foo');
}
var firstName = 'Michael';var lastName = 'Jackson';var year = 1958;export {firstName, lastName, year};