這篇文章主要介紹“Node.js中的模塊化概念是什么”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Node.js中的模塊化概念是什么”文章能幫助大家解決問題。
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供呼圖壁網(wǎng)站建設(shè)、呼圖壁做網(wǎng)站、呼圖壁網(wǎng)站設(shè)計、呼圖壁網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、呼圖壁企業(yè)網(wǎng)站模板建站服務(wù),十載呼圖壁做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
1.1 什么是模塊化
模塊化是指解決一個復(fù)雜問題時,自頂向下逐層把系統(tǒng)劃分成若干模塊的過程。對于整個系統(tǒng)來說,模塊是可組合、分解和更換的單元。
編程領(lǐng)域中的模塊化,就是遵守固定的規(guī)則,把一個大文件拆成獨(dú)立并互相依賴的多個小模塊。
把代碼進(jìn)行模塊化拆分的好處:
提高了代碼的復(fù)用性
提高了代碼的可維護(hù)性
可以實(shí)現(xiàn)按需加載
2.1 Node.js 中模塊的分類
Node.js 中根據(jù)模塊來源的不同,將模塊分為了 3 大類,分別是:
內(nèi)置模塊(內(nèi)置模塊是由 Node.js 官方提供的,例如 fs、path、http 等)
自定義模塊(用戶創(chuàng)建的每個 .js 文件,都是自定義模塊)
第三方模塊(由第三方開發(fā)出來的模塊,并非官方提供的內(nèi)置模塊,也不是用戶創(chuàng)建的自定義模塊,使用前需要先下載)
2.2 加載模塊
使用強(qiáng)大的 require() 方法,可以加載需要的內(nèi)置模塊、用戶自定義模塊、第三方模塊進(jìn)行使用。例如:
注意:使用 require() 方法加載其它模塊時,會執(zhí)行被加載模塊中的代碼; 加載自定義模塊可以省略文件后綴名'.js'。
2.3 Node.js 中的模塊作用域
什么是模塊作用域
和函數(shù)作用域類似,在自定義模塊中定義的變量、方法等成員,只能在當(dāng)前模塊內(nèi)被訪問,這種模塊級別的訪問限制,叫做模塊作用域。
模塊作用域的好處
防止了全局變量污染的問題(如果用script標(biāo)簽導(dǎo)入兩個js文件且兩個文件中都定義了同一個變量,則前一個會被后一個覆蓋)
2.4 向外共享模塊作用域中的成員
1、module 對象
在每個 .js 自定義模塊中都有一個 module 對象,它里面存儲了和當(dāng)前模塊有關(guān)的信息,打印如下:
2、module.exports 對象
在自定義模塊中,可以使用 module.exports 對象,將模塊內(nèi)的成員共享出去,供外界使用。
外界用 require() 方法導(dǎo)入自定義模塊時,得到的就是 module.exports 所指向的對象。
3、共享成員時的注意點(diǎn)
使用 require() 方法導(dǎo)入模塊時,導(dǎo)入的結(jié)果,永遠(yuǎn)以 module.exports 指向的對象為準(zhǔn)。
4. exports 對象
由于 module.exports 單詞寫起來比較復(fù)雜,為了簡化向外共享成員的代碼,Node 提供了 exports 對象。默認(rèn)情況下,exports 和 module.exports 指向同一個對象。最終共享的結(jié)果,還是以 module.exports 指向的對象為準(zhǔn)。
5. exports 和 module.exports 的使用誤區(qū)
時刻謹(jǐn)記,require() 模塊時,得到的永遠(yuǎn)是 module.exports 指向的對象:
個人理解:exports 和 module.exports本來指向同一個對象。僅僅通過掛載數(shù)據(jù)指向的還是同一個對象,通過exports掛載的數(shù)據(jù)也可以被require模塊得到。如果一方賦值(指向另一個對象,那么他們就不指向同一對象了,而require模塊得到的是module.exports 指向的對象,所以一旦一方改變指向,require模塊就不會得到exports的值。)
注意:為了防止混亂,建議大家不要在同一個模塊中同時使用 exports 和 module.exports
2.5 Node.js 中的模塊化規(guī)范Node.js 遵循了 CommonJS 模塊化規(guī)范,CommonJS 規(guī)定了模塊的特性和各模塊之間如何相互依賴。
CommonJS 規(guī)定:
(1)每個模塊內(nèi)部,module 變量代表當(dāng)前模塊。
(2)module 變量是一個對象,它的 exports 屬性(即 module.exports)是對外的接口。
(3)加載某個模塊,其實(shí)是加載該模塊的 module.exports 屬性。require() 方法用于加載模塊。
3.1 包
1、什么是包
Node.js 中的第三方模塊又叫做包。
就像電腦和計算機(jī)指的是相同的東西,第三方模塊和包指的是同一個概念,只不過叫法不同。
2、包的來源
不同于 Node.js 中的內(nèi)置模塊與自定義模塊,包是由第三方個人或團(tuán)隊開發(fā)出來的,免費(fèi)供所有人使用。
注意:Node.js 中的包都是免費(fèi)且開源的,不需要付費(fèi)即可免費(fèi)下載使用。
3、為什么需要包
由于 Node.js 的內(nèi)置模塊僅提供了一些底層的 API,導(dǎo)致在基于內(nèi)置模塊進(jìn)行項目開發(fā)的時,效率很低。
包是基于內(nèi)置模塊封裝出來的,提供了更高級、更方便的 API,極大的提高了開發(fā)效率。
包和內(nèi)置模塊之間的關(guān)系,類似于 jQuery 和 瀏覽器內(nèi)置 API 之間的關(guān)系。
4、從哪里下載包
國外有一家 IT 公司,叫做 npm, Inc. 這家公司旗下有一個非常著名的網(wǎng)站: www.npmjs.com/ ,它是全球最大的包共享平臺,你可以從這個網(wǎng)站上搜索到任何你需要的包,只要你有足夠的耐心!
到目前位置,全球約 1100 多萬的開發(fā)人員,通過這個包共享平臺,開發(fā)并共享了超過 120 多萬個包 供我們使用。 npm, Inc. 公司提供了一個地址為 registry.npmjs.org/ 的服務(wù)器,來對外共享所有的包,我們可以從這個服務(wù)器上下載自己所需要的包。
注意:
從 www.npmjs.com/ 網(wǎng)站上搜索自己所需要的包
從 registry.npmjs.org/ 服務(wù)器上下載自己需要的包
5、如何下載包
npm, Inc. 公司提供了一個包管理工具,我們可以使用這個包管理工具,從 registry.npmjs.org/ 服務(wù)器把需要的包下載到本地使用。
這個包管理工具的名字叫做 Node Package Manager(簡稱 npm 包管理工具),這個包管理工具隨著 Node.js 的安裝包一起被安裝到了用戶的電腦上。
大家可以在終端中執(zhí)行 npm -v 命令,來查看自己電腦上所安裝的 npm 包管理工具的版本號:
3.2 npm 初體驗(yàn)
1、在項目中安裝包的命令
如果想在項目中安裝指定名稱的包,需要運(yùn)行如下的命令:
npm install 包的完整名稱
上述的裝包命令,可以簡寫成如下格式:
npm i 包的完整名稱
2、初次裝包后多了哪些文件
初次裝包完成后,在項目文件夾下多一個叫做 node_modules 的文件夾和 package-lock.json 的配置文件。
其中: node_modules 文件夾用來存放所有已安裝到項目中的包。require() 導(dǎo)入第三方包時,就是從這個目錄中查找并加載包。
package-lock.json 配置文件用來記錄 node_modules 目錄下的每一個包的下載信息,例如包的名字、版本號、下載地址等。
注意:程序員不要手動修改 node_modules 或 package-lock.json 文件中的任何代碼,npm 包管理工具會自動維護(hù)它們。
3、安裝指定版本的包
默認(rèn)情況下,使用 npm install 命令安裝包的時候,會自動安裝最新版本的包。如果需要安裝指定版本的包,可以在包名之后,通過 @ 符號指定具體的版本,例如:
npm i moment@2.22.2
4、包的語義化版本規(guī)范
包的版本號是以“點(diǎn)分十進(jìn)制”形式進(jìn)行定義的,總共有三位數(shù)字,例如 2.24.0
其中每一位數(shù)字所代表的的含義如下:
第1位數(shù)字:大版本
第2位數(shù)字:功能版本
第3位數(shù)字:Bug修復(fù)版本
版本號提升的規(guī)則:只要前面的版本號增長了,則后面的版本號歸零。
3.3 包管理配置文件
npm 規(guī)定,在項目根目錄中,必須提供一個叫做 package.json 的包管理配置文件。用來記錄與項目有關(guān)的一些配置信息。例如:
項目的名稱、版本號、描述等
項目中都用到了哪些包
哪些包只在開發(fā)期間會用到
那些包在開發(fā)和部署時都需要用到
1、多人協(xié)作的問題
遇到的問題:第三方包的體積過大,不方便團(tuán)隊成員之間共享項目源代碼。
解決方案:共享時剔除node_modules
2、如何記錄項目中安裝了哪些包
在項目根目錄中,創(chuàng)建一個叫做 package.json 的配置文件,即可用來記錄項目中安裝了哪些包。從而方便剔除 node_modules 目錄之后,在團(tuán)隊成員之間共享項目的源代碼。
注意:今后在項目開發(fā)中,一定要把 node_modules 文件夾,添加到 .gitignore 忽略文件中。
3、快速創(chuàng)建 package.json
npm 包管理工具提供了一個快捷命令,可以在執(zhí)行命令時所處的目錄中,快速創(chuàng)建 package.json 這個包管理配置文件:
npm init -y
注意:
(1)上述命令只能在英文的目錄下成功運(yùn)行!所以,項目文件夾的名稱一定要使用英文命名,不要使用中文,不能出現(xiàn)空格。
(2)@運(yùn)行 npm install 命令安裝包的時候,npm 包管理工具會自動把包的名稱和版本號,記錄到 package.json 中。
特別注意:現(xiàn)在的版本安裝包會自動生成package.json。
4、dependencies 節(jié)點(diǎn)
package.json 文件中,有一個 dependencies 節(jié)點(diǎn),專門用來記錄您使用 npm install 命令安裝了哪些包。
5、一次性安裝所有的包
當(dāng)我們拿到一個剔除了 node_modules 的項目之后,需要先把所有的包下載到項目中,才能將項目運(yùn)行起來。 否則會報類似于下面的錯誤:
可以運(yùn)行 npm install 命令(或 npm i)一次性安裝所有的依賴包:
6、卸載包
可以運(yùn)行 npm uninstall 命令,來卸載指定的包:
npm uninstall 具體的包名
注意:npm uninstall 命令執(zhí)行成功后,會把卸載的包,自動從 package.json 的 dependencies 中移除掉。卸載沒有簡寫。
7、devDependencies 節(jié)點(diǎn)
如果某些包只在項目開發(fā)階段會用到,在項目上線之后不會用到,則建議把這些包記錄到 devDependencies 節(jié)點(diǎn)中。
與之對應(yīng)的,如果某些包在開發(fā)和項目上線之后都需要用到,則建議把這些包記錄到 dependencies 節(jié)點(diǎn)中。
您可以使用如下的命令,將包記錄到 devDependencies 節(jié)點(diǎn)中:
3.4 解決下包速度慢的問題
1、為什么下包速度慢
在使用 npm 下包的時候,默認(rèn)從國外的 registry.npmjs.org/ 服務(wù)器進(jìn)行下載,因此下包速度會很慢。
2、淘寶 NPM 鏡像服務(wù)器
淘寶在國內(nèi)搭建了一個服務(wù)器,專門把國外官方服務(wù)器上的包同步到國內(nèi)的服務(wù)器,然后在國內(nèi)提供下包的服務(wù)。從而極大的提高了下包的速度。
擴(kuò)展: 鏡像(Mirroring)是一種文件存儲形式,一個磁盤上的數(shù)據(jù)在另一個磁盤上存在一個完全相同的副本即為鏡像。
3、切換 npm 的下包鏡像源
下包的鏡像源,指的就是下包的服務(wù)器地址。
4、nrm
為了更方便的切換下包的鏡像源,我們可以安裝 nrm 這個小工具,利用 nrm 提供的終端命令,可以快速查看和切換下包的鏡像源。
3.5 包的分類
使用 npm 包管理工具下載的包,共分為兩大類,分別是:
項目包
全局包
1、項目包
那些被安裝到項目的 node_modules 目錄中的包,都是項目包。
項目包又分為兩類,分別是:
開發(fā)依賴包(被記錄到 devDependencies 節(jié)點(diǎn)中的包,只在開發(fā)期間會用到)
核心依賴包(被記錄到 dependencies 節(jié)點(diǎn)中的包,在開發(fā)期間和項目上線之后都會用到)
2、全局包 在執(zhí)行 npm install 命令時,如果提供了 -g 參數(shù),則會把包安裝為全局包。
全局包會被安裝到 C:\Users\用戶目錄\AppData\Roaming\npm\node_modules 目錄下。
注意:
(1)只有工具性質(zhì)的包,才有全局安裝的必要性。因?yàn)樗鼈兲峁┝撕糜玫慕K端命令。
(2)判斷某個包是否需要全局安裝后才能使用,可以參考官方提供的使用說明即可。
3、i5ting_toc
i5ting_toc 是一個可以把 md 文檔轉(zhuǎn)為 html 頁面的小工具,使用步驟如下:
3.6 規(guī)范的包結(jié)構(gòu)
在清楚了包的概念、以及如何下載和使用包之后,接下來,我們深入了解一下包的內(nèi)部結(jié)構(gòu)。
一個規(guī)范的包,它的組成結(jié)構(gòu),必須符合以下 3 點(diǎn)要求:
(1)包必須以單獨(dú)的目錄而存在
(2)包的頂級目錄下要必須包含 package.json 這個包管理配置文件
(3)package.json 中必須包含 name,version,main 這三個屬性,分別代表包的名字、版本號、包的入口。
注意:以上 3 點(diǎn)要求是一個規(guī)范的包結(jié)構(gòu)必須遵守的格式,關(guān)于更多的約束,可以參考如下網(wǎng)址:https://yarnpkg.com/zh-Hans/docs/package-json
3.7 開發(fā)屬于自己的包
1、初始化包的基本結(jié)構(gòu)
(1)新建一個itheima-tools文件夾,作為包的根目錄
(2)在itheima-tools文件夾中,新建如下三個文件:
package.json (包管理配置文件)
index.js (包的入口文件)
README.md (包的說明文檔)
2、初始化 package.json
注:name—用于告知應(yīng)用程序或軟件包的名稱;version—表明了當(dāng)前的版本;main—設(shè)置了應(yīng)用程序的入口點(diǎn);description是應(yīng)用程序/軟件包的簡短描述;keywords—此屬性包含與軟件包功能相關(guān)的關(guān)鍵字?jǐn)?shù)組(有助于瀏覽node官網(wǎng)找到該軟件包);license—指定軟件包的許可證。
3、編寫包的說明文檔
包根目錄中的 README.md 文件,是包的使用說明文檔。通過它,我們可以事先把包的使用說明,以 markdown 的格式寫出來,方便用戶參考。
README 文件中具體寫什么內(nèi)容,沒有強(qiáng)制性的要求;只要能夠清晰地把包的作用、用法、注意事項等描述清楚即可。
3.8 發(fā)布包
1、注冊 npm 賬號
(1)訪問 www.npmjs.com/ 網(wǎng)站,點(diǎn)擊 sign up 按鈕,進(jìn)入注冊用戶界面
(2)填寫賬號相關(guān)的信息:Full Name、Public Email、Username、Password
(3)點(diǎn)擊 Create an Account 按鈕,注冊賬號
(4)登錄郵箱,點(diǎn)擊驗(yàn)證鏈接,進(jìn)行賬號的驗(yàn)證
2、登錄 npm 賬號
npm 賬號注冊完成后,可以在終端中執(zhí)行 npm login 命令,依次輸入用戶名、密碼(密碼是隱藏的,看不到,只管輸入正確回車即可)、郵箱、發(fā)送到郵箱的OTP code后,即可登錄成功。
注意:在運(yùn)行 npm login 命令之前,必須先把下包的服務(wù)器地址切換為 npm 的官方服務(wù)器。(如果之前是用的taobao服務(wù)器一定要切換為npm官方服務(wù)器)否則會導(dǎo)致發(fā)布包失??!
3、把包發(fā)布到 npm 上
將終端切換到包的根目錄之后,運(yùn)行 npm publish 命令,即可將包發(fā)布到 npm 上(注意:包名不能雷同,可以去官網(wǎng)查是否有重名的包)。
4、刪除已發(fā)布的包
運(yùn)行 npm unpublish 包名 --force 命令,即可從 npm 刪除已發(fā)布的包。
注意:
(1)npm unpublish 命令只能刪除 72 小時以內(nèi)發(fā)布的包
(2)npm unpublish 刪除的包,在 24 小時內(nèi)不允許重復(fù)發(fā)布
(3)發(fā)布包的時候要慎重,盡量不要往 npm 上發(fā)布沒有意義的包!
4.1 優(yōu)先從緩存中加載
模塊在第一次加載后會被緩存。 這也意味著多次調(diào)用 require() 不會導(dǎo)致模塊的代碼被執(zhí)行多次。
注意:不論是內(nèi)置模塊、用戶自定義模塊、還是第三方模塊,它們都會優(yōu)先從緩存中加載,從而提高模塊的加載效率。
4.2 內(nèi)置模塊的加載機(jī)制
內(nèi)置模塊是由 Node.js 官方提供的模塊,內(nèi)置模塊的加載優(yōu)先級最高。
例如:require('fs') 始終返回內(nèi)置的 fs 模塊,即使在 node_modules 目錄下有名字相同的包也叫做 fs。
4.3 自定義模塊的加載機(jī)制
使用 require() 加載自定義模塊時,必須指定以 ./ 或 ../ 開頭的路徑標(biāo)識符。在加載自定義模塊時,如果沒有指定 ./ 或 ../ 這樣的路徑標(biāo)識符,則 node 會把它當(dāng)作內(nèi)置模塊或第三方模塊進(jìn)行加載。
同時,在使用 require() 導(dǎo)入自定義模塊時,如果省略了文件的擴(kuò)展名,則 Node.js 會按順序分別嘗試加載以下的文件:
(1)按照確切的文件名進(jìn)行加載
(2)補(bǔ)全 .js 擴(kuò)展名進(jìn)行加載
(3)補(bǔ)全 .json 擴(kuò)展名進(jìn)行加載
(4)補(bǔ)全 .node 擴(kuò)展名進(jìn)行加載
(5)加載失敗,終端報錯
4.4 第三方模塊的加載機(jī)制
如果傳遞給 require() 的模塊標(biāo)識符不是一個內(nèi)置模塊,也沒有以 ‘./’ 或 ‘../’ 開頭,則 Node.js 會從當(dāng)前模塊的父目錄開始,嘗試從 /node_modules 文件夾中加載第三方模塊。
如果沒有找到對應(yīng)的第三方模塊,則移動到再上一層父目錄中,進(jìn)行加載,直到文件系統(tǒng)的根目錄。
例如,假設(shè)在 'C:\Users\itheima\project\foo.js' 文件里調(diào)用了 require('tools'),則 Node.js 會按以下順序查找:
(1)C:\Users\itheima\project\node_modules\tools
(2)C:\Users\itheima\node_modules\tools
(3)C:\Users\node_modules\tools
(4)C:\node_modules\tools
4.5 目錄作為模塊
當(dāng)把目錄作為模塊標(biāo)識符,傳遞給 require() 進(jìn)行加載的時候,有三種加載方式:
(1)在被加載的目錄下查找一個叫做 package.json 的文件,并尋找 main 屬性,作為 require() 加載的入口
(2)如果目錄里沒有 package.json 文件,或者 main 入口不存在或無法解析,則 Node.js 將會試圖加載目錄下的 index.js 文件。
(3)如果以上兩步都失敗了,則 Node.js 會在終端打印錯誤消息,報告模塊的缺失:Error: Cannot find module 'xxx'
關(guān)于“Node.js中的模塊化概念是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
文章題目:Node.js中的模塊化概念是什么
網(wǎng)址分享:http://jinyejixie.com/article40/gpideo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、云服務(wù)器、微信小程序、外貿(mào)網(wǎng)站建設(shè)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)