前言
作为前端开发,Chrome(谷歌浏览器) 是我们最常用的工具之一
本文会分成两部分,上篇介绍 chrome 开发者工具中一些常用功能,下篇介绍 chrome extension
宗旨是利用 chrome 自身的一些功能特性,来帮助我们提升开发效率
毕竟省下一分钟的时间,就多了一分钟的时间可以摸鱼(不是)
好了开始正题,首先我们从开发者工具中的 console 面板开始
console面板
拷贝变量
在控制台内,可以通过全局方法 copy()快速复制所需的变量至剪贴板
还可以通过 store object as global variable 将变量先保存下来,方便后面多次拷贝
判断真假
console.assert(expression, message)
如果第一个参数不为真,则打印输出后面的信息,且抛出错误
常用于替代 if(){throw err} 的逻辑,更快速地判断表达式的真假,为了简略也可以不传第二个参数
打印数组
console.table
当我们有了一个数组变量,使用console.log打印的结果可读性并不好
这时我们可以使用console.table来打印
甚至还可以给某个字段做排序,例如count:
console.table还可以在第二个参数传入一个数组,筛选出所关心的字段来展示
另外,对于简单结构的 object,也可以尝试用console.table来打印
我们有时需要打印多个对象,例如有两个
object1, object2
曾经的做法是我写两个console.log
console.log("object1", object1)
console.log("object2", object2)
但console.log其实也支持直接做对象打印,可以更方便地进行书写和展示
console.log({ object1, object2 })
打印DOM元素
console.dir
console.log和 console.dir 的区别在于前者打印的是DOM树的结构,而后者打印出的是对象的属性和方法
分析代码执行
执行次数
利用 console.count可以分析代码的执行次数
调用栈
使用 console.trace我们可以打印代码的调用栈信息
执行性能
当我们关心一段代码需要耗时多久时,可以在控制台使用console.time 和 console.timeEnd 进行统计
不过time和timeEnd还是偏简单了点,如果想要更方便地分析一段代码中各个部分所占的消耗,快速找到性能瓶颈,可以使用 console.profile 和 console.profileEnd
打印结束后,报告并不会在控制台呈现,需要到 moretools 中找到 JavaScript Profiler
从中可以看到这次函数调用共耗时 70.8 ms,其中函数A 耗时 39.4ms,函数C 耗时 23.6ms,函数B 耗时 7.9ms,性能消耗对比一目了然
log编组
console.group()
为了方便阅读 log,我们可能会用到编组功能
以console.group 开始 console.groupEnd 结尾,其中的内容会被编组展示
还可以支持嵌套编组
实时观测
我们可以新增一条表达式来实时打印当前的值
例如我们想查看当前的 active 元素,点击小眼睛,新增表达式:document.activeElement
当点击不同的元素时,该值也会随之发生变化
展示log时间
默认我们的控制台并不会显示 log 被打印的时间
我们可以使用 command + shift + p 呼出 command 面板
通过打开 show timestamps 来显示log时间,在某些场景可以更好地帮助我们定位问题
快速获取DOM元素
通过$语法,我们可以像jquery一样快速地获取我们想要的DOM元素
$0表示当前选中的DOM元素,$1是上一个选中的DOM元素,以此类推
还可以通过class名,id等快速获取元素
屏蔽某个log
有时候一些第三方文件会打印一些冗余的log出来,污染我们的控制台
可以通过 Hide messages from .... 来屏蔽来自某个文件的log信息
Elements面板
快速隐藏元素
选中DOM元素后,按下 h 即可快速实现元素的隐藏与显示
快速定位到元素所在位置
使用 scroll into view
快速切换class样式
点开 .cls 我们可以通过下面的选择框动态选择是否应用某个class,同时也可以方便添加新的 class
在这个操作区域,我们还可以点击:hover等,手动激活我们的一些伪类样式
事件监听
我们可以使用 monitorEvents 方法来监听某个DOM元素的事件
首先在 DOM 面板选中我们要监听的元素
然后使用 monitorEvents 来进行 click 事件的监听
使用unmonitorEvents 可以取消监听
查看DOM元素绑定事件
我们可以在元素面板中,查看各个元素下已绑定的一些事件
取消 Ancestors 勾选后,即可显示单单这个元素身上绑定的事件,否则会显示整个页面的事件
另一种方式是在控制台使用 getEventListeners方法
Network面板
高级过滤
请求我们可以很轻松地选择请求类型来过滤,不过如果我们想筛选所有的Get请求,就需要使用高级过滤了,在filter过滤框中输入 method:GET
相反,如果我们想选出所有 method!=Get 的请求,可以如下图搜索
在前面增加 - 即可
模拟网络环境
当想观察网站在不同网络环境下的表现时,可以使用该配置进行模拟切换
阻塞请求
在很多网站,某次请求如果返回错误页面就会重定向,这时如果想看看重定向前发生了什么,就可以使用 Request blocking 阻塞请求
重放请求
某些场景下想要重新观察某次请求,无需网页刷新,只需使用 Replay XHR 即可重放这次请求
复制请求
针对每次请求,可以通过右键 copy 很方便地复制各种形式的请求格式,在其他地方复放
请求耗时
使用 waterfall 可以观测单次请求在各个阶段所花的时间
-
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 元素
从源码添加断点
除了手动点击行号进行添加外,我们也可以在开发时直接在源码中添加
debugger 关键字
当运行时就会自动暂停在 debugger 位置
条件断点
在给代码打断点的时候,我们可能只关心某一个阶段所发生的事
例如下面这个循环中,我们想看看最后两次循环发生了什么,那么比起加断点之后不停播放,我们可以直接添加一个条件断点
执行时就会直接跳到i = 9 的这个场景
log 断点
在调试时,为了方便观测程序的运行结果,我们可能需要在源码中增加很多的 console.log
其实利用log point,我们可以在不修改源码的情况下输出log
黑盒模式
我们开发时,经常会引用各种第三方库。其实大部分时候我们不关心他们的内部逻辑,但我们调试时,按照单步调试会经常跳进第三方库的代码中遨游。
为了专注调试我们的代码,可以运用黑盒模式,将这个第三方文件标记为 "Blackbox Script",这样我们就永远不会进入这个文件,不必关心其内部繁复的逻辑。
除了一个个文件去屏蔽,还可以直接在全局设置中,增加一个匹配模式,将符合条件的文件全部标记黑盒
XHR请求断点
使用 XHR Breakpoints ,我们可以对满足过滤条件的请求进行拦截
例如图中我们对 URL 包含字母a的请求进行拦截,则该页面的任意请求只要包含字符a都会被捕获断点
事件断点
针对全局的一些事件,我们也可以通过 Event Listener Breakpoints 来添加断点
例如我们希望鼠标点击时进入断点,只需像下图这样勾选 mousedown即可
DOM断点
我们的代码中可能会包含一些DOM操作,有时候我们希望捕获DOM元素的更改,可以通过给元素增加DOM断点的方式来实现
- subtree modifications:子节点变化
- attribute modifications:当前节点属性修改
- node remove:当前节点被移除
例如我们可以给搜索框增加属性修改的断点
当点击搜索框 focus 的时候,我们就可以捕获断点
其他常用功能
网页截图
chrome 有很多帮助网页截图的插件,但清晰度都不如 chrome 自带的截图功能
使用 shift + command + p 呼出命令搜索框
可以选择截取整个网页 / 部分区域
展示代码覆盖率
使用 Show Converage 命令,我们可以很方便地查看当前代码的冗余程度
红色部分就是代码中未被使用到的部分,JS 和 CSS 都可以观察到
页面重绘
使用 Show Rendering 命令,我们可以打开页面重绘设置
然后页面重绘区域就会高亮展示,有利于我们发现不合理的重绘部分
全局搜索
呼出 show search命令,在search面板中可以搜索全局代码
画布模式
当我们想看看某个元素下文本超出限制,会是什么样的显示效果,一般会先选中这个元素,然后在右侧DOM树中编辑其中的文本
但其实我们可以开启一个更强大的编辑模式
在控制台中输入下面这行语句,开启画布模式
document.designMode = 'on'
然后我们就可以直接在页面上编辑文字了
动画调试
呼出 show animations 命令,在animations面板中可以针对当前页面动画做慢速观察
性能监视器
呼出 show performance monitor 命令,在性能监视器面板中可以观察当前CPU占用,JS堆大小和 DOM节点数量 等信息
移动端调试
pc端打开 chrome://inspect/#devices
手机用数据线与电脑连接,接受 USB 调试,之后即可在手机浏览页面的同时,在pc端实时查看
flag 实验性配置
除此之外,我们还可以用 flag 开启一些实验性的功能
悬浮标签缩略图
当我们开了很多标签时,我们可能根本看不清每个标签的内容了
我们可以打开 chrome://flags/
搜索 tab hover card images,将它设置为 enable
此时我们鼠标 hover 的时候,就会在下方显示网页的缩略图
标签页搜索
更实用的一个功能是,允许我们对已打开的标签页进行一个搜索,我们不再需要在几十个标签页中大海捞针
打开 fuzzy search for Tab Search 这个 flag
右上角就会多一个小箭头,搜索点击后就会跳到我们已打开的那个标签页
并行下载
Chrome 下载文件默认是单进程下载,我们可以打开 parallel-downloading 支持并行下载内容。同时下载多个文件时会更快。
地址栏二维码
sharing-qr-code-generator 通过打开该开关,无需插件我们就可以很方便将当前网站生成二维码,使用手机扫码预览
Chrome 85 版本之后,已默认打开该功能
参考文章
14 Settings on Google Chrome Flags Page To Make It Faster