package.json
里面定義的是版本范圍(比如^1.0.0
),具體跑npm install
的時候安的什么版本,要解析后才能決定,這里面定義的依賴關系樹,可以稱之為邏輯樹(logical tree)。
node_modules
文件夾下才是npm實際安裝的確定版本的東西,這里面的文件夾結構我們可以稱之為物理樹(physical tree)。
安裝過程中有一些去重算法,所以你會發現邏輯樹結構和物理樹結構不完全一樣。
package-lock.json
可以理解成對結合了邏輯樹和物理樹的一個快照(snapshot),里面有明確的各依賴版本號,實際安裝的結構,也有邏輯樹的結構。
其最大的好處就是能獲得可重復的構建(repeatable build),當你在CI(持續集成)上重復build的時候,得到的artifact是一樣的,因為依賴的版本都被鎖住了。在npm5以后,其內容和npm-shrinkwrap.json
一模一樣。
這些在npm官網文檔都有詳細解釋。