package.json 中的相依性模組紀錄

 
當我們在開發一個專案或模組時,多少會依賴其他的子模組。此時,我們在安裝子模組的時候,習慣會在 npm install 時帶上 --save 旗標 (npm 常用命令指南),在安裝模組的同時,順便將這個紀錄儲存到 package.json 的 "dependencies" 物件下。相信這對於習慣 node 與 npm 整個體系的人,應該不陌生。
$ npm install foo_module --save
(p.s. 除了用上述方式,你也可以直接編輯 package.json 來指定相依性,很彈性的)

dependencies 與 devDependecies

下面是一個典型 package.json 檔的一小部分,裡面 "dependencies" 紀錄的,都是 mqtt-node 這個模組執行時所必要的依賴模組們,也是我們下 npm install 或 npm install --production 必然會安裝的模組。
{
  "name": "mqtt-node",
  "version": "0.3.10",
  ...
  "dependencies": {
    "busyman": "^0.2.0",
    "mqtt": "^1.5.0",
    "smartobject": "^0.1.3",
    ...
  },
  "devDependencies": {
    "chai": "^3.5.0",
    "mocha": "^2.5.3",
    "sinon": "^1.17.4",
    "sinon-chai": "^2.8.0"
  }
}
而 "devDependencies" 指的是,在開發階段會使用到的模組,例如這個例子裡用到的測試框架 mocha 與斷言庫 chai,都是開發階段使用的工具,因此不需要在產品部署時安裝上去。像這一類的模組還有 benchmark 工具、mock client/server 或協助測試用的 fake things,我們會在安裝時帶上 --save-dev 來將它們歸類至 "devDependencies",例如:
$ npm install bar_module --save-dev

當之後我們在一個乾淨的專案底下(已配有 package.json) 執行 npm install 時,這些相依模組都會被安裝;如果帶上 --production 旗標則歸類在  "devDependencies" 的模組們就不會被安裝,以節省空間。
 
除了這兩個很常見的相依性關聯,還有 "peerDependencies" 與 "optionalDepencies" 兩種。

peerDependencies

這是在告訴「你的模組使用者」,我的模組要正常工作,你要先安裝有某某模組。如下例:
{
  ...
  "peerDependencies": {
    "bar": "^3.0.0"
  }
}
當使用者 npm install 時,npm 會檢查 bar 的 3.x.x 版本是否存在,如果找不到就會中止安裝。這常常會在一些 plugin 或 middleware 模組的 package.json 中看到,以下是 purifycss 這支 webpack 的 plugin 的例子:
{
  "name": "purifycss-webpack-plugin",
  "version": "2.0.3",
  ...
  "peerDependencies": {
    "webpack": "^1.9.11"
  },
  ...
}
當然,有些開發者不一定會乖乖寫 "peerDependencies";可能是因為不管怎樣,到執行期還是會出錯吧 XDD.... 反正裝的人,到時候看到錯誤就知道啦!
 

optionalDependencies

這個就真的很少見。他的意思是說,這些模組 npm 會試著安裝它們,但沒裝也不會怎樣,即便 npm 找不到那個 package 來安裝也不會出現錯誤。這有一點像 Plan A 跟 Plan B 的概念,optional 可能是 Plan A,有的話最好,但如果在執行時發現沒有 Plan A,那就用 Plan B。以下是一個 package.json 範例:
{
  ...
  "optionalDependencies": {
    "foo": "^1.2.0"
  }
}
我們在程式碼中可能會這樣寫:
try {
    var foo = require('foo');            // Plan A
} catch (e) {
    var foo = require('../lib/foo.js');  // Plan B
}





simen

An enthusiastic engineer with a passion for learning. After completing my academic journey, I worked as an engineer in Hsinchu Science Park. Later, I ventured into academia to teach at a university. However, I have now returned to the industry as an engineer, again.

Post a Comment (0)
Previous Post Next Post