利用 Chrome 让你的开发更高效(上):开发者工具

1,574 阅读12分钟

前言

作为前端开发,Chrome(谷歌浏览器) 是我们最常用的工具之一

本文会分成两部分,上篇介绍 chrome 开发者工具中一些常用功能,下篇介绍 chrome extension

宗旨是利用 chrome 自身的一些功能特性,来帮助我们提升开发效率

毕竟省下一分钟的时间,就多了一分钟的时间可以摸鱼(不是)

好了开始正题,首先我们从开发者工具中的 console 面板开始

console面板

拷贝变量

在控制台内,可以通过全局方法 copy()快速复制所需的变量至剪贴板

image.png

还可以通过 store object as global variable 将变量先保存下来,方便后面多次拷贝

image.png

判断真假

console.assert(expression, message)

如果第一个参数不为真,则打印输出后面的信息,且抛出错误

image.png

常用于替代 if(){throw err} 的逻辑,更快速地判断表达式的真假,为了简略也可以不传第二个参数

image.png

打印数组

console.table

当我们有了一个数组变量,使用console.log打印的结果可读性并不好

image.png

这时我们可以使用console.table来打印

image.png

甚至还可以给某个字段做排序,例如count

image.png

console.table还可以在第二个参数传入一个数组,筛选出所关心的字段来展示

image.png

另外,对于简单结构的 object,也可以尝试用console.table来打印

image.png 我们有时需要打印多个对象,例如有两个 object1, object2

曾经的做法是我写两个console.log

console.log("object1", object1)
console.log("object2", object2)

console.log其实也支持直接做对象打印,可以更方便地进行书写和展示

console.log({ object1, object2 })

image.png

打印DOM元素

console.dir

console.logconsole.dir 的区别在于前者打印的是DOM树的结构,而后者打印出的是对象的属性和方法

image.png

image.png

分析代码执行

执行次数

利用 console.count可以分析代码的执行次数

image.png

调用栈

使用 console.trace我们可以打印代码的调用栈信息

image.png

执行性能

当我们关心一段代码需要耗时多久时,可以在控制台使用console.timeconsole.timeEnd 进行统计

image.png

不过time和timeEnd还是偏简单了点,如果想要更方便地分析一段代码中各个部分所占的消耗,快速找到性能瓶颈,可以使用 console.profileconsole.profileEnd

image.png

打印结束后,报告并不会在控制台呈现,需要到 moretools 中找到 JavaScript Profiler

从中可以看到这次函数调用共耗时 70.8 ms,其中函数A 耗时 39.4ms,函数C 耗时 23.6ms,函数B 耗时 7.9ms,性能消耗对比一目了然

image.png

log编组

console.group()

为了方便阅读 log,我们可能会用到编组功能

console.group 开始 console.groupEnd 结尾,其中的内容会被编组展示

image.png

还可以支持嵌套编组

image.png

实时观测

我们可以新增一条表达式来实时打印当前的值

例如我们想查看当前的 active 元素,点击小眼睛,新增表达式:document.activeElement

当点击不同的元素时,该值也会随之发生变化

image.png

展示log时间

默认我们的控制台并不会显示 log 被打印的时间

image.png

我们可以使用 command + shift + p 呼出 command 面板

通过打开 show timestamps 来显示log时间,在某些场景可以更好地帮助我们定位问题

image.png

image.png

快速获取DOM元素

通过$语法,我们可以像jquery一样快速地获取我们想要的DOM元素

$0表示当前选中的DOM元素,$1是上一个选中的DOM元素,以此类推

image.png

还可以通过class名,id等快速获取元素

image.png

屏蔽某个log

有时候一些第三方文件会打印一些冗余的log出来,污染我们的控制台

可以通过 Hide messages from .... 来屏蔽来自某个文件的log信息

image.png

Elements面板

快速隐藏元素

选中DOM元素后,按下 h 即可快速实现元素的隐藏与显示

快速定位到元素所在位置

使用 scroll into view

image.png

快速切换class样式

点开 .cls 我们可以通过下面的选择框动态选择是否应用某个class,同时也可以方便添加新的 class

image.png

在这个操作区域,我们还可以点击:hover等,手动激活我们的一些伪类样式

事件监听

我们可以使用 monitorEvents 方法来监听某个DOM元素的事件

首先在 DOM 面板选中我们要监听的元素

image.png

然后使用 monitorEvents 来进行 click 事件的监听

image.png

使用unmonitorEvents 可以取消监听

查看DOM元素绑定事件

我们可以在元素面板中,查看各个元素下已绑定的一些事件

取消 Ancestors 勾选后,即可显示单单这个元素身上绑定的事件,否则会显示整个页面的事件

image.png

另一种方式是在控制台使用 getEventListeners方法

image.png

Network面板

高级过滤

请求我们可以很轻松地选择请求类型来过滤,不过如果我们想筛选所有的Get请求,就需要使用高级过滤了,在filter过滤框中输入 method:GET

image.png

相反,如果我们想选出所有 method!=Get 的请求,可以如下图搜索

在前面增加 - 即可

image.png

模拟网络环境

当想观察网站在不同网络环境下的表现时,可以使用该配置进行模拟切换

image.png

阻塞请求

在很多网站,某次请求如果返回错误页面就会重定向,这时如果想看看重定向前发生了什么,就可以使用 Request blocking 阻塞请求

image.png

重放请求

某些场景下想要重新观察某次请求,无需网页刷新,只需使用 Replay XHR 即可重放这次请求

image.png

复制请求

针对每次请求,可以通过右键 copy 很方便地复制各种形式的请求格式,在其他地方复放

image.png

请求耗时

使用 waterfall 可以观测单次请求在各个阶段所花的时间

image.png

  • Queuing :排队

    • 存在更高优先级的请求, 请求被渲染引擎推迟,这经常发生在 images(图像)上, 因为它被认为比关键资源(如脚本 / 样式)的优先级低。
    • 此源已打开六个 TCP 连接,达到限值,仅适用于 HTTP/1.0 和 HTTP/1.1。在等待一个即将被释放的不可用的 TCP socket
    • 浏览器正在短暂分配磁盘缓存中的空间,生成磁盘缓存条目(通常非常快)
  • Stalled :停滞

    • 发送请求之前等待的时间。它可能因为进入队列的任意原因而被阻塞,这个时间包括代理协商的时间。请求可能会因 Queueing 中描述的任何原因而停止。
  • DNS lookup :DNS 查找

    • 浏览器正在解析请求 IP 地址,页面上的每个新域都需要完整的往返 (roundtrip) 才能进行 DNS 查找
  • Initial connection:初始连接

    • 建立连接所需的时间,包括 TCP 握手 / 重试和协商 SSL。
  • SSL handshake:完成 SSL 握手所用的时间

  • Request sent :请求发送

    • 发出网络请求所花费的时间,通常是几分之一毫秒。
  • Waiting(TTFB) :等待

    • 等待初始响应所花费的时间,也称为Time To First Byte(接收到第一个字节所花费的时间)。这个时间除了等待服务器传递响应所花费的时间之外,还包括 1 次往返延迟时间及服务器准备响应所用的时间(服务器发送数据的延迟时间)
  • Content Download:内容下载

    • 接收响应数据所花费的时间 (从接收到第一个字节开始,到下载完最后一个字节结束)

Sources面板

查看 Hover 状态下的 UI

有些 UI 只有鼠标 hover 后才会显示,不好查看具体样式细节,此时可以利用断点

首先打开sources面板,然后在页面上hover出想要的东西,然后按 command+ 将页面暂停,即可查看 UI 元素

image.png

从源码添加断点

image.png 除了手动点击行号进行添加外,我们也可以在开发时直接在源码中添加 debugger 关键字

当运行时就会自动暂停在 debugger 位置

条件断点

在给代码打断点的时候,我们可能只关心某一个阶段所发生的事

例如下面这个循环中,我们想看看最后两次循环发生了什么,那么比起加断点之后不停播放,我们可以直接添加一个条件断点

image.png

image.png

image.png

执行时就会直接跳到i = 9 的这个场景

image.png

log 断点

在调试时,为了方便观测程序的运行结果,我们可能需要在源码中增加很多的 console.log

其实利用log point,我们可以在不修改源码的情况下输出log

image.png

image.png

image.png

黑盒模式

我们开发时,经常会引用各种第三方库。其实大部分时候我们不关心他们的内部逻辑,但我们调试时,按照单步调试会经常跳进第三方库的代码中遨游。

为了专注调试我们的代码,可以运用黑盒模式,将这个第三方文件标记为 "Blackbox Script",这样我们就永远不会进入这个文件,不必关心其内部繁复的逻辑。

image.png

除了一个个文件去屏蔽,还可以直接在全局设置中,增加一个匹配模式,将符合条件的文件全部标记黑盒

image.png

XHR请求断点

image.png

使用 XHR Breakpoints ,我们可以对满足过滤条件的请求进行拦截

例如图中我们对 URL 包含字母a的请求进行拦截,则该页面的任意请求只要包含字符a都会被捕获断点

事件断点

针对全局的一些事件,我们也可以通过 Event Listener Breakpoints 来添加断点

例如我们希望鼠标点击时进入断点,只需像下图这样勾选 mousedown即可

image.png

DOM断点

我们的代码中可能会包含一些DOM操作,有时候我们希望捕获DOM元素的更改,可以通过给元素增加DOM断点的方式来实现

image.png

  • subtree modifications:子节点变化
  • attribute modifications:当前节点属性修改
  • node remove:当前节点被移除

例如我们可以给搜索框增加属性修改的断点

当点击搜索框 focus 的时候,我们就可以捕获断点

image.png

其他常用功能

网页截图

chrome 有很多帮助网页截图的插件,但清晰度都不如 chrome 自带的截图功能

使用 shift + command + p 呼出命令搜索框

image.png

可以选择截取整个网页 / 部分区域

展示代码覆盖率

使用 Show Converage 命令,我们可以很方便地查看当前代码的冗余程度

image.png

红色部分就是代码中未被使用到的部分,JSCSS 都可以观察到

image.png

页面重绘

使用 Show Rendering 命令,我们可以打开页面重绘设置

image.png

image.png

然后页面重绘区域就会高亮展示,有利于我们发现不合理的重绘部分

image.png

全局搜索

呼出 show search命令,在search面板中可以搜索全局代码

image.png

画布模式

当我们想看看某个元素下文本超出限制,会是什么样的显示效果,一般会先选中这个元素,然后在右侧DOM树中编辑其中的文本

image.png

但其实我们可以开启一个更强大的编辑模式

在控制台中输入下面这行语句,开启画布模式

document.designMode = 'on'

然后我们就可以直接在页面上编辑文字了

image.png

动画调试

呼出 show animations 命令,在animations面板中可以针对当前页面动画做慢速观察

image.png

性能监视器

呼出 show performance monitor 命令,在性能监视器面板中可以观察当前CPU占用,JS堆大小和 DOM节点数量 等信息

image.png

image.png

移动端调试

pc端打开 chrome://inspect/#devices

手机用数据线与电脑连接,接受 USB 调试,之后即可在手机浏览页面的同时,在pc端实时查看

image.png

flag 实验性配置

除此之外,我们还可以用 flag 开启一些实验性的功能

悬浮标签缩略图

当我们开了很多标签时,我们可能根本看不清每个标签的内容了

我们可以打开 chrome://flags/

搜索 tab hover card images,将它设置为 enable

image.png

此时我们鼠标 hover 的时候,就会在下方显示网页的缩略图

标签页搜索

更实用的一个功能是,允许我们对已打开的标签页进行一个搜索,我们不再需要在几十个标签页中大海捞针

image.png

打开 fuzzy search for Tab Search 这个 flag

image.png

右上角就会多一个小箭头,搜索点击后就会跳到我们已打开的那个标签页

image.png

并行下载

Chrome 下载文件默认是单进程下载,我们可以打开 parallel-downloading 支持并行下载内容。同时下载多个文件时会更快。

地址栏二维码

sharing-qr-code-generator 通过打开该开关,无需插件我们就可以很方便将当前网站生成二维码,使用手机扫码预览

image.png

Chrome 85 版本之后,已默认打开该功能

参考文章

Chrome Devtools — Sources

Chrome DevTools调试小技巧

你不知道的 Chrome 调试技巧

细数那些不为人知的 Chrome DevTools 骚操作

脱离996,Chrome DevTools 面板全攻略

chrome的调试技巧

web调试优化-chrome开发者工具不完全指南

Chrome 控制台常用调试技巧详解

Chrome Devtools 高级调试指南

用好这些隐藏「小开关」,让 Chrome 浏览器更好用

14 Settings on Google Chrome Flags Page To Make It Faster

下篇导航

利用 Chrome 让你的开发更高效(下):插件