網(wǎng)站域名使用費多少網(wǎng)絡(luò)營銷與直播電商學(xué)什么
Node.js:模塊 & 包
- 模塊
- module對象
- 包
- npm
- 安裝包
- 配置文件
- 鏡像源
- 分類
模塊
模塊化是指解決一個復(fù)雜問題時,自頂向下逐層把系統(tǒng)劃分成若干模塊的過程。對于整個系統(tǒng)來說,模塊是可組合、分解和更換的單元。
簡單來說,就是把一個大問題拆分成一系列小問題,然后逐個解決的過程。這就像是搭樂高積木,不是直接建造一個巨大的城堡,而是先建造城堡,花園等幾個小部分,然后再把它們組合起來。
如果后續(xù)某些功能不需要了,或者某些功能需要更新,只需要操作對應(yīng)的模塊即可,不需要改動整個程序。
再比如說,可能兩個程序需要一個相同的功能,那么就就可以把這個模塊復(fù)制兩份,給不同的程序使用。
所以模塊可以提高代碼的復(fù)用性,可維護性。
Node.js
中根據(jù)模塊來源的不同,將模塊分為了3 大類:
- 內(nèi)置模塊:內(nèi)置模塊是由
Node.js
官方提供的,例如fs
、path
、http
等 - 自定義模塊:用戶創(chuàng)建的每個
js
文件,都是自定義模塊 - 第三方模塊:由第三方開發(fā)出來的模塊,使用前需要先下載
想要加載一個模塊,可以使用require
方法:
const obj = require('模塊名')
const obj = require('模塊路徑')
對于內(nèi)置模塊和第三方模塊,只需要傳入模塊名即可,如果是自定義模塊,就需要填入模塊的路徑。
比如:
const test = requits('./test.js')
自定義模塊一定是一個.js
結(jié)尾的文件,所以也可以省略.js
后綴:
const test = requits('./test')
模塊被導(dǎo)入時,模塊內(nèi)部的代碼會立刻執(zhí)行一次。
./test.js
寫入以下代碼:
console.log('require test.js success')
在另一個文件中導(dǎo)入模塊:
const test = require('./test.js')
console.log(test)
輸出結(jié)果:
require test.js success
{}
在./test.js
中的代碼,就立刻執(zhí)行了一次,test
變量拿到了一個空對象。
module對象
在模塊中定義的變量、方法,都只能在模塊內(nèi)部被訪問,這種模塊級別的訪問限制,稱為模塊作用域
。
那么外部導(dǎo)入模塊后,又要如何訪問模塊的內(nèi)容?這就需要通過module
對象了。
在每一個.js
模塊中,都有一個module
對象,這里面存儲了當(dāng)前模塊的相關(guān)信息。
直接console.log
輸出這個對象:
{id: '.',path: 'D:\\code_web\\test\\Node\\02',exports: {},filename: 'D:\\code_web\\test\\Node\\02\\main.js',loaded: false,children: [],paths: ['D:\\code_web\\test\\Node\\02\\node_modules','D:\\code_web\\test\\Node\\node_modules','D:\\code_web\\test\\node_modules','D:\\code_web\\node_modules','D:\\node_modules'],[Symbol(kIsMainSymbol)]: true,[Symbol(kIsCachedByESMLoader)]: false,[Symbol(kIsExecuting)]: true
}
可以看到一些文件的相關(guān)信息,其中exports: {}
是一個空對象,通過exports
這個屬性可以向外共享模塊的內(nèi)容,默認(rèn)情況為空。當(dāng)外界通過require
導(dǎo)入模塊時,拿到的就是這個對象。
示例:
在test.js
中,將成員與方法添加到module.exports
中:
console.log('require test.js success')module.exports.username = "張三"
module.exports.sayHello = function(){console.log(this.username + " say hello")
}
在main.js
中導(dǎo)入模塊,并調(diào)用函數(shù):
const test = require('./test.js')
console.log(test)test.sayHello()
輸出結(jié)果:
require test.js success
{ username: '張三', sayHello: [Function (anonymous)] }
張三 say hello
此時test
變量,拿到的就是一個有內(nèi)容的對象,并且可以正常調(diào)用模塊內(nèi)的屬性與方法。
每次共享一個新的成員或方法,都要使用module.exports
,這有點麻煩了。為此Node.js
提供了exports
對象,它與module.exports
指向同一個對象,在編寫代碼時,可以使用簡寫。
exports.username = "張三"
exports.sayHello = function(){console.log(this.username + " say hello")
}
但是要注意,不要改變exports
指向的對象。
exports = {username: "李四",sayHello: function(){console.log(this.username + " say hello")}
}
如果在某個模塊內(nèi)部這樣寫,等到模塊導(dǎo)入后,拿到的是一個空對象,而不是exports
指向的對象。因為以上代碼相當(dāng)于把exports
指向了一個新的對象,此時module.exports
和exports
指向不同,導(dǎo)入模塊最終以module.exports
為準(zhǔn),所以exports
就失效了。
包
在Node.js
中,第三方模塊又稱為包
。
Node.js
的內(nèi)置模塊功能較少,基于內(nèi)置模塊開發(fā)效率很低,因此很多第三方封裝了更加高級方便的模塊,并公開給大家使用。
npm
如果包太多,那么每個不同的包都要去不同的地方下載,這樣很麻煩。但是npm
建立了一個包共享平臺,很多程序員都會把自己封裝的包提交到這個平臺,因此我們就可以通過npm
來快速下載所需的包。
官方網(wǎng)址:
https://www.npmjs.com/
安裝包
下載包的命令:
npm install 包名
npm i 包名
i
是install
的簡寫,兩種格式都可以下載包。
刪除包的命令:
npm uninstell 包名
下載一個moment
包:
這個包是一個時間相關(guān)的包,使用時直接以普通模塊的形式導(dǎo)入即可:
const moment = require('moment')const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt)
此處moment().format('YYYY-MM-DD HH:mm:ss')
,用于格式化輸出當(dāng)前時間。
輸出結(jié)果:
2024-10-30 20:40:36
配置文件
在第一次裝包后,同級目錄會出現(xiàn)以下文件:
node_modules
存儲了所有下載的包,比如剛下載的moment
,而.package-lock,json
是包的相關(guān)信息,內(nèi)容如下:
{"name": "02","lockfileVersion": 3,"requires": true,"packages": {"": {"dependencies": {"moment": "^2.30.1"}},"node_modules/moment": {"version": "2.30.1","resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz","integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==","license": "MIT","engines": {"node": "*"}}}
}
這里面保存了下載的包的相關(guān)信息,比如下載版本,下載來源等等。
如果想要下載指定版本的包,語法如下:
npm install 包名@版本號
npm i 包名@版本號
例如安裝moment:2.22.2
版本:
顯示修改了一個包,也就是之前的2.30.1
版本被覆蓋了。
除去node_modules
和.package-lock,json
,還可以找到一個package,json
文件:
這個文件與node_modules
同級,內(nèi)部包含dependencies
屬性:
{"dependencies": {"moment": "^2.30.1"}
}
比如再下載一個jQuery
:
此時package,json
文件更新:
{"dependencies": {"jquery": "^3.7.1","moment": "^2.30.1"}
}
這里記錄了所有下載過的包,當(dāng)拿到一個項目時,往往不會提供node_modules
目錄,因為這個目錄很大,不利于傳輸。因此會提供一個package,json
文件,這個文件可以幫助快速下載所有依賴的包。
npm install
npm i
當(dāng)npm install
不帶任何包名,就會去下載package,json
文件中指定的所有包,快速初始化項目。
package,json
文件不在node_modules
目錄內(nèi)部,而是與node_modules
同級,就是因為多人協(xié)作時node_modules
往往不會發(fā)送給同事,而是發(fā)送package,json
來初始化項目。
鏡像源
默認(rèn)情況下,npm
會去https://registry.npmjs.org/
這個網(wǎng)址下載包,但是這是一個國外的網(wǎng)址,下載速度比較慢。
為此,淘寶在國內(nèi)建立了一個鏡像站https://registry.taobao.org/
,這個網(wǎng)站會實時同步https://registry.npmjs.org/
,所以國內(nèi)用戶可以修改鏡像源為這個淘寶的鏡像源,提升下載效率。
查看當(dāng)前鏡像源:
npm config get registry
安裝nrm
工具:
npm i nrm -g
查看可用的鏡像源:
nrm ls
切換到淘寶鏡像源:
nrm use taobao
分類
包分為項目包
與全局包
:
項目包
:只供一個項目使用的,安裝到node_modules
目錄下的包全局包
:主機上所有項目都可以使用的包
如果想要安裝或卸載全局包,只需要加上-g
參數(shù)即可:
npm i -g 包名
npm uninstall -g 包名
先前安裝的nrm
,就是按照全局安裝的,這樣后續(xù)所有項目下載包時,都會使用淘寶的鏡像源。