講個秘訣
在用 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 的順序,在做複雜的指令還蠻好用的。 例如你可以自訂:
|
|
所以當執行 npm bingo
就會 echo Bingo
,接著加上 pre/post 的話,例如:
這樣執行 npm bingo
就會 echo
|
|
舉例來說,我會搭配 bower 來管理前端需要用的 package,我就可以加上 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 啦。