原文地址:github.com/younth/blog…javascript
最近這段時間一直在折騰各類Node CLI,把我的的一些開發,調試技巧分享給你們~前端
通常狀況下,一套CLI工具集合,包括CLI運行核心模塊及各類插件體系。拿 webpack
來講,其由核心模塊 webpack
及各類 loader
plugin
組成其強大的構建生態體系。java
npm link
link npm link my-plugin
npm unlink my-plugin
npm link 的原理其實就是創建軟鏈接,省去了本身創建軟鏈的麻煩了node
單一的npm包,調試方法比較多,vscode node-debug 或者 chrome devtool 調試node 均可以。若是是vscode ,launch.json 裏面能夠配置 env 與 args 也比較方便。單一模塊開發推薦這種方式。webpack
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}/bin/def.js",
"args": [
"-v"
],
"env": {
"DEF_CORE_PATH": "/Users/younth/node-cli/def/node-cli"
}
}
複製代碼
入口cli模塊通常是在 package.json
裏面申明的:git
"bin": {
"webpack": "./bin/webpack.js"
}
複製代碼
bin
字段主要用於npm i -g
時候能夠將腳本添加到可執行路徑中,以後能夠在命令行中直接執行。例如npm i -g webpack
後就能夠全局使用webpack命令。github
一樣的咱們在 CLI 的項目目錄下執行 npm link
將 webpack 放入全局,這樣後面咱們就能夠在命令行中直接使用了。對於CLI模塊的調試仍然可使用單一模塊調試方法。web
可是當 webpack 再去調用 loader 或者 plugin 的時候,咱們想完整的調試整個過程,就不太方便了。嘗試過用 node --debug
去啓動 CLI 下面的 bin/webpack
,而後在調試具體執行模塊,感受開發起來很彆扭,體驗很差。並且若是是模塊是經過child\_process.spawn
執行的,那真就沒啥辦法了。最終選擇了以日誌的形式進行開發調試。chrome
提及日誌,最簡單的就是 console.log
調試了,但問題也很明顯:npm
console
輸出的信息會多而亂。這樣增長了調試的複雜度,迫切須要 進行分模塊塊打印日誌調試
咱們引入了 debug 模塊。使用也很是方便,一般咱們只須要給每一個模塊指定特定的__命名空間__便可:
// app.js
var debug = require('debug')('app');
// 運行 DEBUG=app node app.js
// 輸出:app hello
debug('hello');
debug('this is %s', string);
debug('this is %o', obj);
複製代碼
使用的時候,能夠傳參,自定義格式:
debug
同時支持命名空間:
DEBUG=app,api
:表示同時打印出命名空間爲app、api的調試日誌。DEBUG=a\*
:支持通配符,全部命名空間爲a開頭的調試日誌都打印出來。在開發Node Cli的過程當中,咱們常常須要執行一些 後臺程序
, 好比 檢測CLI及模塊的版本更新狀況,其本質就是利用 child\_process.spawn
以守護進程的方式執行一個js文件。咱們能夠經過設定 spawn
的 stdout
參數來將輸出指向某個文件。
const fs = require('fs-extra');
let stdout = fs.openSync(path.join(__dirname, 'check_out.log'), 'w')
let stderr = fs.openSync(path.join(__dirname, 'check_error.log'), 'w')
const p = child_process.spawn(
'node', ['check.js', 'a', 'b'],
{
'stdio': ['ignore', stdout, stderr],
'detached': true // 讓子進程能在父進程退出後繼續運行
}
);
複製代碼
如上述代碼所示,在 check.js
裏面進行 console.log
或者 debug
的,將會在 check\_out.log
裏面看到結果。
以上都是開發時候的調試,在發佈以後,有時候咱們也須要一些信息輸出給用戶。咱們常常用 --verbose
查看詳細的運行狀況。對於正式環境的錯誤提示,信息輸出等,咱們把日誌級別分爲:
--verbose
參數查看能夠考慮用原生util模塊,這裏推薦使用 npmlog ,功能也比較完善。
// additional stuff ---------------------------+
// message ----------+ |
// prefix ----+ | |
// level -+ | | |
// v v v v
log.info('[core]', 'node version is : %j', nodeVersion)
複製代碼
有時候咱們也想讓本身的CLI輸出各類酷炫的效果,這裏也把本身使用的模塊分享給你們:
最近也在梳理前端工程化的全鏈路開發的解決方案,看了業界不少工具,慢慢融化貫通後再嘗試分享。