Node.js watch 模式下如何复用同一个 DevTools 窗口?
数据小许
结论
Node.js 的 --watch 会在文件变化时重启应用进程。加上 --inspect-wait 后,每次启动都会等待调试器连接。Node.js 目前没有内置选项让已连接的 Chrome DevTools 窗口自动接管重启后的进程。Node.js 上游已有相关功能请求,目前仍待处理。Node.js CLI 文档;上游功能请求 #61126
问题中的命令是:
node --watch --inspect-wait=0.0.0.0:9222 file.js
文件变化时,--watch 会重启进程;--inspect-wait 会让每次启动都等待调试器连接。进程重启后,当前运行实例和调试连接都会结束,因此 DevTools 无法继续使用原来的会话。Node.js 文档也说明了两者的区别:--inspect 会在启动 inspector 后立即运行代码,--inspect-wait 则会等调试器连接后再运行。Node.js 调试器文档
可选处理方式
如果不需要在代码执行前暂停,可以改用 --inspect:
node --watch --inspect=127.0.0.1:9222 file.js
这样程序启动后会立即执行,并在指定地址启用 inspector。调试会话仍无法跨进程重启保留,但程序不必等调试器连接后才能运行。重启后仍需连接新的运行实例。
如果需要从程序启动时就开始调试,可以继续使用 --inspect-wait,并在每次重启后重新连接 DevTools。也可以使用支持自动附加或重连的 IDE 调试器,具体取决于所用 IDE 和配置。
安全注意事项
原命令绑定到 0.0.0.0,这会让 inspector 监听所有网络接口。Node.js 官方文档警告,公开 inspector 端口可能允许远程执行代码。只有确实需要远程连接且已限制网络访问时,才使用这个地址;本机调试通常使用 127.0.0.1。Node.js CLI 文档中的安全说明
备注:内容仅供参考。
