1.?模塊化的基本概念
1.1?什么是模塊化?
????????模塊化是指解決一個復雜問題時,自頂向下逐層將系統拆分成若干模塊的過程。對于整個系統來說,模塊是可組合、分解和更換的單元。
1.2?編程領域中的模塊化
????????編程領域中的模塊化,就是遵守固定的規則,把一個大文件拆成獨立并互相依賴的多個小模塊。?
代碼進行模塊化拆分的好處:
- 提高了代碼的復用性
- 提高了代碼的可維護性
- 可以實現按需加載
1.3 模塊化規范
????????模塊化規范就是對代碼進行模塊化的拆分與組合時,需要遵守的那些規則。例如:
- 使用什么樣的語法格式來引用模塊
- 在模塊中使用什么樣的語法格式向外暴露成員
- 模塊化規范的好處:大家都遵守同樣的模塊化規范寫代碼,降低了溝通的成本,極大方便了各個模塊之間的相互調用利人利己。
2. Node.js中的模塊化?
2.1 Node.js中模塊的分類
Node.js 中根據模塊來源的不同,將模塊分為了3大類,分別是:
- 內置模塊(內置模塊是由 Node.js 官方提供的,例如 fs、path、http 等)
- 自定義模塊 (用戶創建的每個.js 文件,都是自定義模塊)
- 第三方模塊(由第方三開發出來的模塊,并非官方提供的內置模塊,也不是用戶創建的自定義模塊,使用前需要先下載
2.2?加載模塊
? ? ? ? 使用強大的require()方法,可以加載需要的內置模塊、自定義模塊、第三方模塊進行使用,例如:
// 1.加載內置的fs模塊
const fs = require('fs')// 2.加載用戶自定義模塊
const custom = require('./custom.js')// 3.加載第三方模塊
const moment = require('moment')
注意:1.使用require()方法加載其他模塊時,會執行被加載模塊中的代碼;2.使用require()方法加載自定義模塊時,可以省略 .js的后綴名。
2.3 Node.js中的模塊作用域
2.3.1?什么是模塊作用域
????????和函數作用域類似,在自定義模塊中定義的變量、方法等成員,只能在當前模塊內被訪問,這種模塊級別的訪問限制,叫做模塊作用域。
// 這是01-模塊化作用域.js
const userName = '張三'function sayHello(){console.log('大家好,我是:'+userName);
}// 這是02-test.js
const custom = require('./01-模塊作用域')console.log('custom ',custom );//輸出:custom {}
2.3.2?模塊作用域的好處
????????防止污染全局變量
2.4?向外共享模塊作用域成員
2.4.1?module
????????在每個 .js 自定義模塊中都有一個 module 對象,它里面存儲了和當前模塊有關的信息,打印如下:
2.4.2 module.exports
????????在自定義模塊中,可以使用 module.exports 對象,將模塊內的成員共享出去,供外界使用。外界用 require()方法導入自定義模塊時,得到的就是module.exports 所指向的對象。
2.4.3?共享成員時的注意點
? ? ? ? 使用require方法導入模塊時,永遠以module.exports指向的對象為準。??
2.4.4?exports對象?
????????由于 module.exports 單詞寫起來比較復雜,為了簡化向外共享成員的代碼,Node 提供了 exports 對象。默認情況下,exports 和 module.exports 指向同一個對象。最終共享的結果,還是以 module.exports 指向的對象為準。
?2.4.5?exports和module.exports的使用誤區
?????????時刻謹記,require() 模塊時,得到的永遠是 module.exports 指向的對象(圖來自于黑馬程序員課程PPT,因為這段犯懶沒動手):
原理圖:
?注意:為了防止混亂,建議大家不要在同一個模塊中同時使用 exports 和 module.exports。
?2.5 Node.js中的模塊化規范
? ? ? ? ?Node.js遵循了CommonJS模塊化規范,CommonJS規范了模塊的特性和各模塊之間如何相互依賴。
CommonJS 規定:
- ①每個模塊內部,module 變量代表當前模塊。
- ②module 變量是一個對象,它的 exports 屬性(即 module.exports)是對外的接口。
- ③加載某個模塊,其實是加載該模塊的 module.exports 屬性。require() 方法用于加載模塊。