深入聊聊Node.js中的模塊化

什么是模塊化?本篇文章帶大家了解一下Node中的模塊化 , 介紹一下模塊的加載機制 , 希望對大家有所幫助!

深入聊聊Node.js中的模塊化

文章插圖

一、模塊化的基本概念1.1 什么是模塊化
模塊化是指解決一個復雜問題時 , 自頂向下逐層把系統劃分成若干模塊的過程 。 對于整個系統來說 , 模塊是可組合、分解和更換的單元 。
編程領域中的模塊化 , 就是遵守固定的規則 , 把一個大文件拆成獨立并互相依賴的多個小模塊 。
把代碼進行模塊化拆分的好處:
    提高了代碼的復用性
    提高了代碼的可維護性
    可以實現按需加載
二、Node.js 中模塊化2.1 Node.js 中模塊的分類
Node.js 中根據模塊來源的不同 , 將模塊分為了 3 大類 , 分別是:
    內置模塊(內置模塊是由 Node.js 官方提供的 , 例如 fs、path、http 等)
    自定義模塊(用戶創建的每個 .js 文件 , 都是自定義模塊)
    第三方模塊(由第三方開發出來的模塊 , 并非官方提供的內置模塊 , 也不是用戶創建的自定義模塊 , 使用前需要先下載)
2.2 加載模塊
使用強大的 require() 方法 , 可以加載需要的內置模塊、用戶自定義模塊、第三方模塊進行使用 。 例如:
深入聊聊Node.js中的模塊化

文章插圖

注意:使用 require() 方法加載其它模塊時 , 會執行被加載模塊中的代碼;
加載自定義模塊可以省略文件后綴名'.js' 。
2.3 Node.js 中的模塊作用域
    什么是模塊作用域
和函數作用域類似 , 在自定義模塊中定義的變量、方法等成員 , 只能在當前模塊內被訪問 , 這種模塊級別的訪問限制 , 叫做模塊作用域 。
    模塊作用域的好處
防止了全局變量污染的問題(如果用script標簽導入兩個js文件且兩個文件中都定義了同一個變量 , 則前一個會被后一個覆蓋)
2.4 向外共享模塊作用域中的成員
1、module 對象
在每個 .js 自定義模塊中都有一個 module 對象 , 它里面存儲了和當前模塊有關的信息 , 打印如下:
深入聊聊Node.js中的模塊化

文章插圖

2、module.exports 對象
在自定義模塊中 , 可以使用 module.exports 對象 , 將模塊內的成員共享出去 , 供外界使用 。
外界用 require() 方法導入自定義模塊時 , 得到的就是 module.exports 所指向的對象 。
3、共享成員時的注意點
使用 require() 方法導入模塊時 , 導入的結果 , 永遠以 module.exports 指向的對象為準 。
深入聊聊Node.js中的模塊化

文章插圖

【深入聊聊Node.js中的模塊化】4. exports 對象
由于 module.exports 單詞寫起來比較復雜 , 為了簡化向外共享成員的代碼 , Node 提供了 exports 對象 。 默認情況下 , exports 和 module.exports 指向同一個對象 。 最終共享的結果 , 還是以 module.exports 指向的對象為準 。
深入聊聊Node.js中的模塊化

文章插圖

5. exports 和 module.exports 的使用誤區
時刻謹記 , require() 模塊時 , 得到的永遠是 module.exports 指向的對象:
深入聊聊Node.js中的模塊化

文章插圖

個人理解:exports 和 module.exports本來指向同一個對象 。 僅僅通過掛載數據指向的還是同一個對象 , 通過exports掛載的數據也可以被require模塊得到 。 如果一方賦值(指向另一個對象 , 那么他們就不指向同一對象了 , 而require模塊得到的是module.exports 指向的對象 , 所以一旦一方改變指向 , require模塊就不會得到exports的值 。 )
注意:為了防止混亂 , 建議大家不要在同一個模塊中同時使用 exports 和 module.exports
2.5 Node.js 中的模塊化規范Node.js 遵循了 CommonJS 模塊化規范 , CommonJS 規定了模塊的特性和各模塊之間如何相互依賴 。
CommonJS 規定:
(1)每個模塊內部 , module 變量代表當前模塊 。
(2)module 變量是一個對象 , 它的 exports 屬性(即 module.exports)是對外的接口 。
(3)加載某個模塊 , 其實是加載該模塊的 module.exports 屬性 。 require() 方法用于加載模塊 。
三、npm與包3.1 包
1、什么是包
Node.js 中的第三方模塊又叫做包 。

推薦閱讀