零、文章目錄
Nodejs三、模塊化
1、模塊化的基本概念
(1)模塊化是什么
-
模塊化
是指解決一個(gè)復(fù)雜問題
時(shí),自頂向下逐層把系統(tǒng)劃分成若干模塊
的過程。對(duì)于整個(gè)系統(tǒng)來說,模塊是可組合、分解和更換的單元
。
(2)編程領(lǐng)域中的模塊化
-
編程領(lǐng)域中的模塊化,就是
遵守固定的規(guī)則
,把一個(gè)大文件
拆成獨(dú)立并互相依賴
的多個(gè)小模塊
。 -
把代碼進(jìn)行模塊化拆分的好處:
-
提高了代碼的
復(fù)用性
-
提高了代碼的
可維護(hù)性
-
可以實(shí)現(xiàn)
按需加載
-
(3)模塊化規(guī)范
-
模塊化規(guī)范
:對(duì)代碼進(jìn)行模塊化的拆分與組合時(shí),需要遵守的那些規(guī)則。例如:使用什么樣的語法格式來引用模塊,在模塊中使用什么樣的語法格式向外暴露成員。 -
模塊化規(guī)范的好處
:大家都遵守同樣的模塊化規(guī)范寫代碼,降低了溝通的成本,極大方便了各個(gè)模塊之間的相互調(diào)用,利人利己。
2、Node.js 中模塊化
(1)Node.js 中模塊的分類
- Node.js 中根據(jù)模塊來源的不同,將模塊分為了 3 大類,分別是:
-
內(nèi)置模塊
:(內(nèi)置模塊是由 Node.js 官方提供的,例如 fs、path、http 等) -
自定義模塊
:(用戶創(chuàng)建的每個(gè) .js 文件,都是自定義模塊) -
第三方模塊
:(由第三方
開發(fā)出來的模塊,并非官方提供的內(nèi)置模塊,也不是用戶創(chuàng)建的自定義模塊,使用前需要先下載
)
-
(2)加載模塊
-
使用強(qiáng)大的
require()
方法,可以加載需要的內(nèi)置模塊、用戶自定義模塊、第三方模塊
進(jìn)行使用。 -
使用
require()
方法加載其它模塊時(shí),會(huì)執(zhí)行被加載模塊中的代碼。
//1.加內(nèi)置的fs模塊
const fs = require('fs')
//2.加載用戶的自定義模塊
const custom = require('./02.custom.js')
//3.加第三方模塊
const moment = require('moment')
(3)Node.js 中的模塊作用域
-
模塊作用域
:和函數(shù)作用域
類似,在自定義模塊中定義的變量、方法
等成員,只能在當(dāng)前模塊內(nèi)被訪問
,這種模塊級(jí)別的訪問限制
,叫做模塊作用域
。 -
模塊作用域的好處
:防止了全局變量污染的問題
(4)共享模塊中的成員
-
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ì)象。 - 使用
require()
方法導(dǎo)入模塊時(shí),導(dǎo)入的結(jié)果,永遠(yuǎn)以 module.exports 指向的對(duì)象為準(zhǔn)
。
- 在自定義模塊中,可以使用
-
exports對(duì)象
:由于module.exports
單詞寫起來比較復(fù)雜,為了簡化向外共享成員的代碼,Node 提供了exports 對(duì)象
。默認(rèn)情況下,exports和module.exports 指向同一個(gè)對(duì)象
。
文章來源:http://www.zghlxwxcb.cn/news/detail-491133.html
-
exports和 module.exports的使用誤區(qū)
:- 時(shí)刻謹(jǐn)記,
require()
模塊時(shí),得到的永遠(yuǎn)是module.exports
指向的對(duì)象 - 為了防止混亂,建議大家不要在同一個(gè)模塊中同時(shí)使用
exports
和module.exports
- 時(shí)刻謹(jǐn)記,
文章來源地址http://www.zghlxwxcb.cn/news/detail-491133.html
(5)Node.js 中的模塊化規(guī)范
-
Node.js
遵循了CommonJS
模塊化規(guī)范,CommonJS
規(guī)定了模塊的特性和各模塊之間如何相互依賴。 -
CommonJS
規(guī)定:- 每個(gè)模塊內(nèi)部,
module變量
代表當(dāng)前模塊。 -
module變量
是一個(gè)對(duì)象
,module.exports
是對(duì)外的接口
。 -
require()
方法加載某個(gè)模塊,其實(shí)是加載該模塊的module.exports 屬性
。
- 每個(gè)模塊內(nèi)部,
3、模塊的加載機(jī)制
(1)優(yōu)先從緩存中加載
-
模塊在第一次加載后會(huì)被緩存。 這也意味著多次調(diào)用
require()
不會(huì)導(dǎo)致模塊的代碼被執(zhí)行多次。 - 不論是內(nèi)置模塊、用戶自定義模塊、還是第三方模塊,它們
都會(huì)優(yōu)先從緩存中加載
,從而提高模塊的加載效率。
(2)內(nèi)置模塊
的加載機(jī)制
- 內(nèi)置模塊是由 Node.js 官方提供的模塊,
內(nèi)置模塊的加載優(yōu)先級(jí)最高
。 - 例如,require(‘fs’) 始終返回內(nèi)置的 fs 模塊,即使在 node_modules 目錄下有名字相同的包也叫做 fs。
(3)自定義模塊
的加載機(jī)制
- 使用
require()
加載自定義模塊時(shí),必須指定以 ./ 或 …/ 開頭的路徑標(biāo)識(shí)符
。在加載自定義模塊時(shí),如果沒有指定 ./ 或 …/ 這樣的路徑標(biāo)識(shí)符,則 node 會(huì)把它當(dāng)作內(nèi)置模塊
或第三方模塊
進(jìn)行加載。 - 同時(shí),在使用 require() 導(dǎo)入自定義模塊時(shí),如果省略了文件的擴(kuò)展名,則 Node.js 會(huì)按順序分別嘗試加載以下的文件:
- 按照
確切的文件名
進(jìn)行加載 - 補(bǔ)全
.js
擴(kuò)展名進(jìn)行加載 - 補(bǔ)全
.json
擴(kuò)展名進(jìn)行加載 - 補(bǔ)全
.node
擴(kuò)展名進(jìn)行加載 - 加載失敗,終端報(bào)錯(cuò)
- 按照
(4)第三方模塊
的加載機(jī)制
- 如果傳遞給 require() 的模塊標(biāo)識(shí)符不是一個(gè)內(nèi)置模塊,也沒有以 ‘./’ 或 ‘…/’ 開頭,則 Node.js 會(huì)從當(dāng)前模塊的父目錄開始,嘗試從
/node_modules
文件夾中加載第三方模塊。 -
如果沒有找到對(duì)應(yīng)的第三方模塊,則移動(dòng)到再上一層父目錄中,進(jìn)行加載,直到文件系統(tǒng)的根目錄
。 - 例如,假設(shè)在 ‘C:\Users\ly\project\foo.js’ 文件里調(diào)用了 require(‘tools’),則 Node.js 會(huì)按以下順序查找:
-
C:\Users\ly\project
\node_modules\tools -
C:\Users\ly
\node_modules\tools -
C:\Users
\node_modules\tools -
C:
\node_modules\tools
-
(5)目錄
作為模塊
- 當(dāng)把目錄作為模塊標(biāo)識(shí)符,傳遞給
require()
進(jìn)行加載的時(shí)候,有三種加載方式:- 在被加載的目錄下查找一個(gè)叫做
package.json
的文件,并尋找main 屬性
,作為 require() 加載的入口 - 如果目錄里
沒有 package.json 文件
,或者main 入口不存在或無法解析
,則 Node.js 將會(huì)試圖加載目錄下的index.js 文件
。 - 如果以上
兩步都失敗了
,則 Node.js 會(huì)在終端打印錯(cuò)誤消息
,報(bào)告模塊的缺失:Error: Cannot find module ‘xxx’
- 在被加載的目錄下查找一個(gè)叫做
到了這里,關(guān)于Nodejs三、模塊化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!