基本概念
模塊化
? ? ? ? 模塊化是指解決一個復雜問題時,自上向下逐層把系統劃分成若干模塊的過程,對于整個系統來說,模塊是可組合,分解和更換的單元
? ? ? ? 遵守固定規則,把大文件拆分成獨立并互相依賴的多個小模塊
? ? ? ? 好處:
? ? ? ? ? ? ? ? 1. 提高代碼的復用性
? ? ? ? ? ? ? ? 2. 提高代碼的可維護性
? ? ? ? ? ? ? ? 3. 實現按需加載
Node.js中的模塊化
根據來源不同分為3大類:
? ? ? ? 1. 內置模塊(由官方提供,例如fs、path、http等)
? ? ? ? 2. 自定義模塊(用戶創建的每個 .js 文件,都是自定義模塊)
? ? ? ? 3. 第三方模塊 (由第三方開發出來的模塊,使用前要下載? ?npm i xxxx)
Node.js中的模塊化規范
? ? ? ? Node.js 遵循 CommonJS 模塊化規范,CommonJS 規定了模塊的特性和各模塊之間如何依賴
? ? ? ? CommonJS規定:
? ? ? ? ? ? ? ? 1. 每個模塊內部,module變量代表當前模塊
? ? ? ? ? ? ? ? 2. module 變量是一個對象,它的 exports 屬性(即 module.exports)是對外的接口
? ? ? ? ? ? ? ? 3. 加載某個模塊,其實是加載該模塊的 module.exports 屬性? ?require() 方法用于加載模塊
加載模塊
使用 require() 方法,可以加載內置模塊(3大類的都可)
注意:使用?require() 方法加載其他模塊時,會執行被加載模塊中的代碼
? ? ? ? ? ?可以省略加載文件名的后綴
Node.js中的模塊作用域
????????和函數作用域類似,在自定義模塊中定義的變量、方法等成員,只能在當前模塊內被訪問,這種模塊級別的訪問限制叫做模塊作用域
? ? ? ? 好處:防止全局變量污染的問題
??
向外共享模塊作用域中的成員
1. module對象
? ? ? ? 在每一個 .js 自定義模塊中都有一個 module 對象,它里面儲存了和當前模塊有關的信息
2. module.exports對象
? ? ? ? 在自定義模塊中,可以使用 module.exports 對象,將模塊內的成員共享出去,供外界使用
? ? ? ? 外界用 require() 方法導入自定義模塊時,得到的就是 module.exports 所指向的對象
3. 共享成員時的注意點
? ? ? ? 使用 require() 方法導入模塊時,導入的結果,永遠以 module.exports 指向的對象為準
4. exports對象
? ? ? ? 由于 modules.exports 單詞寫起來復雜,為了簡化代碼,Node提供了 exports 對象
? ? ? ? 默認情況下,exports 和?modules.exports 指向同一個對象
? ? ? ? 最終結果還是以?modules.exports 指向對象為準
5. exports 和 module.exports 的使用誤區
? ? ? ? require() 模塊時,得到的永遠是 module.exports 指向的對象
? ? ? ? 注意:為了防止混亂,不要在同一個模塊中同時使用 exports 和 module.exports