模塊化
什么是模塊化
模塊化是指解決一個復雜問題時,自頂向下逐層把系統劃分成若干模塊的過程。 對于整個系統來說,模塊是可組合、分解和更換的單元。
生活中的模塊化
編程中的模塊化
編程領域中的模塊化,就是遵守固定的規則,把一個大文件拆成獨立并互相依賴的多個小模塊。
把代碼進行模塊化拆分的好處:
- 提高了代碼的復用性
- 提高了代碼的可維護性
- 可以實現按需加載
- etc…
模塊化規范
模塊化規范就是對代碼進行模塊化的拆分與組合時,需要遵守的那些規則。
例如:
- 使用什么樣的語法格式來引用模塊 (require(‘fs’))
- 在模塊中使用什么樣的語法格式向外暴露成員 (目前沒有學習,馬上學習)
模塊化規范的好處:大家都遵守同樣的模塊化規范寫代碼,降低了溝通的成本,極大方便了各個模塊之間的相互調用, 利人利己。
我們自己寫模塊,也要遵守模塊化的標準。
Node.js 中模塊的分類
Node.js 中根據模塊來源的不同,將模塊分為了 3 大類,分別是:
- 內置模塊(內置模塊是由 Node.js 官方提供的,例如 fs、path、http 等)
- 自定義模塊(用戶創建的每個
.js
文件,都是自定義模塊) - 第三方模塊(由第三方開發出來的模塊,并非官方提供的內置模塊,也不是用戶創建的自定義模塊,使用前需要先下載)
加載模塊
// 加載核心模塊
const fs = require('fs');// 加載第三方模塊
const express = require('express');// 加載自定義模塊
const custom = require('./custom');
使用 require()
加載模塊后,會緩存起來,下次再調用 require()
加載相同模塊的時候,直接使用緩存,而不是從新加載,從而大大提高了性能。
注意事項:
- 無論是什么模塊,我們都要使用
require()
去加載,然后才能使用。 - 加載自定義的模塊,需要加
./
,而且可以省略后綴.js
自定義模塊的實現(重點)
Node.js中的模塊作用域
在 Node.js 中,用戶創建的每個 .js
文件都是自定義模塊。 在自定義模塊中定義的變量、方法等成員,只能在當前模塊內被訪問,這種模塊級別的訪問限制,叫做模塊作用域。
模塊作用域的好處是避免了全局變量污染。
導出導入模塊
為了能正常使用加載的模塊中的成員,CommonJS給出了標準,即
- 一個模塊需要使用
module.exports
導出需要共享的內容。 - 使用模塊的JS文件需要使用
require()
導入模塊。
模塊導出的是什么,另一個使用模塊的JS文件得到的就是什么。
了解CommonJS規范
為了實現模塊化。
模塊化規范的種類:
- AMD
- CMD
- CommonJS — Node.js 遵循CommonJS
- ES6
Node.js 遵循了 CommonJS 模塊化規范,CommonJS 規定了模塊的特性和各模塊之間如何相互依賴。
CommonJS 規定:
- 每個模塊內部,module 變量代表當前模塊。
- module 變量是一個對象,它的 exports 屬性(即 module.exports)是對外的接口。
- 加載某個模塊,其實是加載該模塊的 module.exports 屬性。require() 方法用于加載模塊。
require() 加載模塊的機制
加載自定義模塊和其他模塊的機制有相同之處,也有不同之處,所以這里分開來看。
加載自定義模塊
- 首次加載成功,會緩存模塊
- 下次從緩存中加載,速度更快
- 加載模塊必須加
./
,如果是其他路徑,對應變化,否則會把它當做核心模塊或者第三方模塊 - 加載模塊的時候,如果是
require('./abc')
- 優先加載相同名字的文件,加載一個叫做 abc 的文件
- 自動補
.js
后綴,然后加載abc.js
文件 - 自動補
.json
后綴,然后加載abc.json
文件 - 自動補
.node
后綴,然后加載abc.node
文件 - 以上文件都沒有,則報錯
Cannot find module './abc'
加載核心模塊和第三方模塊
- 首次加載成功,會緩存模塊
- 下次從緩存中加載,速度更快
- 加載模塊一定
不能
加./
,否則會把它當做自定義模塊 - 加載模塊的時候,如果是
require('haha')
- 優先加載核心模塊
- 去查找并加載第三方模塊,查找第三方模塊的路徑可以通過
module.paths
查看