Node 應(yīng)用由模塊組成,采用 CommonJS 模塊規(guī)范。
每個(gè)模塊有自己的變量和方法,需要一種方式去暴露和引用一個(gè)模塊的變量和方法。require方法用于加載模塊,module.exports和exports用于暴露方法。
module.exports和exports的區(qū)別:(1)module.exports 初始值為一個(gè)空對象 {};(2)exports 是指向的 module.exports 的引用;(3)require() 返回的是 module.exports 而不是 exports
寫法:exports = module.exports = somethings,即 module.exports 指向新的對象時(shí),exports 斷開了與 module.exports 的引用,那么通過 exports = module.exports 讓 exports 重新指向 module.exports 即可。
CommonJS模塊的特點(diǎn):(1)所有代碼都運(yùn)行在模塊作用域,不會(huì)污染全局作用域。(2)模塊可以多次加載,但是只會(huì)在第一次加載時(shí)運(yùn)行一次,然后運(yùn)行結(jié)果就被緩存了,以后再加載,就直接讀取緩存結(jié)果。要想讓模塊再次運(yùn)行,必須清除緩存。(3)模塊加載的順序,按照其在代碼中出現(xiàn)的順序。
AMD規(guī)范與CommonJS的區(qū)別:CommonJS規(guī)范加載模塊是同步的,AMD規(guī)范則是非同步加載模塊,允許指定回調(diào)函數(shù)。由于Node.js主要用于服務(wù)器編程,模塊文件一般都已經(jīng)存在于本地硬盤,所以加載起來比較快,不用考慮非同步加載的方式,所以CommonJS規(guī)范比較適用。但是,如果是瀏覽器環(huán)境,要從服務(wù)器端加載模塊,這時(shí)就必須采用非同步模式,因此瀏覽器端一般采用AMD規(guī)范。
CommonJS模塊的加載機(jī)制是,輸入的是被輸出的值的拷貝。也就是說,一旦輸出一個(gè)值,模塊內(nèi)部的變化就影響不到這個(gè)值。