node-inspector 已弃用,应改用 node 内置 --inspect-brk 启动调试并连接 chrome devtools;node --inspect-brk app.js 启动后访问 chrome://inspect 配置端口即可调试,无需安装第三方工具。

Node-inspector 已弃用,别再配它了
node-inspector 早在 Node.js v8.0+ 就被官方 --inspect 协议取代,npm 上已归档,npm install -g node-inspector 在现代 Node(v14+)下大概率失败或无法连接。你看到的旧教程里“启动 node-inspector + node --debug-brk”这套流程,现在会卡在空白页面、报 ERR_CONNECTION_REFUSED 或直接 404。真正该用的是 Node 自带的 Inspector,不依赖第三方服务进程。
用 node --inspect-brk 启动服务并连 Chrome DevTools
这是目前最稳定、零额外依赖的调试入口。关键不是“怎么让 Sublime 弹窗”,而是确保命令能被正确构造和触发:
-
--inspect-brk表示启动即暂停,比--inspect更适合断点调试;端口默认是9229,可显式指定如--inspect-brk=0.0.0.0:9229(方便远程调试) - Sublime 构建系统中写死
["node", "--inspect-brk", "$file"]是常见错误——它会把整个参数当一个字符串传给 node,实际应拆成独立数组项 - 正确配置示例(保存为
NodeJS-Debug.sublime-build):{ "cmd": ["node", "--inspect-brk", "$file"], "selector": "source.js", "working_dir": "$file_path", "shell": false } - 启动后,打开 Chrome 访问
chrome://inspect→ 点击 Configure → 添加localhost:9229→ 刷新,就能看到目标进程并点击 “Open dedicated DevTools for Node”
性能瓶颈排查:别只盯着 console.time()
单纯靠 console.time() 和 console.timeEnd() 只能粗略定位耗时函数,对异步调用链、CPU 占用热点、内存泄漏几乎无效。真正有用的是 Chrome DevTools 的 profiling 功能:
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
- 在 DevTools 的 Profiler 标签页(新版叫 Performance)点击录制,复现慢操作,停止后查看火焰图(Flame Chart)——横向宽度代表执行时间,纵向堆叠反映调用栈深度
- 关注
Event Loop阶段:如果大量时间花在Timer Fired或Idle,说明 I/O 或定时器阻塞严重;若Script Evaluation持续占满主线程,就是纯计算瓶颈 - 用 Memory 标签页拍堆快照(Heap Snapshot),对比两次快照,筛选
Detached DOM tree或持续增长的Closure实例,快速识别内存泄漏源 - Sublime 里写的代码,只要 source map 正确生成(
node --inspect-brk --enable-source-maps),DevTools 就能精准映射到原始.js行号,不用看编译后代码
Sublime 插件不是必须的,但得避开几个坑
像 SublimeText-Nodejs 或老版 NodejsDebug 这类插件,本质是封装 node 命令 + 自动唤起浏览器,但它们常硬编码端口、忽略 Windows 路径空格、不处理 spawn 权限问题。与其折腾插件兼容性,不如手动控制:
- 确认
node在 PATH 中:终端运行which node(macOS/Linux)或where node(Windows),Sublime 构建系统依赖这个路径 - 避免在构建系统里写
"shell": true—— 它会让命令走 shell 解析,--inspect-brk参数可能被截断或转义失效 - 如果项目用
nodemon,别直接替换node:改用["nodemon", "--exec", "node", "--inspect-brk", "$file"],否则 nodemon 重启时 Inspector 端口会冲突 - 调试 Express/Koa 等服务时,
$file必须指向入口文件(如app.js),而不是某个路由模块,否则debugger;不生效
真正卡住的往往不是工具链拼接,而是 Inspector 连接后没点开 DevTools 就开始单步——debugger; 语句只在 DevTools 打开状态下才触发暂停,这点容易被忽略。










