27个超实用Chrome控制台调试技巧 Source 全局搜索(关注更新)

news2025/1/20 22:40:52

谷歌开发者工具提供了一系列的功能来帮助开发者高效 Debug 网页应用,让他们可以更快地查找和修复 bug。在谷歌的开发者工具中,有非常多有用的小工具,但是很多开发者并不知道。通过这篇文章,我把我常用的那些高效 Debug 的 Chrome 开发者工具的功能分享给大家。

简洁起见,接下来我会使用开发者工具来指代谷歌开发者工具

在我们开始之前,你需要做一些准备工作。

使用金丝雀版(其他基于谷歌浏览器内核的以下方法都适用

如果你想使用谷歌最新的版本和开发者工具,你可以下载金丝雀版本,甚至把它设置为开发默认打开的浏览器。金丝雀版本旨在为早期接受者提供最新的更新。它可能不稳定,但是大多数时候是没问题的。你要习惯去使用最新最强的谷歌浏览器。

1. 开启开发者工具的实验性功能

你可以到chrome://flags页面,然后开启Developer Tools experiments选项。

当开启后,在开发者工具的设置页面,可以发现多了一个Experiments选项。如果我使用的一些功能你没有看到,那么请到Experiments窗口打开。

2.超级实验性功能

如果我使用到的功能在Experiments列表没有,那么它可能是一个 WIP 功能(WIP 指 working in progress)。你可以这样开启:页面处在Experiments界面,连续敲击shift键 6 次来开启 WIP 功能。

Console

当 Debug 的时候,我们绝大部分时间是在和 Console 打交道。我们往往在代码中插入很多 Console logs,通过打印变量值来 debug。鉴于 Console 对于我们这么重要,很有必要了解所有开发者工具提供的相关的 APIs 和快捷键。

3. 总是打印对象

我的第一个建议其实和开发者工具没有关系,而是我一直使用的一个技巧。在使用console.log();的时候,不仅仅打印变量,而是要打印对象,用大括号({})将变量包围起来。这样的优点是不仅会把变量的值打印,同时还会将变量名打印出来。

4. 使用 console.table 来打印多条目数据

如果你要打印的变量是一个数组,每一个元素都是一个对象。我建议你使用console.table来打印,其表格化的呈现更加美观易读。

5. 给 log 加点颜色

log 有时候变得非常多,包含你自己的、一些第三方扩展或者浏览器的 logs。除了使用过滤器(filter)以外,你还可以使用颜色来更好地区分。

6. \$ 和 \$\$

如果你在 console 下没有任何库使用$$$,那么你可以使用它们分别作为document.querySelector() 和 document.querySelectorAll()的快捷键。

除了提供了一个更加快捷的方式外,还有一个好处,$$返回一个数组,而不是array-like的NodeList. 所以你可以直接使用map, reduce和filter 函数。

你可以使用$$检查页面中的无效链接:

Promise.all(
    $$("a")
        .map(link => link.href)
        .map(href => fetch(href))
)
    .then(() => console.log("All links working"))
    .catch(() => console.error("Some links are broken"));

7. \$0

如果你想引用某个 DOM 元素,使用$0$0指向你当前在 Element 中选中的元素。如果指定了$0$1指向之前选中的元素。以此类推,直到$4都可以使用。

8. \$_

$_记录了最后一次在 Console 计算的表达式。

9. getEventListeners()

getEventListeners(domElement) 返回在 DOM 元素上注册的所有的事件。请看下面的例子:

你也许注意到了,当我在 console 里输入表达式的时候,其结果立即被计算出来了。你可以看到我并没有敲击 Enter 键,而结果已经显示出来。这个是金丝雀版本的一个新功能,叫做”Eager Evaluation”。

10. debug(fn)

在上面的例子中,如果你想在点击按钮后的执行过程中暂停,你可以使用debug函数。debug(fn)接收一个函数作为参数,当每次该函数被调用时,Debugger 就会在该函数的第一行中断执行。

想象一下你要 debug 一个按钮的问题,但是你不知道这个按钮对应的事件函数在代码中什么位置。除了去大量的源代码中慢慢寻找之外,还有一个巧妙的方法。使用getEventListeners函数,然后将debug方法注入进去。这样,当你点击按钮的时候,就会在该函数的第一行停下来。

11. copy(obj)

copy(anything) 是一个很有用的工具函数方便你将任何东西拷贝到系统的粘贴板暂存。

copy函数传入一个没有格式的 JSON,会返回格式化的结果:

12. Top-level await

async/await 使得异步操作变得更加容易和可读。唯一的问题在于await需要在 async 函数中使用。如果我们要在 DevTools 的控制台使用,需要一些特殊的处理,使用Immediately Invoked Async Function Expression (IIAFE). 一点都不方便。好在 DevTools 已经支持直接使用 await 了。

Debugging in the Sources panel

在 source 面板,使用 breakpoints,stepping-into, stepping-over 等方式,你可以很好地掌控程序的执行状态,来发现代码问题。接下里我不会介绍大家都知道的基础内容,而是一些我经常使用的建议和技巧。

13. 开启 auto-pretty print

在金丝雀版本的实验模式下,你可以开启自动美化代码模式。

14. 使用条件断点在生产环境中注入 console logs

断点是一个很棒的功能。但还有一个更棒的:条件断点。只有当设定的条件满足的时候,中断才会执行。也就是说 DevTools 并不会每次都中断程序的执行,而只是在你想要它中断的时候才中断。想了解更多:查看这里.

在生产环境下,因为不能修改源代码,我喜欢使用条件断点来注入 console.log。如果我的断点仅仅是一个 console.log,DevTools 不会中断,因为 console.log 返回 undefined,,是一个 false 的值。但是它会执行我注入的表达式,可以看到输出结果。

为什么不直接使用普通的断点,并且查看变量呢?有时候我并不想这样做。比如,当我在分析那些频繁执行的操作,例如触摸或则滑动。我并不想每一次都导致 Debugger 触发程序中断,但是我想看到程序输出的结果。

15. 暂停 UI 在 Hover 状态下的展示结果

我们很难去检查一个只有在 Hover 状态下展示的元素。比如,如何去检查一个 tooltip?如果你右键并选择检查,元素已经消失了。那么有办法吗?

我是这么操作的:

  1. 打开 sources 面板
  2. 显示 tooltip
  3. 使用快捷键来暂停脚本执行(将鼠标停留在暂停的图标上查看快捷键)
  4. 回到 Elements 面板,然后像通常一样去检查元素

16. XHR breakpoints

如果想要理解一个请求是如何执行的,可以使用 sources 面板的 XHR breakpoints。

17. 使用 DevTools 作为 IDE

DevTools 的 source 面板可以说相当强大。你可以快速查找,跳转到某一行,某个函数,执行一段代码,使用多行光标等等。这些功能在这篇 medium 文章中有详细描述。

既然如此,为啥不把整个开发都搬到这里呢。这样就不需要浪费时间切换 IDE 和浏览器了。

如果你有一个使用create-react-app或则vue-cli构建的项目,你可以直接把整个文件夹拖到 Sources 面板下。DevTools 会自动对所有文件做映射。所以,你可以在 DevTools 下修改文件并立即查看。这样,整个开发效率,特别是 Debugging 效率绝对提高了。

18. 使用 network overrides 来简单调试生产代码

如果你正在 Debugging 一个生产环境下面的 bug,你可以使用network overrides来调试,而不用在本地搭建整个配置。

你可以很容易将任何远程的资源下载一份本地的版本,然后可以在 DevTools 下编辑,并且 DevTools 会更新展示你编辑后的文件。

在生产环境下,也可以很容易 Debugging,并且做一些性能上的测试也变得容易。

19. Nodejs debugging

如果你想使用 DevTools 的 Debugger 来 debug Node.js 应用,你可以使用--inspect-brk flag 来开启:

node --inspect-brk script.js

跳转到chrome://inspect页面,在Remote Target选项,可以看到 Node 程序。

并且,在 DevTools 中你会看到一个绿色的 Node 图标,点击图标会打开针对 Node 的 Chrome Debugger。

如果你想要用 DevTools Debugger 来 debug 你的单元测试,你需要这样调用:

node --inspect-brk ./node_modules/.bin/jest

不过这样做其实很麻烦,我们需要自己找到相应的路径。 GoogleChromeLabs 最近发布了一个新的工具非常好用,叫做:ndb。使用 ndb,你只需要:

ndb npx jest

如果你有一个自定义的脚本,你可以这样调用:

ndb npm run unit

更妙的是,如果你在一个有配置package.json的项目下调用ndb,他甚至会自动分析 package.json 中的脚本,方便你直接使用 DevTools。

20. 使用 Snippets 来辅助 Debugging

DevTools 提供了一个可以创建和保存小段代码的工具,我很喜欢用它们来加速我的工作。比如 lodashify —  可以快速给任何应用添加 lodash。

(function() {
    "use strict";

    var element = document.createElement("script");
    element.src =
        "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js";
    element.type = "text/javascript";
    document.head.appendChild(element);
})();

另一个小的工具函数式用来增强对象的属性,每次被访问或则修改,它都会提供给我充分的信息,比如谁访问了,谁更改了它。在 Debugging 的时候,非常有用。

const traceProperty = (object, property) => {
    let value = object[property];
    Object.defineProperty(object, property, {
        get() {
            console.trace(`${property} requested`);
            return value;
        },
        set(newValue) {
            console.trace(`setting ${property} to `, newValue);
            value = newValue;
        }
    });
};

21.  source 全局搜索command + option + F

22. 发送 XHR 请求
Chrome DevTools 支持重新发送 XHR 请求。在和后端进行接口联调时,如果想要重新发送请求,并且参数保持不变,可以直接右键点击要重新发送的 XHR 请求,点击 Replay XHR 即可重新发送该请求:

23. 拷贝一个XHR请求作为Fetch请求

24. 监听事件

可以在 Chrome Devtools 的 Console 面板中输入 monitorEvents() 来监听指定目标事件的信息。该方法有两个参数,第一个参数是要监听的对象。如果未提供第二个参数,所有事件都会返回。要指定要监听的事件,传递一个字符串或字符串数组作为第二个参数。

25. 检测那些没有使用的CSS和Javascript

26. 日志点打印

26. 想不起来已注册事件侦听器的功能定义在哪里

选择dom节点,然后审查元素,点击Event Listeners,就能看到它所绑定的所有的事件

 27. 显示时间戳

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM 汇编指令集1_2

一、两个概念:指令与伪指令 (汇编)指令,是 CPU 机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由 CPU 读取执行。(汇编)伪指令,本质上不是指令(…

版本控制利器——changelog

问题描述 当前,我们项目需要进行版本的确定,人工审核代码已接近尾声,但为了防止后续继续出现该问题,我希望能够做到在每次push到master时,更新changelog 将每一个版本的commit记录下来,类似于下列 解决…

K8s 集成 Jenkins 部署Go Web项目

风离不摆烂学习日志 Day9 K8s 集成 Jenkins 部署Go Web项目 Dockerfile FROM golang:alpine as builder # 需要go环境 MAINTAINER fl1906WORKDIR /work # 源 RUN go env -w GOPROXYhttps://goproxy.cn && go env -w CGO_ENABLED0 && go env -w GO111MODULEon C…

Splunk UBA 从 Ldap 成功导入 HR 数据

1: 今天在配置Splunk UBA 的HRdata 和asset data 的时候,都要用到ldap, 所以还非要装add-on:\ add-on 的名字: Splunk Supporting Add-on for Active Directory (SA-LDAPSearch) (SA-LDAPSearch) 这个add-on 的配置: Configure the Splunk Supporting Add-on for Activ…

使用腾讯云cos搭建图片服务器

背景 当我们能不希望把图片上传到自己的服务器时,可以采用腾讯云cos帮我们免费代图片,我们只需要在自己的数据库里保存一个图片地址就行了 二、注册账号免费试用 1、注册腾讯云账号 按照腾讯云的注册方式,注册自己的账号 2、实名认证 选择个…

blender boxCutter插件

boxCutter可以用来进行bool运算 打开boxCutter 方法1:物体模式在舞台左侧选择boxCutter图标 方法2:物体模式按N,在舞台右侧的侧边栏里选择boxCutter 方法3 物体模式alta 打开BoxCutter后,舞台上方,N键的弹出菜单&…

进行 Spring 6 迁移的最佳方式

介绍 在本文中,我们将了解如何将现有应用程序迁移到Spring 6以及如何充分利用此升级。 本文中的提示基于我在Hypersistence Optimizer和高性能 Java Persistence 项目中添加对 Spring 6 的支持所做的工作。 爪哇 17 首先,Spring 6 将最低 Java 版本提…

2022.11.27 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.基于后向传播算法的多时间尺度RNN4.1 循环神经网络(RNN)4.2 基于多时间尺度的RNN预测模型5.实验5.1 数据简介5.2 数据分析5.3 评价指标5.4 实验结果6.结论深度学习1.循环神经网络(RNN)1.…

Flutter 5 大本地数据库解决方案

Flutter 5 大本地数据库解决方案 原文 https://levelup.gitconnected.com/top-5-local-database-solutions-for-flutter-development-6351cd494070 前言 这里列出了最流行的数据库解决方案以及代码示例。 选择正确的数据管理系统对于提高效率和可 extension 性以及影响可用性和…

3DConvCaps:3DUNet与卷积胶囊编码器用于医学图像分割

摘要 卷积神经网络需要大量的训练数据,无法处理物体的姿态和变形。此外其中的池化层也倾向于丢弃位置等重要的信息。CNN对旋转和仿射变换非常敏感。 胶囊网络是最近出现的一种新型体系结构,其通过动态路由和卷积步长代替池化层,在部分整体表…

steam搬砖项目的核心内容解答

大家好,我是阿阳 如果你有个几千块钱积蓄,想做点小生意,又不知道做啥,那我建议你来做steam搬砖,steam搬砖是什么呢?steam搬砖怎么赚钱的呢?你听我一步步跟你说来 steam搬砖是什么呢&#xff1f…

详解GMM高斯混合模型EM模型

一般讲到GMM就会讲到EM。 我不过多的介绍EM算法。这里只是举一些例子来看看真实的GMM怎么用EM算的。 一、GMM的作用 记住GMM的作用,就是聚类! 二、GMM有hard和soft两种 hard-GMM和soft-GMM是为了对标k-means和soft k-means。在中文互联网上搜索到的GM…

【SVM分类】基于matlab哈里斯鹰算法优化支持向量机SVM分类【含Matlab源码 2243期】

⛄一、哈里斯鹰算法简介 HHO算法用数学公式来模拟现实中哈里斯鹰在不同机制下捕捉猎物的策略.在HHO中,哈里斯鹰是候选解,猎物随迭代逼近最优解.HHO算法包括两个阶段:全局探索阶段、局部开采阶段。 1 全局探索阶段 在这一阶段中,哈…

springboot thymeleaf使用

导入依赖 <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.0.11.RELEASE</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <a…

springboot集成swagger并更换主题

前言 swagger对于web一个开发人员&#xff0c;可以说是非常熟悉的了&#xff0c;之前都是用的公司搭好的框架拿来就用&#xff0c;自己也没有研究过&#xff0c;最近想搞一个自己拿来练手的基础框架&#xff0c;因此来记录一下springboot集成swagger的过程和注意事项。 swagg…

云南白药正在度过“中年危机”

​文丨熔财经 作者|kinki 今年&#xff0c;正是云南白药创制的120周年&#xff0c;虽然是一个百年老字号品牌&#xff0c;但在过去的数年间&#xff0c;云南白药在新品研制、跨界发展乃至品牌推广上都做了不少新尝试。今年&#xff0c;云南白药更提出了“141”战略&#xff0…

备战 2023 春招,P7大咖位手打 26 大后端面试专题神技,1500+题解析助力offer

年过后&#xff0c;不少人已经蓄势待发&#xff0c;信心满满地准备投递简历&#xff0c;到处面试&#xff0c;在不同的 Offer 之中择优而栖。 与此同时&#xff0c;也有人会悔恨自己这半年进步不大&#xff0c;每天噼里啪啦敲代码&#xff0c;但面对那些不能再熟悉的 Java 面试…

分布式解决方案 Percolator--详解

Percolator简介 Google在2012年将Percolator的架构设计作为论文发表&#xff0c;其目的是构建于BigTalbe的基础上&#xff0c;主要用于网页搜索索引等服务。由于BigTable只支持单行级别的事务&#xff0c;不支持多行事务等更复杂的事务&#xff0c;因此Percolator的诞生就是为了…

数据增强:Simple Questions Generate Named Entity Recognition Datasets

数据增强的方式一般是无标注数据集的情形的一种解决方式&#xff0c;今天的讲座报告中对这问题做了梳理。11.27学术报告文章&#xff0c;应该是韩旭的报告。 文章目录问题背景一、论文核心二、文章内容三、experiments总结问题背景 还是在于方法的创新&#xff0c;虽然是数据增…

Centos7下安装Oracle11g

1. 下载安装包 由于Oracle官网上无法下载Oracle数据库之前的版本&#xff0c;可以在 Oracle Software Delivery Cloud 里搜索oracle database 11g 或者百度网盘下载链接&#xff1a;https://pan.baidu.com/s/1r57xI5fSVba_Q3biCj06yg 提取码&#xff1a;xk30 2. 创建运行ora…