【调试】如何调试 node.js 代码和 npm scripts

232 阅读1分钟

如何调试node.js

以前就会一种,是打开【RUN AND DEBUG】,选择【运行node.js】,但是遇到这种情况就是一脸懵了

image.png

使用Chorme devtool 调试

node --inspect-brk ./index.js

--inspect 是以调试模式启动,--inspect-brk 是以调试模式启动并且在首行断住。然后你可以看到

image.png

然后就会看到一个ws地址。打开 chrome://inspect/#devices

image.png

点击 inspect 就可以调试这个脚本了, 在 Chrome DevTools 里调试,在 VSCode 里写代码,切来切去也比较麻烦,一般做法是用 VsCode Debugger

使用 VsCode Debugger

不启动 node --inspect-brak xx, 直接在 launch.json 配置

// launch.json
"configurations": [
    {
      "type": "node",
      "request": "launch",
      "program": "${workspaceFolder}/node-test/index.js",
      "name": "Launch",
      "stopOnEntry": true, // 首行进入断点
      "skipFiles": ["<node_internals>/**"]
    }
  ]

launch.json 参数详解

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node", // 指定调试器类型,这里是Node.js
      "request": "launch", // 启动配置类型,可以是"launch"(启动)或"attach"(附加到已运行的进程)
      "name": "Launch Program", // 配置名称,在调试配置列表中显示
      ...
    }
  ]
}

launch 和 attach 都支持的参数

用于launch的参数

  • program 要调试的Node.js程序的绝对路径。

  • args 传递给程序进行调试的参数。此属性的类型为 array,需要将单个参数作为数组元素。

  • cwd  启动要在此目录中调试的程序。

  • runtimeExecutable 要使用的运行时可执行文件的绝对路径。默认值为 node 。请参阅启动“npm”和其他工具的配置支持部分。

  • runtimeArgs 传递给运行时可执行文件的可选参数。

  • runtimeVersion - 如果使用“nvm”(或“nvm-windows”)或“nvs”来管理Node.js版本,则此属性可用于选择特定版本的Node.js. 请参阅下面Multi version support 的多版本支持部分。

    比如你用“nvm”或者"nvs"安装了node 14,runtimeVersion 可以设置runtimeExecutable:14 ,会匹配你安装最近的14.x.y的版本。但似乎在配置 launch.json 的时候,即使用了“nvm”或者"nvs", 这个参数也没怎么设置

  • env 可选的环境变量。此属性需要将环境变量作为字符串类型key/value对的列表.

  • envFile 包含环境变量定义的文件的可选路径. 请参阅下面的 外部文件加载环境变量 below.

  • console - 用于启动程序的控制台 (internalConsoleintegratedTerminalexternalTerminal). 请参阅下面的  Node Console 部分.

  • outputCapture - 如果设置为 std ,则进程 stdout/stderr 的输出将显示在调试控制台中,而不是通过调试端口侦听输出。这对于直接写入 stdout/stderr 流而不是使用 console.* API 的程序或日志库非常有用。

用于attach的配置

  • restart 终止时重新启动连接. 请参阅 自动重新启动调试会话部分.
  • port 要使用的调试端口. 要使用的调试端口。请参阅 Attaching to Node.js 和Remote debugging部分
  • address - 调试端口的 TCP/IP 地址. 请参阅 Attaching to Node.js 和Remote debugging部分.
  • processId - 调试器在发送 USR1 信号后尝试附加到此进程。使用此设置,调试器可以附加到未在调试模式下启动的已运行进程。使用该 processId 属性时,调试端口会根据Node.js版本(和使用的协议)自动确定,并且无法显式配置。因此,不要指定 port 属性.
  • continueOnAttach - 如果我们附加到该过程时暂停了该过程,是否继续该过程。如果使用 --inspect-brk.

常用环境变量

  • {workspaceFolder}   在 VSCode 中打开的目录的路径
  • {workspaceFolderBasename}  在 VSCode 中打开的目录的名称
  • {file}  当前打开的文件
  • {relativeFile}  当前打开的文件相对于 workspaceFolder 的路径
  • {relativeFileDirname}  当前打开的文件相对于workspaceFolder 的目录名
  • {fileBasename}   当前打开文件的名称
  • {fileBasenameNoExtension}   当前打开的文件去掉扩展名的名称
  • {fileExtname}  当前打开文件的扩展名
  • {fileDirname}   当前打开文件的目录路径
  • {cwd}  当前执行命令的工作目录
  • {lineNumber}   当前行号
  • {selectedText}  当前选中的文本
  • {execPath}  当前 VSCode 可执行文件的路径
  • {pathSeparator}   操作系统文件路径分割符

如何 debugger npm srcripts

开篇说的【RUN AND DEBUG】,选择【运行node.js】是一种,但是我觉得如果 scripts 太多了的话,容易傻傻分不清楚。

1、点击悬浮在 scripts 上面的 Debug,即通过JavaScript Debug Terimal 来调试

image.png

也可以打开 JavaScript Debug Terimal 运行命令

image.png

2、配置launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch via NPM",
      "request": "launch",
      "cwd": "${workspaceFolder}/examples/ant-design-pro",
      "runtimeArgs": ["run", "dev"], // 代表着npm run dev的意思
      "stopOnEntry": true, // 这里无效,还是得靠自己打个断点
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    }
  ]
}

使用 Auto Attach

使用 ⇧⌘P ,输入 Toogle Auto Attach 可以启用。 JavaScript Debug Terimal 和它有点类似

image.png

有这么些参数可以配置

image.png

然后重启终端,或者新建一个,就可以不用通过配置launch.json 启动调试程序,直接在你想debugger的地方打个断点就可以进入了