Node.js模塊化

什么是模塊化

模塊化是指解決一個(gè)復(fù)雜問(wèn)題時(shí),自頂向下逐層把系統(tǒng)劃分成若干模塊的過(guò)程。對(duì)于整個(gè)系統(tǒng)來(lái)說(shuō),模塊是可組合、分解和更換的單元。

Node.js 中模塊的分類

  • 內(nèi)置模塊(內(nèi)置模塊是由 Node.js 官方提供的,例如 fs、path、http 等)
  • 自定義模塊(用戶創(chuàng)建的每個(gè) .js 文件,都是自定義模塊)
  • 第三方模塊(由第三方開發(fā)出來(lái)的模塊,并非官方提供的內(nèi)置模塊,也不是用戶創(chuàng)建的自定義模塊,使用前需要先下載)

加載模塊

使用強(qiáng)大的 require() 方法,可以加載需要的內(nèi)置模塊、用戶自定義模塊、第三方模塊進(jìn)行使用。

// 1.加載內(nèi)置的fs模塊
const fs = require('fs')
// 2.加載用戶的自定義模塊
const custom = require('./custom.js')
// 3.加載第三方模塊
const moment = require('moment')

注意:
在使用require 加載用戶自定義模塊期間,可以省略.js 的后綴名

什么是模塊作用域

和函數(shù)作用域類似,在自定義模塊中定義的變量、方法等成員,只能在當(dāng)前模塊內(nèi)被訪問(wèn),這種模塊級(jí)別的訪問(wèn)限制,叫做模塊作用域。

模塊作用域的好處

防止了全局變量污染的問(wèn)題

向外共享模塊作用域中的成員

module 對(duì)象

在每個(gè) .js 自定義模塊中都有一個(gè) module 對(duì)象,它里面存儲(chǔ)了和當(dāng)前模塊有關(guān)的信息

module.exports 對(duì)象

在自定義模塊中,可以使用 module.exports 對(duì)象,將模塊內(nèi)的成員共享出去,供外界使用。
外界用 require()方法導(dǎo)入自定義模塊時(shí),得到的就是 module.exports 所指向的對(duì)象。

//13.moudle.exports對(duì)象.js文件
// 在一個(gè)自定義模塊中,默認(rèn)情況下, module.exports = {}

const age = 20

// 向 module.exports 對(duì)象上掛載 username 屬性
module.exports.username = 'zs'
// 向 module.exports 對(duì)象上掛載 sayHello 方法
module.exports.sayHello = function() {
  console.log('Hello!')
}
module.exports.age = age
// 在外界使用 require 導(dǎo)入一個(gè)自定義模塊的時(shí)候,得到的成員,
// 就是 那個(gè)模塊中,通過(guò) module.exports 指向的那個(gè)對(duì)象
const m = require('./13.moudle.exports對(duì)象.js')

console.log(m)

結(jié)果:

{ username: 'zs', sayHello: [Function (anonymous)], age: 20 }

使用 require() 方法導(dǎo)入模塊時(shí),導(dǎo)入的結(jié)果,永遠(yuǎn)以 module.exports 指向的對(duì)象為準(zhǔn)。

將13.moudle.exports對(duì)象.js文件內(nèi)容修改為

// 在一個(gè)自定義模塊中,默認(rèn)情況下, module.exports = {}

const age = 20

// 向 module.exports 對(duì)象上掛載 username 屬性
module.exports.username = 'zs'
// 向 module.exports 對(duì)象上掛載 sayHello 方法
module.exports.sayHello = function() {
  console.log('Hello!')
}
module.exports.age = age

//讓 module.exports 指向一個(gè)全新的對(duì)象
module.exports = {
  nickname: '小黑',
  sayHi() {
    console.log('Hi!')
  }
}

再次執(zhí)行,結(jié)果:

{ nickname: '小黑', sayHi: [Function: sayHi] }

exports 對(duì)象

由于 module.exports 單詞寫起來(lái)比較復(fù)雜,為了簡(jiǎn)化向外共享成員的代碼,Node 提供了 exports 對(duì)象。默認(rèn)情況下,exports 和 module.exports 指向同一個(gè)對(duì)象。最終共享的結(jié)果,還是以 module.exports 指向的對(duì)象為準(zhǔn)。

為了防止混亂,建議不要在同一個(gè)模塊中同時(shí)使用exports和module.exports。

Node.js 中的模塊化規(guī)范

Node.js 遵循了 CommonJS 模塊化規(guī)范,CommonJS 規(guī)定了模塊的特性和各模塊之間如何相互依賴。

CommonJS 規(guī)定:

  • 每個(gè)模塊內(nèi)部,module 變量代表當(dāng)前模塊。
  • module 變量是一個(gè)對(duì)象,它的 exports 屬性(即 module.exports)是對(duì)外的接口。
  • 加載某個(gè)模塊,其實(shí)是加載該模塊的 module.exports 屬性。require() 方法用于加載模塊。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容