原文地址: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输出各类酷炫的效果,这里也把本身使用的模块分享给你们:
最近也在梳理前端工程化的全链路开发的解决方案,看了业界不少工具,慢慢融化贯通后再尝试分享。