88

由浅入深学习JavaScript Debug技巧 | Fundebug博客

 6 years ago
source link: https://blog.fundebug.com/2017/12/04/javascript-debugging-for-beginners/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

由浅入深学习JavaScript Debug技巧

译者按: 从 alert 到 debugger;看看你属于哪个段位。

本文采用意译,版权归原作者所有

我常常看到不少开发者不懂如何 Debug JavaScript 代码,因此决定写一篇博客为初学者介绍如何 Debug。我希望这篇文章可以提供一些有用的信息。我尝试在本文讲述很多内容,所以有些部分并没有讲得很细。

在开始之前,做一些基本的准备:

  • 这是针对浏览器运行的 JavaScript,而不是 Node.js;
  • 你需要有一定的编写 JavaScript 的基础;
  • 你需要在概念上知道 Debug 是什么;
  • 你最好动起手来,边看边操作。

注意:1. 你最好打开两个窗口,一边看一边操作来学习;2. 本文的主要目的是教会你 debug,文中的 JavaScript 代码并不规范,不要学坏啦。

  • 警告(alert)
  • 开发者工具
  • 控制台(Console)
  • 打印日志(console.log)
  • 交互式 Debugger
  • 库函数和压缩代码
  • Ajax 请求

警告(alert)

使用警告(alert)会弹出一个对话框显示特定的警告信息,并且有一个OK按钮。如果你点击OK,该对话框消失。

alert("Hello! I am an alert.");
alert.png

这一招蛮有用的,你可以将想要查看的值通过alert显示出来。

// 通过alert来确认代码执行的位置
alert("I am here!");
// 显示foo的值
alert("Foo: " + foo);

但如果你不小心将alert放在了 for 循环中,那就惨了。我曾经就遇到过,不得不强行将浏览器关闭。

// 除非你喜欢alert, 不要这样做!
for (i = 0; i < 100; i++) {
alert(i);
}

好在,如今的谷歌浏览器已经帮你考虑到这一点。如果你不小心弄出了很多 alert,谷歌浏览器会识别出来并建议你将它们都阻止。

prevent-alerts.png

曾经,alert是大家非常常用的 debug 工具。不过,使用alert局限性太大,它只能显示字符串。

// 显示所有的h2标签内容
alert($("h2"));

然而,并不会显示出来:

alert-object.png

既然这么不好用,为啥你还要讲呢?因为我们可能有时候不得不使用这样旧式的技巧。我最近一次使用alert是我在 debug 一个移动设备的时候现有的技巧无法正常工作,我只好用alert

开发者工具

欢迎来到未来!哈哈,并不是这样。开发者工具已经使用了好些年了。不过呢,很多新的特性被加进去,相信不少人都不知道或则不清楚怎么使用。对于 JavaScript debug 来说,开发者工具真的非常有用。接下来我来介绍如何使用它。

首先,你需要知道如何打开它。你可以使用快捷键:

  • Window/Linux: ctrl + shift + I;
  • OSX: cmd + opt + I

你也可以从谷歌浏览器的菜单栏选择开发者工具选项来打开:

open-dev-tools.png

你还可以直接右键,选择检查来打开:

inspect.png

打开后,如下所示:

dev-tools-console.png

控制台(Console)

在使用 JavaScript 做开发的时候,控制台非常有用。当使用 C, C++, Java 开发的时候,我们可以使用终端(terminal)来 debug,控制台拥有和终端相似的功能。

控制台显示 JavaScript 错误。

js-error.png

同时,也显示了错误在源代码中的位置。点击(index):150就可以跳转到源代码去。

js-error-line.png
<input
type="button"
onclick="alert(THE SPICE MUST FLOW);"
value="Click to create an error"
/>

这行代码有错误,你知道哪里出问题了吗?

控制台拥有的交互式命令行可以用来 debug。下面是一些例子:

你可以做一些基础的 JavaScript 编程

// 数学加法
2 + 2;
// 字符串拼接
"the golden " + "path";
// 调用alert
alert("Muad'Dib!");

你也可以执行复杂的 JavaScript 代码

// 创建变量
var arr = [1, 2, 3];
// 使用shitf+enter键来换行
for (var i = 0; i < arr.length; i++) {
arr[i] = arr[i] * 2;
}
arr;

控制台本身也提供了很多有用的函数,详情参考api 文档

// 通过css选择器获取元素
$$("h2");
// 甚至XPath
$x("//h2");

你可以访问本页面加载的所有库。比如,jQuery:

// 页面背景色变红
$("body").css("background-color", "red");
// 改回去
$("body").css("background-color", "");

你可以获取当前环境下的变量。

// 当前的this
this;

console.log

console.log在控制台打印信息。

console.log("I am logging to the console.");
console-log.png

我们可以使用它做到之前 alert 可以实现的功能:

// 确认代码当前执行位置
console.log("I am here!");
// 打印变量值
console.log("Foo: " + foo);

而且,我们可以用 for 循环将所有的值打印出来:

for (i = 0; i < 100; i++) {
console.log(i);
}

alert 只能显示字符串,console.log 就强大多了:

// 可以输出DOM元素
console.log($("h2"));
// 可以显示对象
console.log({
book: "Dune",
characters: ["Paul", "Leto", "Jessica", "Chani", "sandworms"]
});

这仅仅是个开始。使用 console.log 你可以做很多事情,请参考api 文档

控制台打印日志已经基本上可以应付日常 debug 需求了,所以很多开发者止步于此。其实,我们还有更加高级、更加方便的方法。

交互式 Debugger

谷歌开发者工具提供了一个交互式 debugger。我发现对于复杂的 JavaScript 代码,特别是自己编写的代码和其它库有交互的时候,特别有用。

你可以再代码中通过调用debugger来开启 debug。

// 从这里开始debug
debugger;

只有在打开开发者工具的时候,debugger 才会起作用。如果你将开发者工具面板关闭,将不会收到任何影响。

debugger-start.png

如果你点击继续按钮(右侧蓝色的类似于播放的按钮),代码会继续执行直到下一个断点。
如果你点击跳过按钮(继续按钮的右侧,第二个),它会直接执行当前函数,而不是进入函数内部。

debugger-red.png

如果你想知道makeItColor函数具体如何执行,点击进入按钮(第三个),就会跳入函数内部。如果你想跳出来,那么点击第跳出按钮(第四个)。

debugger-step-into.png

如果想查看变量的值,可以选中并把鼠标放在上面:

debugger-value-hover.png

你可以敲击ESC键来快速打开控制台,再次敲击ESC,控制台消失。

debugger-console.png

你可以手动在代码的某一行添加断点来暂停执行。在第 31 行的左侧鼠标单击,会出现一个断点符号。

add-breakpoint.png

库和压缩代码

有时候,为了 debug,你可能需要查看库函数的源代码。但是,一般线上的代码都是经过压缩的,很难看懂。比如 jQuery:

jquery-min.png

如果你点击下方的{}按钮,可以将代码适当格式化,但是依然很难看懂。

jquery-min-pretty.png

压缩代码在生产环境十分有必要,但是却十分为难 debug。好在,大多数库都提供非压缩版本的代码。所以,你可以在开发中引用非压缩版,线上引用压缩版。

<!-- 线上 -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
<!-- 开发 -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js" type="text/javascript"></script>

在线上环境中,如果用户遇到 bug 如何才能知道呢?推荐你使用Fundebug 监控服务

Ajax 请求

开发者工具的网络部分对于解决网络请求相关问题非常有用。

我用 Twitter 来举例。

  • 到@horse_js(或则其它页面)
  • 打开开发者工具
  • 点击 Network 标签
  • 点击 filter 图标
  • 选中 XHR(XMLHttpRequest), 将所有网络请求筛选出来
horsejs-network.png

往下滑动触发网络请求。Headers标签显示该请求的一些基本信息:

horsejs-network-headers.png

Preview显示的是经过浏览器格式化的返回结果(Response)。

horsejs-network-preview.png

Response是原始的返回数据。

horsejs-network-response.png

Cookies显示请求相关的 cookies 信息。

horsejs-network-cookies.png

Timing显示请求的时间信息。

horsejs-network-timing.png

Debug JavaScript 的性能需要很多篇幅去介绍。在这里,给出一些参考资料:

你可以使用开发者工具来模拟移动交互,这样就可以直接在桌面浏览器 debug。如果想了解更多,查看文档

当然,你很可能需要真机调试,可以参考下面的文章:

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了70亿+错误事件,付费客户有阳光保险、达令家、核桃编程、荔枝FM、微脉等众多品牌企业。欢迎大家免费试用

您的用户遇到BUG了吗?

体验Demo 免费使用

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK