Node.js使用npm對包進行管理曙求,全稱為Node Package Manager咧虎,開發(fā)人員可以使用它安裝贷掖、更新或者卸載Node.js模塊乔外。
npm在2020年3月17日被Github收購渊迁,而且保證永久免費楼眷。在npm倉庫中有超過130萬個軟件包贴谎,這是npm成為世界上最大的單一語言代碼倉庫慧库,并且它幾乎有可用于一切的軟件包逛揩。
package.json文件
在任意空白文件夾下執(zhí)行npm init -y
可以得到如下的package.json文件
{
"name": "bach_private_cache",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
對于Node.js程序柠傍,package.json文件中的內容沒有固定要求,唯一的要求是必須遵守JSON格式辩稽,否則惧笛,代碼訪問可能不能按預期訪問該文件。
package.json文件中的屬性含義
json文件中是不支持注釋的逞泄,以下只是為了方便映射閱讀
"name": "packageName",//應用程序或者軟件包的名稱患整。名稱必須少于214個字符,且不能包含空格喷众,只能含小寫字母各谚,連字符或下劃線
"version": "1.0.0",// 當前版本,該屬性遵循語義版本控制法到千,始終以三個數(shù)字(x.x.x)表示版本號昌渤,第一個數(shù)字表示主版本號,第二個數(shù)字表示次版本號憔四,第三個數(shù)字表示修訂號膀息。
"description": "",// 應用程序/軟件包的簡短描述。如果要將軟件包發(fā)布到npm了赵,該屬性將告知使用這軟件包的具體作用
"main": "index.js",// 設置應用程序的入口文件潜支,通常是index.js
"scripts": {// 定義一組可以運行的Node.js腳本
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack",
"start": "cross-env NODE_ENV=development webpack serve",
"build": "cross-env NODE_ENV=production MY_ENV=pro webpack ",
"debug": "node --inspect-brk=5858 ./node_modules/webpack/bin/webpack"
},
"keywords": [],// 關鍵字數(shù)組,用于npm搜索,包含與軟件包功能相關的關鍵字數(shù)組
"author": "",//軟件包的作者
"license": "ISC",//軟件包的許可證
"sideEffects": [// 告知webpack哪些文件是有副作用的斟览,讓webpack在做tree sharking的時候不要刪除
"./polyfill.js"
],
"contributors": [],//項目的貢獻者
"bugs":"",//鏈接到軟件包的問題跟蹤器毁腿,最常用的是Github的issue頁面
"homepage": "",//設置軟件包的主頁
"repository": "",//指定程序包倉庫所在位置
"private":"false",//軟件包是否是私有,如果設置為true,可以防止應用程序/軟件包被意外發(fā)布到npm上
"dependencies": {//設置作為依賴安裝的npm軟件包的列表
"core-js": "^3.36.1",
"css-loader": "^6.10.0",
"css-minimizer-webpack-plugin": "^6.0.0",
},
"devDependencies": {//開發(fā)依賴的軟件包,它們無須在生產環(huán)境使用
"@babel/cli": "^7.24.1",
},
"engines": "18.12.1",// 軟件包所支持的Node.js版本
"browserlist":"",//用于告知要支持哪些瀏覽器及版本
package-lock.json文件
在npm5以上的版本中,引入了package-lock.json文件已烤,該文件旨在跟蹤被安裝的每個軟件包的確切版本鸠窗,以便產品可以以相同的方式被100%復制。
舉個例子
package.json文件中有如下屬性:
"@babel/core": "^7.24.3""
版本號可以有三種表示方式
- ~7.24.3: 只更新補丁版本胯究,即7.24.4可以稍计,7.24.0不行
- ^7.24.3: 要更新補丁版本和次版本,即7.24.4可以裕循,7.24.0也行
- 7.24.3: 始終使用確切的版本
當使用npm install
命令在另一臺機器上復制項目是臣嚣,如果指定了~語法并且軟件包發(fā)布了補丁版本,則該補丁版本會被安裝剥哑,^語法中的此版本亦然硅则。
如果多人在不同的時間獲取同一個項目,使用npm install
安裝時株婴,有可能安裝的依賴包版本不同怎虫,這樣可能會給程序帶來不可預知的錯誤。而通過使用package-lock.json
文件困介,可以固化當前安裝的每個軟件包的版本大审,當運行npm install
時,npm會使用這些確切的版本座哩,確保每個人在任何時間安裝的版本都是一致的徒扶,避免package.json文件無法解決的版本不同問題。
如下package-lock文件中的片段代碼
"@babel/core": {
"version": "7.24.3",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz",
"integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
"dev": true,
"requires": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.24.2",
"@babel/generator": "^7.24.1",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helpers": "^7.24.1",
"@babel/parser": "^7.24.1",
"@babel/template": "^7.24.0",
"@babel/traverse": "^7.24.1",
"@babel/types": "^7.24.0",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.2.3",
"semver": "^6.3.1"
},
"dependencies": {
"semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
}
}
},
上面的代碼中根穷,由于在package-lock.json文件中使用了檢驗軟件包的integrity
散列值姜骡,這樣就可以保證所有人在任何時間安裝的依賴包的版本都是一致的。
注:
package-lock.json文件是需要將其提交到git倉庫的缠诅,他人下載后溶浴,在運行npm install
時乍迄,package-lock.json文件中的依賴版本也會跟著更新管引。