背景

最近在研究 jscodeshift ,是一个AST的工具,学习过程中发现调试非常不方便,运行jscodeshift需要以下命令:

1
2
// --dry指的是不改变源文件,-p指的是打印出输出,方便调试 
jscodeshift -t index.js ./file.js --dry -p

这种用cli的命令不像是启动一个express服务器,可以通过node bin/www来启动。直接在index.js里打断点并不起作用。(如下图)
image

解决办法一(用vscode 调试 - launch模式)

用vscode的debug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// launch.json
{
"version": "0.2.0",
"configurations": [

{
"name": "Launch",// 配置名称,将会在启动配置的下拉菜单中显示
"type": "node",// 配置类型,这里为node
"request": "launch",// 请求配置类型,可以为launch(启动)或attach(附加)
"program": "${workspaceRoot}/node_modules/.bin/jscodeshift",// 将要进行调试的程序的路径
"stopOnEntry": false,// 设为true时程序将暂停在程序入口处
"args": [ // 运行时候的参数
"-t",
"index.js",
"-d",
"--run-in-band", // jscodeshift用当前进程进行调试,不加这个参数无法被vscode debug捕获
"file.js"
],
"cwd": "${workspaceRoot}",// 调试程序时的工作目录
}
]
}

在下拉框中运行,即可进入打断点的位置(如下图)
image

调试Egg程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [

{
"name": "Launch",// 配置名称,将会在启动配置的下拉菜单中显示
"type": "node",// 配置类型,这里为node
"request": "launch",// 请求配置类型,可以为launch(启动)或attach(附加)
"stopOnEntry": false,// 设为true时程序将暂停在程序入口处
"cwd": "${workspaceRoot}",// 调试程序时的工作目录
"runtimeExecutable": "npm",
// "windows": { "runtimeExecutable": "npm.cmd" },
"runtimeArgs": [ "run", "dev" ],
// "console": "integratedTerminal",
// "protocol": "auto",
"restart": true,
}
]
}

解决方法二(用chrome调试 - node –inspect-brk)

  1. 在package.json中,增加debug命令

    1
    2
    3
    "scripts": {
    "debug": "node --inspect-brk ./node_modules/jscodeshift/bin/jscodeshift.sh -t index.js ./file.js --dry -p --run-in-band"
    },
  2. 命令行运行

    1
    npm run debug
  3. 控制台输出如下

    1
    2
    3
    4
    > node --inspect-brk ./node_modules/jscodeshift/bin/jscodeshift.sh -t index.js ./file.js --dry -p --run-in-band

    Debugger listening on ws://127.0.0.1:9229/c4ae2261-fe88-40b2-a6cd-c1f182b59c94
    For help, see: https://nodejs.org/en/docs/inspector
  4. 打开chrome,访问 chrome://inspect/#devices , 点击 Open dedicated DevTools for Node , 如下图
    image

  5. 此时会自动打开控制台,默认从程序刚开始执行就进行断点(./node_modules/jscodeshift/bin/jscodeshift.sh) 如下图
    image

  6. 如果不想一步一步跟随程序来进入需要断点的地方,你可以用 debugger 命令来打断点,如下图
    image

总结

以上两种方式可以通过控制台或chrome来进行nodejs程序的调试,比起增加console.log的方式来看方便了不少。后续所有调试nodejs都可按照这两种方式来调试。

有问题欢迎随时留言,或到主页点击右下角的对话icon与我沟通。