服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 详解Chrome 实用调试技巧

详解Chrome 实用调试技巧

2020-08-17 16:28rj_bian 编程技术

这篇文章主要介绍了详解Chrome 实用调试技巧,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

如今chrome浏览器无疑是最受前端青睐的工具,原因除了界面简洁、大量的应用插件,良好的代码规范支持、强大的v8解释器之外,还因为chrome开发者工具提供了大量的便捷功能,方便我们前端调试代码,我们在日常开发中是越来越离不开chrome,是否熟练掌握chrome调试技巧恐怕也会成为考量前端技术水平的标杆。

介绍chrome调试技巧的文章很多,本文结合我自己的开发经验,希望从实际运用的角度为大家再一次谈一谈这些功能,也希望对大家都有所帮助和启发。

常用快捷键

ctrl+p项目中定位文件,以下查找vuejs库文件:

详解Chrome 实用调试技巧

ctrl+shif+o文件中定位成员函数,以下定位到vuejs的nexttick接口:

详解Chrome 实用调试技巧

snippets 随时编写代码

chrome在souces页面提供snippets一栏,这里我们可以随时编写js代码,运行结果会打印到控制台。代码是全局保存的,我们在任何页面,包括新建标签页,都可以查看或运行这些代码。

我们不再需要为了运行一小段js代码而新建一个html页面。snippets的方便之处在于,你只需要打开chrome就可以编写一份任意页面都可以运行的js代码,而且用过snippets都知道,snippets编辑器是可以和sublime text相媲美的。

某次项目中,我需要将100多页的word文档导入到页面中。考虑后续样式编写,页面的html结构如下:

<div class="help-page_row">
  <h3 class="help-page_title">title</h3>
  <p class="help-page_desc">paragraph</p>
  <p class="help-page_desc">paragraph</p>
</div>

手工将100多页的内容组合成上面的html结构太过耗费时间,不太现实,所以我决定使用js来将文档内容的标题和段落解析出来,并进行html包装。

由于不需要视图的支持,在snippets编写这段代码是最好的选择,经过几次调试修改,最终成果如下:

详解Chrome 实用调试技巧

最后,将word文档内容复制到snippets中,执行解析函数,最终的解析出来的html结果打印到控制台:

详解Chrome 实用调试技巧

snippets中可以使用控制台的copy接口,解析结果直接拷贝到剪切板会更方便

使用snippets来完成这类轻量级工作时,不需要追求代码的可读性、可维护性,我们的代码只需要在大部分场景下能够正常运行就足够了。

但为了满足大部分场景,代码也是需要反复调试修改。snippets最实用之处恰恰在于,随时编写,随时调试,随时修改!

copy 格式化拷贝

在项目开发中,我们可能需要将后台数据拷贝到本地,作为本地数据进行调试。

如果后台返回没有格式化的json数据,在本地调试中我们难免会遇到手动修改数据的情况,格式不美观的json数据修改起来会异常困难。

说到json的格式化,我们首先想到的是json.stringify的格式化功能,例如四个空格的缩进:

json.stringify({name: 'lxjwlt'}, null, 4);

详解Chrome 实用调试技巧

每次格式化json数据都要编写这段代码实在太麻烦,我们可以使用chrome控制台的copy接口解决这一问题:

1.请求项的右键菜单中选择copy response拷贝响应内容
2.命令行中使用copy接口处理数据
3.得到格式化的json数据

详解Chrome 实用调试技巧

不仅仅是对象,copy接口对任何数据都可以进行拷贝,这里利用的是copy在拷贝数组或对象过程中,对数据进行美化的功能

iframe 调试

如果我们使用webpack服务器工具访问项目的开发页面,我们会发现,开发页面被内嵌到了iframe中进行渲染。

由于chrome控制台默认的上下文是window.top,控制台中无法直接对内嵌在iframe的开发页面进行操作。如果我们想对iframe中的页面进行dom操作,或者执行类库api,首先我们通过contentwindow来获取到iframe的上下文,然后使用with语句进行调试:

// html
<iframe id="iframe"></iframe>

// 控制台
with (document.getelementbyid('iframe').contentwindow) {
  inspect(document.body);

  new vue({ /* ... */ });

  // do something...
}

以上方法可以在任意浏览器上使用,但如果我们使用的是chrome浏览器,chrome控制台的上下文切换功能会更加方便:

详解Chrome 实用调试技巧

我们将上下文切换到iframe中,控制台的代码都会基于iframe的上下文来执行。如果你用webpack-dev-server进行调试,你会感谢这个功能。

debug 毫无用处?

chrome控制台提供debug接口,可以传入一个函数,当这个函数下次执行的时候,调试器会自动在该函数中进行断点调试。

我们明明可以在代码中设置断点进行调试,为什么要用到debug来设置,是为了舍弃鼠标用命令行装逼而已吗?

在我看来,debug函数还提供了定位功能,它能够让我们很快的找到指定的函数。下面演示怎么调试vuejs的数据驱动,如何找到vuejs数据驱动的代码入口。

我们都知道,vuejs的数据驱动是通过defineproperty方法对数据的getter和setter进行封装,在这个封装中实现数据变化驱动视图同步修改的功能。如果我们想研究vuejs的数据驱动,那么首先要找到封装getter和setter的地方,我们可以通过debug接口来进行定位。以下用getter方法举例。

首先我们知道vuejs实例中的数据都是映射_data属性中的值:

var vm = new vue({
  data: {
    name: 'lxjwlt'
  }
});

vm.name === vm._data.name; // true

所以我们要找的数据实际在vuejs实例的_data属性中。接下来我们通过getownpropertydescriptor获取数据的getter函数:

object.getownpropertydescriptor(vm._data, "name").get;

找到了getter函数,我们就可以使用debug接口对其进行断点调试:

debug(object.getownpropertydescriptor(vm._data, "name").get)

这样,当我们获取vm.name数据时,自然会触发该数据的getter函数,从而触发断点调试,自动定位到了函数所在的地方:

详解Chrome 实用调试技巧

日后要调试或者定位公共api,不妨试试chrome的debug接口功能!

条件breakpoint

在chrome中,我们可以给断点设置表达式,当表达式为true时断点调试才会生效,这就是条件断点。

有了条件断点,我们在调试代码的时候能够更加精确的控制代码断点的时机,特别是一段代码会被反复运行的时候,条件断点能够跳过大多数情况,只关注我们想要的情景。除了这一点外,条件断点调试还有另一个用法。

在断点调试中,我们往往会检查当前代码的执行状态,如果操作比较繁琐,那么我们可以使用条件断点添加自动化操作,帮助我们减少一部分工作量。

比如我们要在断点发生后查看dom元素,那么断点条件可以这么写:

// 当dom元素满足某个条件进行断点,同时查看这个元素
elem.hasattribute('class') && inspect(elem);

如果不清楚操作的返回值,我们可以强行让该操作返回true,从而不影响断点的条件判断:

elem.hasattribute('class') && (inspect(elem) || true);

或者分行写:

if (elem.hasattribute('class')) {inspect(elem); true;}

详解Chrome 实用调试技巧

再比如,在vuejs的调试中,我们往往需要知道vuejs实例的当前状态,所以每次触发断点调试时,我们可以先使用clear接口清除控制台历史输出,再将vuejs实例的当前状态打印出来:

vm.sum > 4 && (clear() || vm.$log() || true);

详解Chrome 实用调试技巧

如果在条件断点中定义变量,变量是定义到全局作用域上,即window对象上的

async调试

chrome调试器的async模式是为调试异步函数所设计一个功能。

在promise被广泛应用的今天,我们都知道,promise的回调是异步执行的,没有开启async模式前,调动栈只记录到回调函数本身,我们无法找到代码执行的顺序,这给我们调试带来巨大的困难。async模式可以解决这个问题:

详解Chrome 实用调试技巧

开启async模式后,异步函数之前的调用栈都会被记录下来,而且调用栈中代码执行状态也得到了保留。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/chinajava/p/5716869.html

延伸 · 阅读

精彩推荐
  • 编程技术从Context源码实现谈React性能优化

    从Context源码实现谈React性能优化

    这篇文章主要介绍Context的实现原理,源码层面掌握React组件的render时机,从而写出高性能的React组件,源码层面了解shouldComponentUpdate、React.memo、PureComponen...

    魔术师卡颂5312020-12-20
  • 编程技术用户态 Tcpdump 如何实现抓到内核网络包的?

    用户态 Tcpdump 如何实现抓到内核网络包的?

    在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的。那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包...

    开发内功修炼11612021-09-08
  • 编程技术让开发效率倍增的 VS Code 插件

    让开发效率倍增的 VS Code 插件

    今天来分享一些提升开发效率的实用 VS Code 插件!Better Comments 扩展可以帮助我们在代码中创建更人性化的注释,有不同形式和颜色的注释供我们选择。 ...

    前端充电宝7132022-04-21
  • 编程技术2021年值得关注的React PDF 库

    2021年值得关注的React PDF 库

    今天,许多网络应用程序为其用户提供内置的PDF浏览选项。然而,选择一个并不容易,因为它们的功能远远超过显示PDF。在这篇文章中,我将评估5个React的...

    TianTianUp5222021-06-21
  • 编程技术AIOps,SRE工程师手中的利器

    AIOps,SRE工程师手中的利器

    AIOps开始成为一种极为重要的站点可靠性工程工具。它能够高效吸纳观察数据、参与数据以及来自第三方工具的数据,判断系统运行状态并保证其处于最佳...

    至顶网5962021-03-08
  • 编程技术真正聪明的程序员,总有办法不加班

    真正聪明的程序员,总有办法不加班

    工作效率提升了,就可以少加班了,聪明的程序员,总会有一堆可以提升编码效率的工具?当一种工具满足不了工作需求,就去探索新的,今天纬小创就给...

    今日头条12482021-03-04
  • 编程技术Delphi - Indy idMessage和idSMTP实现邮件的发送

    Delphi - Indy idMessage和idSMTP实现邮件的发送

    这篇文章主要介绍了Delphi - Indy idMessage和idSMTP实现邮件的发送,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    JJ_JeremyWu6592020-09-22
  • 编程技术简单、好懂的Svelte实现原理

    简单、好懂的Svelte实现原理

    本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一边看、一边敲、一边学...

    魔术师卡颂4822021-11-10