1. 程式人生 > >20181203——關於package.json與package-lock.json檔案

20181203——關於package.json與package-lock.json檔案

以前一直在糾結一個npm安裝的包依賴管理的問題。是這樣的:

我們在使用npm install 安裝模組或外掛的時候,有兩種命令把他們寫入到 package.json 檔案裡面去,他們是:

--save-dev

--save

首先需要說明的是Dependencies一詞的中文意思是依賴和附屬的意思,而dev則是develop(開發)的簡寫。
所以它們的區別在 package.json 檔案裡面體現出來的就是,使用 --save-dev 安裝的 外掛,被寫入到 devDependencies 域裡面去,而使用 --save 安裝的外掛,則是被寫入到 dependencies 區塊裡面去。
那 package.json 檔案裡面的 devDependencies 和 dependencies 物件有什麼區別呢?

devDependencies 裡面的外掛只用於開發環境,不用於生產環境,而 dependencies 是需要釋出到生產環境的。比如我們寫一個專案要依賴於jQuery,沒有這個包的依賴執行就會報錯,這時候就把這個依賴寫入dependencies ;而我們使用的一些構建工具比如glup、webpack這些只是在開發中使用的包,上線以後就和他們沒關係了,所以將它寫入devDependencies。

{
  "name": "webpackdemo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.26.1",
    "webpack-cli": "^3.1.2"
  }
}



關於package-lock.json檔案

它有什麼用呢?因為npm是一個用於管理package之間依賴關係的管理器,它允許開發者在pacakge.json中間標出自己專案對npm各庫包的依賴。你可以選擇以如下方式來標明自己所需要庫包的版本

這裡舉個例子:

“dependencies”: {
“@types/node”: “^8.0.33”,
},

這裡面的 向上標號^是定義了向後(新)相容依賴,指如果 types/node的版本是超過8.0.33,並在大版本號(8)上相同,就允許下載最新版本的 types/node庫包,例如實際上可能執行npm install時候下載的具體版本是8.0.35。波浪號

大多數情況這種向新相容依賴下載最新庫包的時候都沒有問題,可是因為npm是開源世界,各庫包的版本語義可能並不相同,有的庫包開發者並不遵守嚴格這一原則:相同大版本號的同一個庫包,其介面符合相容要求。這時候使用者就很頭疼了:在完全相同的一個nodejs的程式碼庫,在不同時間或者不同npm下載源之下,下到的各依賴庫包版本可能有所不同,因此其依賴庫包行為特徵也不同有時候甚至完全不相容。

因此npm最新的版本就開始提供自動生成package-lock.json功能,為的是讓開發者知道只要你儲存了原始檔,到一個新的機器上、或者新的下載源,只要按照這個package-lock.json所標示的具體版本下載依賴庫包,就能確保所有庫包與你上次安裝的完全一樣。