Blackbing Playground

Secrets in npm package.json

講個秘訣

在用 npm 來管理 node package 時,愚昧如我只會用 npm install 來 install package,在歷經一些痛苦之後決定好好來看一下 package.json 的秘密。

dependencies V.S. devDependencies

區分專案的開發時的模組相依性。一般來說開發時都會用 npm i $PACKAGE_NAME --save-dev 這樣就會設定成該模組的 devDependency。但如果參數是給 --save 就會是 dependency。這是用來區別 production mode 時不需要下載 devDependency 的 package。

需要注意的是,npm install 預設會載入 devDependency 的 package,若是在 production mode 時,要做
npm i --production 指定只載入 dependency 的 package,如此就不會多載入一些開發才需要用到的 package。

npm scripts

不知道有沒有人跟我一樣,看到 Caesar 大大這個討論串,多想三秒,其實可以不用 grunt & gulp.,才發現原來 npm 可以自訂 scripts,然後傻傻的打 npm watch,結果不能執行,後來查了一下才知道 npm 有預設的指令,如果要執行自訂的指令要用 npm run xxx來執行。所以可以搭配一些 shell 指令來簡單的做你想做的事情。

pre/post scripts

然後在看 npm scripts 時看到一個蠻有趣的用法。

Pre and post commands with matching names will be run for those as well (e.g. premyscript, myscript, postmyscript).

簡單來說可以分開執行 script 的順序,在做複雜的指令還蠻好用的。 例如你可以自訂:

1
2
3
4
5
{
"scripts": {
"bingo": "echo Bingo"
}
}

所以當執行 npm bingo 就會 echo Bingo,接著加上 pre/post 的話,例如:

1
2
3
4
5
6
7
{
"scripts": {
"bingo": "echo Bingo",
"prebingo": "echo Hello",
"postbingo": "echo World"
}
}

這樣執行 npm bingo 就會 echo

1
2
3
Hello
Bingo
World

舉例來說,我會搭配 bower 來管理前端需要用的 package,我就可以加上 postinstall 的指令來做 bower install。

1
2
3
4
5
{
"scripts": {
"postinstall": "bower install"
}
}

當執行 npm install 之後就會接著做 bower install

所以 ReadME 就不用再寫 Step1, Step2, …。只要 npm install 就可以搞定啦,而且 jenkins 的 job 設定也可以變的比較一致性了,專案自己該做的事情就寫在這些 scripts 即可。回過頭來說,「多想三秒,你真的可以不用 grunt & gulp.」

package version control

不知道有沒有人注意到,在執行 npm install $PACKAGE_NAME 時,他會指定成 “^1.2.3”,這是 follow https://github.com/npm/node-semver 的版本號規則。

需要注意的是預設的 “^1.2.3”,意思是 [ '>=1.2.3-0', '<2.0.0-0' ],所以若 package 版本有更新,會自己升上去。最近幾次有遇到 jenkins 自己莫名其妙 build fail 就是因為版本不同而造成的問題。建議可以改成 “~1.2.3” [ '>=1.2.3', '<1.3.0' ] 或是寫死版本 “=1.2.3”,再視專案而定更新就好。團隊開發時版本的控制很重要,沒有指定好大家拉不同的 code 常常會造成浪費時間的 debug。其他更詳細的用法就在參考 https://github.com/npm/node-semver 囉。

npm outdated

有空可以執行 npm outdated 來檢查 package 的更新,視情況而決定是否要更新 package。建議是開 feature branch 來做 upgrade package,沒問題再 merge 回去。

以上,這些大概是開發常會遇到的一些心得與秘訣,如果想看更詳細的解釋就請直接看 doc 啦。

References: