先不要着急看鎖文件作用,我們一步一步來看它的形成
(1)初始化項目
npm init [--yes]表示跳過導航階段
關於詳細的npm用法,詳見下節文章npm模塊管理器
所以,當我們使用npm init初始化項目時,便生出了package.json 項目說明文件
除此之外,還拓展了關於script字段說明,詳解文章package.json中的script選項作用 .
(2)安裝依賴時,新生成package-lock.js鎖文件(注意:新版npm特有(5.xxx以上才有))
首先看下npm版本
這里大於5.xxx,所以接下來測試會生成,至於npm的版本控制和切換,詳見下文npm的版本控制和切換
接下來安裝Express模塊,如下所示
此時除了下載該依賴到node_modules文件夾外,還會新建一個package-loc.jsk鎖文件
(3)升級npm
如果你的npm版本低於5.xxx,可以升級后測試
所以,可以在 不升級node的情況下單獨升級npm,npm也就是一個和其他依賴一樣的包
注意:
npm版本5.xxx以上,下載第三方包時,如果不加--save或者--save-dev參數,則會默認添加到--save參數,將依賴分至dependdencies生產依賴里
(4)查找依賴包
當下載好Express依賴包以后,跟它的相關依賴都會下載下來,我們可以看下Express依賴包
而其相關依賴還有其他依賴項,例如accept包還依賴了其他包
而package-lock.json鎖文件則包含了整個項目的依賴樹
version版本
resolved下載地址
此時可以通過下載地址查看下該依賴包,如下所示
(5)作用
1、當下載依賴時提升下載速度(這只是其中一項作用)
2、lock鎖用來鎖定版本,避免開發周期較長,部分依賴版本升級帶來的問題
(6)測試鎖文件作用
這里涉及到npm下載和卸載依賴相關操作,具體詳見文章npm相關依賴操作+版本問題.
(7)為什么需要package鎖
有如下幾個可能原因, 在某些情況下, package.json是無法保證每個人自己電腦上執行的 npm install 后安裝的依賴版本都是一樣的
1.如果package.json中記錄的依賴包的版本是一個版本范圍, 一旦執行npm i 會導致這個包更新到最新版本 2.就算你依賴了一個固定版本的包(如A 1.1.1), 但你依賴的包A可能依賴其他的包B,而A在聲明依賴時可能也使用了semser命名, 如 ^1.2.3, 如果包B release 了新版,
也會導致包B會安裝到更新版本 3.不同人使用的npm程序的版本不同
通俗理解:
package-lock.json主要用於避免依賴的依賴升級問題,帶來的麻煩
如果依賴包的版本不一致, 會導致開發環境和生產環境產品不一致的行為; 或者導致不同團隊成員之前也產品環境差異
(8)如何解決包版本不一致的情況
1.npm 使用package-lock.json文件來解決這個問題
執行npm install會自動生成package.json文件, 只要執行普通的安裝, 更新等可能會修改 package.json的npm命令, 都會自動同步修改package-lock.json文件
npm install xxx
npm rm xxx
npm update xxx
2.npm 還支持npm-shrinkwrap.json, 和package-lock.json功能完全一樣
執行 npm shrinkwrap
來生成npm-shrinkwrap.json
此命令將根據 package-lock.json 文件創建一個新的或覆蓋已有的 npm-shrinkwrap.json 文件。 此命令創建和更新的文件將優先於任何其他現有或將有的 package-lock.json 文件。
3.使用yarn
使用yarn主要有一下優點
- 快速: 會緩存它下載的每個包,無需重復下載;能並行化操作以最大資源利用率
- 可靠:使用格式詳盡而又簡潔的 lockfile文件 和確定性算法來安裝依賴,能夠保證在一個系統上的運行的安裝過程也會以同樣的方式運行在其他系統上。
- 安全: 安裝包被執行前校驗其完整性
yarn速度比npm快一些, yarn的鎖文件是yarn.lock, 能解決包版本不一致的情況
.