成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Node.js中的模塊化概念是什么

這篇文章主要介紹“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ù)。

Node.js中的模塊化概念是什么

一、模塊化的基本概念

1.1 什么是模塊化

模塊化是指解決一個復(fù)雜問題時,自頂向下逐層把系統(tǒng)劃分成若干模塊的過程。對于整個系統(tǒng)來說,模塊是可組合、分解和更換的單元。

編程領(lǐng)域中的模塊化,就是遵守固定的規(guī)則,把一個大文件拆成獨(dú)立并互相依賴的多個小模塊。

把代碼進(jìn)行模塊化拆分的好處:

  • 提高了代碼的復(fù)用性

  • 提高了代碼的可維護(hù)性

  • 可以實(shí)現(xiàn)按需加載

二、Node.js 中模塊化

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)行使用。例如:

Node.js中的模塊化概念是什么

注意:使用 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)的信息,打印如下:

Node.js中的模塊化概念是什么

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)。

Node.js中的模塊化概念是什么

4. exports 對象

由于 module.exports 單詞寫起來比較復(fù)雜,為了簡化向外共享成員的代碼,Node 提供了 exports 對象。默認(rèn)情況下,exports 和 module.exports 指向同一個對象。最終共享的結(jié)果,還是以 module.exports 指向的對象為準(zhǔn)。

Node.js中的模塊化概念是什么

5. exports 和 module.exports 的使用誤區(qū)

時刻謹(jǐn)記,require() 模塊時,得到的永遠(yuǎn)是 module.exports 指向的對象:

Node.js中的模塊化概念是什么

個人理解: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() 方法用于加載模塊。

三、npm與包

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 包管理工具的版本號:

Node.js中的模塊化概念是什么

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)行起來。 否則會報類似于下面的錯誤:

Node.js中的模塊化概念是什么

可以運(yùn)行 npm install 命令(或 npm i)一次性安裝所有的依賴包:

Node.js中的模塊化概念是什么

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)中:

Node.js中的模塊化概念是什么

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ù)在另一個磁盤上存在一個完全相同的副本即為鏡像。

Node.js中的模塊化概念是什么

3、切換 npm 的下包鏡像源

下包的鏡像源,指的就是下包的服務(wù)器地址。

Node.js中的模塊化概念是什么

4、nrm

為了更方便的切換下包的鏡像源,我們可以安裝 nrm 這個小工具,利用 nrm 提供的終端命令,可以快速查看和切換下包的鏡像源。

Node.js中的模塊化概念是什么

3.5 包的分類

使用 npm 包管理工具下載的包,共分為兩大類,分別是:

  • 項目包

  • 全局包

1、項目包

那些被安裝到項目的 node_modules 目錄中的包,都是項目包。

項目包又分為兩類,分別是:

  • 開發(fā)依賴包(被記錄到 devDependencies 節(jié)點(diǎn)中的包,只在開發(fā)期間會用到)

  • 核心依賴包(被記錄到 dependencies 節(jié)點(diǎn)中的包,在開發(fā)期間和項目上線之后都會用到)

Node.js中的模塊化概念是什么

2、全局包 在執(zhí)行 npm install 命令時,如果提供了 -g 參數(shù),則會把包安裝為全局包。

全局包會被安裝到 C:\Users\用戶目錄\AppData\Roaming\npm\node_modules 目錄下。

Node.js中的模塊化概念是什么

注意:

(1)只有工具性質(zhì)的包,才有全局安裝的必要性。因?yàn)樗鼈兲峁┝撕糜玫慕K端命令。

(2)判斷某個包是否需要全局安裝后才能使用,可以參考官方提供的使用說明即可。

3、i5ting_toc

i5ting_toc 是一個可以把 md 文檔轉(zhuǎn)為 html 頁面的小工具,使用步驟如下:

Node.js中的模塊化概念是什么

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

Node.js中的模塊化概念是什么

注: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ā)布包失??!

Node.js中的模塊化概念是什么

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ā)布沒有意義的包!

四、模塊的加載機(jī)制

4.1 優(yōu)先從緩存中加載

模塊在第一次加載后會被緩存。 這也意味著多次調(diào)用 require() 不會導(dǎo)致模塊的代碼被執(zhí)行多次。

Node.js中的模塊化概念是什么

注意:不論是內(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)

營銷型網(wǎng)站建設(shè)
稻城县| 竹溪县| 来凤县| 改则县| 辽宁省| 牙克石市| 夏邑县| 临清市| 阳西县| 百色市| 临夏县| 遂宁市| 永福县| 临清市| 张家口市| 新竹县| 唐河县| 汽车| 上栗县| 化隆| 衡东县| 洛浦县| 宜州市| 伊春市| 平舆县| 陇西县| 轮台县| 长宁区| 图们市| 巴南区| 彭州市| 华宁县| 金川县| 油尖旺区| 麻阳| 元朗区| 曲周县| 江源县| 沛县| 台北县| 沾益县|