package.json
在 Node.js 中,模塊是一個庫或框架,也是一個 Node.js 項目。Node.js 項目遵循模塊化的架構,當我們創建了一個 Node.js 項目,意味着創建了一個模塊,這個模塊的描述文件,被稱為 package.json。
package.json 屬性說明:
- name - 包名;
- version - 包的版本號;
- description - 包的描述;
- homepage - 包的官網URL;
- author - 包的作者,它的值是你在 https://npmjs.org 網站的有效賬戶名,遵循“賬戶名<郵件>”的規則,例如:zhangsan <zhangsan@163.com>;
- contributors - 包的其他貢獻者;
- dependencies / devDependencies - 生產/開發環境依賴包列表。它們將會被安裝在 node_module 目錄下;
- repository - 包代碼的 Repo 信息,包括 type 和 URL,type 可以是 git 或 svn,URL 則是包的 Repo 地址;
- main - main 字段指定了程序的主入口文件,這個字段的默認值是模塊根目錄下面的 index.js;
- keywords - 關鍵字
每個項目的根目錄下面,一般都有一個 package.json 文件,定義了這個項目所需要的各種模塊,以及項目的配置信息(比如名稱、版本、許可證等元數據)。`npm install` 命令根據這個配置文件,自動下載所需的模塊,也就是配置項目所需的運行和開發環境。package.json 文件可以手工編寫,也可以使用 `npm init` 命令自動生成。
package-lock.json
package-lock.json 是在 `npm install` 時候生成一份文件,用以記錄當前狀態下實際安裝的各個 npm package 的具體來源和版本號。package-lock.json 文件的作用鎖定安裝時的包的版本號,並且需要上傳到 git,以保證其他人在 `npm install` 時大家的依賴能保證一致。
它有什么用呢?因為 npm 是一個用於管理 package 之間依賴關系的管理器,它允許開發者在 pacakge.json 中標出自己項目對 npm 各庫包的依賴。可以選擇以如下方式來標明自己所需要庫包的版本
"dependencies": { "@angular/core": "~7.2.0", "tslib": "^1.9.0" } //package.json
這里面的向上標號^ 是定義了向后(新)兼容依賴,指如果 tslib 版本是超過1.9.0,並在大版本號(1)上相同,就允許下載最新版本的 tslib 庫包,例如實際上可能運行 `npm install` 時候下載的具體版本是1.9.3。波浪號大多數情況這種向新兼容依賴下載最新庫包的時候都沒有問題,可是因為npm是開源世界,各庫包的版本語義可能並不相同,有的庫包開發者並不遵守嚴格這一原則:相同大版本號的同一個庫包,其接口符合兼容要求。這時候用戶就很頭疼了:在完全相同的一個 nodejs 的代碼庫,在不同時間或者不同 npm 下載源之下,下到的各依賴庫包版本可能有所不同,因此其依賴庫包行為特征也不同有時候甚至完全不兼容。
因此 npm 最新的版本就開始提供自動生成 package-lock.json 功能,為的是讓開發者知道只要你保存了源文件,到一個新的機器上、或者新的下載源,只要按照這個 package-lock.json 所標示的具體版本下載依賴庫包,就能確保所有庫包與你上次安裝的完全一樣。
"tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" } //package-lock.json
廣州品牌設計公司https://www.houdianzi.com PPT模板下載大全https://redbox.wode007.com
版本號
指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式規定,安裝時只安裝指定版本。
- (1) 波浪號(tilde)+指定版本:比如~1.2.2,表示安裝1.2.x的最新版本(不低於1.2.2),但是不安裝1.3.x,也就是說安裝時不改變大版本號和次要版本號。
- (2) 插入號(caret)+指定版本:比如ˆ1.2.2,表示安裝1.x.x的最新版本(不低於1.2.2),但是不安裝2.x.x,也就是說安裝時不改變大版本號。需要注意的是,如果大版本號為0,則插入號的行為與波浪號相同,這是因為此時處於開發階段,即使是次要版本號變動,也可能帶來程序的不兼容。
- (3) latest:安裝最新版本
所以建議使用~來標記版本號,這樣可以保證項目不會出現大的問題,也能保證包中的小 bug 可以得到修復。
關於使用
package.json 文件只能鎖定大版本,也就是版本號的第一位,並不能鎖定后面的小版本,`npm install` 都是拉取的該大版本下的最新的版本,為了穩定性考慮我們幾乎是不敢隨意升級依賴包的,這將導致多出來很多工作量,測試/適配等,所以 package-lock.json 文件出來了,當你每次安裝一個依賴的時候就鎖定在你安裝的這個版本。
那如果我們安裝時的包有bug,后面需要更新怎么辦?
在以前可能就是直接改 package.json 里面的版本,然后再 `npm install` 了,但是 5 版本后就不支持這樣做了,因為版本已經鎖定在 package-lock.json 里了,所以我們只能 `npm install xxx@x.x.x` 這樣去更新我們的依賴,然后 package-lock.json 也能隨之更新。
