前端调试之 ndb|青训营

122 阅读3分钟

什么是 ndb?

ndb 的 GitHub 仓库主页是这么介绍的:

ndb is an improved debugging experience for Node.js, enabled by Chrome DevTools.

Chrome DevTool 是非常好用的断点调试工具,Node 也提供了类似的调试器。只需要在使用 Node 运行脚本时加入 --inspect 参数即可,VSCode 中的调试就是基于此。但是使用 inspect 调试多线程非常麻烦,以及 inspect 不支持调试一些第三方程序,如 webpack。因而 ndb 诞生了,正如它的自我绍,它是为了提升 Node.js 的调试体验而诞生的。

限制

ndb 本质就是利用 Chrome DevTools 调试 Node.js 代码的工具,因此只能在 Node 运行时下使用(实测是不能使用 deno 来调试的,但是 deno 也是支持 inspect protocol 的,即运行时加上 --inspect 参数,浏览器打开 chrome://inspect 即可)。但你不一定需要安装 Chrome 或者基于 Chromium 内核的浏览器。因为初次运行时 ndb 会安装依赖,其中就包括一个完整的 Chromium !!!🤷‍♀️。

在我的 Windows 电脑中,ndb 下载的 Chromium 位于如下地址。

image.png

我们使者用这个 Chromium 打开掘金主页,完全是 Ok 的。这很难评,好吧。

image.png

安装

首先,当然得安装 Node,然后使用自带的 npm 安装,使用 yarn 安装也行,npm 和 yarn 安装命令分别如下:

npm install -g ndb

yarn global add ndb

开始使用

ndb 可以用于调试一个脚本,直接在 ndb 后面加上脚本就行。

ndb main.js

更直观地,也可以加上 node,即如下命令。

ndb node main.js

该命令会自动打开调试面板,剩下的调试体验就和 Chrome DevTool 完全一致了:断点、单步、跳过函数、观察变量等基本功能有。

image.png

不仅如此,还可以直接访问 Node 相关全局变量(这在浏览器中是不行的)与当前作用域的变量。

image.png

对于如下代码:

const a = 1;
const b = 2;
function add(lhs, rhs) {
  return lhs + rhs;
}
const result = add(a, b);
console.log(result);

在进入 add 函数前打印 lhs 会报错,进入 add 函数之后就能打印出参数值。如果直接在 console 中修改 lhs 的值,是会影响到最终的结果的。你可以看到,最终的结果从 3 变成了 102,这是因为我们在 return 语句前将 lhs 的值修改为了 100.

image.png

总结

Chrome DevTool 是一款非常优秀成熟的调试工具,ndb 使得在 Node 环境运行的代码也可以获得 Chrome DevTool 一样的调试体验。除了电脑中又多了一个 Chromium 内核,几乎没什么缺点。

调试的工具非常多,例如 VSCode 原生的调试工具或者其他 IDE 自带的调试工具也有不错的调试体验。

调试终究是要找 Bug,找性能瓶颈,好的工具能让调试事半功倍。但更重要的是平时要养成好的编程习惯,先设计后编码,少用“黑魔法”。“小黄鸭”调试法的底层逻辑就是理清代码逻辑后相对更容易发现 Bug,如果自己都不能向“小黄鸭”解释某处代码,这部分代码就可能是存在问题。