nodemon 開發(fā)環(huán)境
在開發(fā)環(huán)境下乓梨,往往需要一個工具來自動重啟項目工程卿拴,node 有一個 npm 模塊 supervisior 也是用來監(jiān)控進程的庄拇,不過除了 supervisior 外墓阀,還有很多其他的工具,從 github 的評分上看渊胸,比較熱門的有 forever,nodemon台妆,node-dev翎猛,具體這些工具的區(qū)別可以參考這篇文章 Comparison: Tools to Automate Restarting Node.js Server After Code Changes,個人覺得在開發(fā)環(huán)境還是用 nodemon接剩,因為配置比較方便切厘,文檔也很清晰。所以這里先主要講 nodemon懊缺。
nodemon的安裝:
npm install -g nodemon
安裝完nodemon后疫稿,就可以用nodemon來代替node來啟動應(yīng)用
nodemon [your node app] (相當(dāng)于 node [your node app])
如果沒有在應(yīng)用中指定端口,可以在命令中指定:
nodemon ./server.js localhost 8080
可以運行debug模式:
nodemon --debug ./server.js 80
查看幫助,幫助里面有很多選項都是一目了然:
nodemon -h 或者 nodemon -help
nodemon 比較流行的原因之一就是它的可配置性比較高遗座,下面是官網(wǎng)給出的配置文件 nodemon.json 的例子舀凛,加上我自己了解到的有用的一些配置,開發(fā)環(huán)境建議可以把每個參數(shù)都寫上備用途蒋,生產(chǎn)環(huán)境就把沒有必要的參數(shù)去掉猛遍,有些字段是可以在命令行模式以參數(shù)形式給出的,可以通過 -h 查看号坡,下面逐個解釋:
{
"restartable": "rs",
"ignore": [
".git",
"node_modules/**/node_modules"
],
"verbose": true,
"execMap": {
"": "node"
"js": "node --harmony"
},
"events": {
"restart": "osascript -e 'display notification \"App restarted due to:\n'$FILENAME'\" with title \"nodemon\"'"
},
"watch": [
"test/fixtures/",
"test/samples/"
],
"env": {
"NODE_ENV": "development",
"PORT": "3000"
},
"ext": "js json",
"legacy-watch": false
}
restartable:重啟的命令懊烤,默認是 rs ,可以改成你自己喜歡的字符串宽堆。當(dāng)用 nodemon 啟動應(yīng)用時奸晴,可以直接鍵入 rs 直接重啟服務(wù)。除了字符串值外日麸,還可以設(shè)置 false 值寄啼,這個值的意思是當(dāng) nodemon 影響了你自己的終端命令時,設(shè)置為 false 則不會在 nodemon 運行期間監(jiān)聽 rs 的重啟命令代箭。
ignore:忽略的文件后綴名或者文件夾墩划,文件路徑的書寫用相對于 nodemon.json 所在位置的相對路徑,下同嗡综。nodemon 會默認忽略一些文件乙帮,默認忽略的文件有:.git, node_modules, bower_components, .sass-cache,如果這些文件想要加入監(jiān)控极景,需要重寫默認忽略參數(shù)字段 ignoreRoot察净,比如加入:"ignoreRoot": [".git", "bower_components", ".sass-cache"],然后在 watch 中將 node_modules 文件路徑加入監(jiān)控盼樟,那么 node_modules 內(nèi)的文件也加入了監(jiān)控了氢卡。
verbose:true 表示輸出詳細啟動與重啟信息。
execMap:運行服務(wù)的后綴名和對應(yīng)的運行命令晨缴,"js": "node --harmony" 表示用 nodemon 代替 node --harmony 運行 js 后綴文件译秦;"" 指 www 這些沒有后綴名的文件;默認的 defaults.js 配置文件會識別一些文件:py: 'python',rb: 'ruby'击碗。
events:這個字段表示 nodemon 運行到某些狀態(tài)時的一些觸發(fā)事件筑悴,總共有五個狀態(tài):
start - 子進程(即監(jiān)控的應(yīng)用)啟動
crash - 子進程崩潰,不會觸發(fā) exit
exit - 子進程完全退出稍途,不是非正常的崩潰
restart - 子進程重啟
config:update - nodemon 的 config 文件改變
狀態(tài)后面可以帶標(biāo)準輸入輸出語句阁吝,比如 mac 系統(tǒng)下設(shè)置: "start": "echo 'app start'",那么啟動應(yīng)用時會輸出 app start 信息械拍,其他類似命令如 ls突勇,ps 等等標(biāo)準命令都可以在這里定義装盯。除此之外,也可以寫js來監(jiān)控与境,github 上有介紹: events.md验夯,不過我試過之后沒有成功,如果有懂的朋友摔刁,記得在評論不吝賜教挥转。_
watch:監(jiān)控的文件夾路徑或者文件路徑。
env:運行環(huán)境 development 是開發(fā)環(huán)境共屈,production 是生產(chǎn)環(huán)境绑谣。port 是端口號。
ext:監(jiān)控指定后綴名的文件拗引,用空格間隔借宵。默認監(jiān)控的后綴文件:.js, .coffee, .litcoffee, .json。但是對于沒有文件后綴的文件矾削,比如 www 文件壤玫,我暫時找不到怎么用 nodemon 去監(jiān)控,就算在 watch 中包含了哼凯,nodemon 也會忽略掉欲间。
注:關(guān)于監(jiān)控以及忽略文件修改有個順序的問題,或者說優(yōu)先級断部,首先 nodemon 會先讀取 watch 里面需要監(jiān)控的文件或文件路徑猎贴,再從文件中選擇監(jiān)控 ext 中指定的后綴名,最后去掉從 ignore 中指定的忽略文件或文件路徑蝴光。
legacy-watch:nodemon 使用 Chokidar 作為底層監(jiān)控系統(tǒng)她渴,但是如果監(jiān)控失效,或者提示沒有需要監(jiān)控的文件時蔑祟,就需要使用輪詢模式(polling mode)趁耗,即設(shè)置 legacy-watch 為 true,也可以在命令行中指定:
$ nodemon --legacy-watch
$ nodemon -L # 簡寫
有幾個比較少用到的配置字段:
1)colous:輸出信息顏色標(biāo)示做瞪。
2)runOnChangeOnly:true 時運行 nodemon www 項目不會啟動对粪,只保持對文件的監(jiān)控,當(dāng)監(jiān)控的文件有修改并保存時才會啟動應(yīng)用装蓬,其他沒有影響。默認是 false 即一開始就啟動應(yīng)用并監(jiān)控文件改動纱扭。
3)stdin牍帚,stdout:這個是關(guān)于標(biāo)準輸入輸出的設(shè)置,上文提到 nodemon.json 文件中的 events 字段可以為狀態(tài)設(shè)置標(biāo)準輸入輸出語句乳蛾,如果這里設(shè)置了 false暗赶,標(biāo)準輸入輸入語句就會實效鄙币。
github 上給出了一個 faq.js 解答了一些常見的問題,有的上文已經(jīng)提到蹂随,還有一些比較常見的列舉如下:
1)當(dāng)自己的應(yīng)用啟動服務(wù)帶的參數(shù)和 nodemon 沖突時十嘿,可以利用下面的方法來解決沖突:
$ nodemon app.js -- -L -opt2 -opt3
以 -- 為分隔,nodemon 不會去讀取 -- 后面的參數(shù)岳锁,而是傳給 app.js绩衷。
2)當(dāng)應(yīng)用因為某些原因奔潰時,nodemon 不會自動重啟激率,會輸出以下信息:
[nodemon] app crashed - waiting for file changes before starting...
這個時需要修改文件并保存后 nodemon 才會重啟應(yīng)用咳燕,這在開發(fā)環(huán)境沒什么關(guān)系,但是如果想把 nodemon 放在線上時乒躺,我們往往希望 nodemon 能夠自動重啟崩潰的應(yīng)用招盲,這個時候就需要 forever 來輔助了,有一個 issue 專門講這個問題嘉冒。使用 forever 來重啟 nodemon 時曹货,在 nodemon 啟動時需要加個參數(shù) --exitcrash:
nodemon www --exitcrash
這樣當(dāng)應(yīng)用崩潰后,nodemon 會自動中斷退出讳推,forever 檢測到 nodemon 退出后就會重啟 nodemon顶籽,nodemon 又會重啟應(yīng)用。其他就是 forever 的配置了娜遵,因為這里只講 nodemon蜕衡,所以就不涉及 forever,到時候總結(jié) forever 的時候再講设拟,感興趣的看這里慨仿。
3)如果想通過 npm start 命令來啟動應(yīng)用同時又想用 nodemon 來監(jiān)控文件改動,可以修改 npm 的 package.js 文件中的 scripts.start:
"scripts": {
"start": "nodemon ./bin/www"
}
那么用 npm start 啟動后就是執(zhí)行 nodemon ./bin/www纳胧。