详解Chrome 实用调试技巧

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

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

常用快捷键

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

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

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编写这段代码是最好的选择,经过几次调试修改,最终成果如下:

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

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

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

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

copy 格式化拷贝

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

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

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

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

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

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

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

iframe 调试

如果我们使用Webpack服务器工具webpack-dev-server访问项目的开发页面,我们会发现,开发页面被内嵌到了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控制台的上下文切换功能会更加方便:

我们将上下文切换到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函数,从而触发断点调试,自动定位到了函数所在的地方:

日后要调试或者定位公共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;}

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

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

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

Async调试

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

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

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

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

(0)

相关推荐

  • 使用Chrome调试JavaScript的断点设置和调试技巧

    你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用这两种土办法确实解决了很多小型 JavaScript 脚本的调试问题.不过放着 Chrome 中功能越发强大的开发者工具不用实在太可惜了.本文主要介绍其中的 JavaScript断点设置和调试功能,也就是其中的 Sources Panel(以前叫 Scripts).如果你精通 Eclipse 中的各

  • 利用chrome浏览器进行js调试并找出元素绑定的点击事件详解

    前言 大家有没有遇到这样的一个问题,我们在分析一些大型电子商务平台的Web前端脚本时,想找到一个元素绑定的点击事件,并不是那么容易,因为有些前端脚本封装的比较隐蔽,甚至有些加密脚本,用传统的查找元素ID.或者页面源码方法去找,可能最后徒劳无功.下面我来介绍利用chrome浏览器来查找元素绑定的事件. Chrome开发工具中最有用的面板Sources.Sources面板几乎是最常用到的Chrome功能面板,也是解决一般问题的主要功能面板.通常只要是开发遇到了js报错或者其他代码问题,在审视一遍代码

  • Chrome浏览器控制台console使用详解

    Chrome自带的开发者工具提供了强大的调试系统,除了可以用来查看DOM tree结构.CSS样式调试.动画调试和JS代码断点调试等.今天不聊别的,就聊聊使用console调试那些事儿. 在使用React.Vue等需要编译语法的前端框架开发时,前端调试已经变得不那么容易,除了使用React Dev Tools,Vue Dev Tools和Redux Dev Tools等Chrome插件,就是一堆的 console.log() 来打印我们需要看到的变量,虽然也有用,但是比较单一,要调试复杂数据需要

  • Chrome开发者工具9个调试技巧详解

    对于我们前端开发者来说,Chrome自带的开发者工具绝对是不可或缺的调试工具,我们常用的调试方法包含一些console等,而Chrome自带的开发者工具其实很强大,下面我们来聊聊一些你可能不知道的使用方法. Scroll Into View 滚动如视图内 在Elements 标签中,查看页面元素的时候,如果当前这个元素不在视图内,可以通过这个方法让这个元素快速滚入视图中. 操作: 在Elements 标签页中选择一个不在视图内的元素 右击,选择Scrollintoview Copy As Fet

  • 基于Python开发chrome插件的方法分析

    本文实例讲述了基于Python开发chrome插件的方法.分享给大家供大家参考,具体如下: 谷歌Chrome插件是使用HTML.JavaScript和CSS编写的.如果你之前从来没有写过Chrome插件,我建议你读一下这个.在这篇教程中,我们将教你如何使用Python代替JavaScript. 创建一个谷歌Chrome插件 首先,我们必须创建一个清单文件:manifest.json. { "manifest_version": 2, "name": "Py

  • 通过chrome浏览器控制台(Console)进行PHP Debug的方法

    效果如下图 PHP Console是一款可以帮助用户模拟真实的PHP网站运行环境,帮助用户使用Chrome插件对PHP代码进行调试的Chrome插件,用户在Chrome中安装了PHP Console插件以后,可以在自己的PHP项目中引用PHP Console项目代码,并输出调试信息,让PHP Console插件进行捕获,这样在网站发布成功以后,还可以使用PHP Console插件进行输出调试信息到Chrome浏览器中,用户可以通过PHP Console插件来查看这些来自于PHP服务器发来的调试日

  • Chrome 调试技巧(小结)

    写在前面 本文包括浏览器调试,不包括web移动端调试. 本文调试均在chrome浏览器进行 alert 这个不用多说了,不言自明 console基本输出 想必大家都在用console.log在控制台输出点东西,其实console还有其它的方法: console.log("打印字符串");//在控制台打印自定义字符串 console.error("我是个错误");//在控制台打印自定义错误信息 console.info("我是个信息");//在控制

  • 9种使用Chrome Firefox 自带调试工具调试javascript技巧

    我们调试Javascript一般会用到Chrome或Firefox自带的调试工具,本文列出了几条用于调试Javascript的技巧,掌握它们,让我们花更少的时间来解决错误和bug,从而提高开发效率. 1. debugger 除了console.log, debugger是我们最喜欢.快速的调试工具.执行代码后,Chrome会在执行时自动停止.你甚至可以把它封装成条件,只在需要时才运行. if (thisThing) { debugger; } 2. 用表格显示对象 有时, 有一组复杂的对象要查看

  • 详解Chrome 实用调试技巧

    如今Chrome浏览器无疑是最受前端青睐的工具,原因除了界面简洁.大量的应用插件,良好的代码规范支持.强大的V8解释器之外,还因为Chrome开发者工具提供了大量的便捷功能,方便我们前端调试代码,我们在日常开发中是越来越离不开Chrome,是否熟练掌握Chrome调试技巧恐怕也会成为考量前端技术水平的标杆. 介绍Chrome调试技巧的文章很多,本文结合我自己的开发经验,希望从实际运用的角度为大家再一次谈一谈这些功能,也希望对大家都有所帮助和启发. 常用快捷键 ctrl+p项目中定位文件,以下查找

  • 详解Linux下调试器GDB的基本使用方法

    一.概述 GDB调试的三种方式: 1. 目标板直接使用GDB进行调试. 2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端. 3. 目标板使用ulimit -c unlimited,生成core文件:然后主机使用xxx-linux-gdb ./test ./core. 二.gdb调试 构造测试程序如下main.c和sum.c如下: main.c:#include <stdio.h> #include <stdlib.h> extern int sum(

  • 详解python算法常用技巧与内置库

    近些年随着python的越来越火,python也渐渐成为了很多程序员的喜爱.许多程序员已经开始使用python作为第一语言来刷题. 最近我在用python刷题的时候想去找点python的刷题常用库api和刷题技巧来看看.类似于C++的STL库文档一样,但是很可惜并没有找到,于是决定结合自己的刷题经验和上网搜索做一份文档出来,供自己和大家观看查阅. 1.输入输出: 1.1 第一行给定两个值n,m,用空格分割,第一个n决定接下来有n行的输入,m决定每一行有多少个数字,m个数字均用空格分隔. 解决办法

  • apache日志文件详解和实用分析命令

    一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error_log 1).access_log access_log为访问日志,记录所有对apache服务器进行请求的访问,它的位置和内容由CustomLog指令控制,LogFormat指令可以用来简化该日志的内容和格式 例如,我的其中一台服务器配置如下: 复制代码 代码如下: CustomLog "| /usr/sbin/rotatelogs /var/log/apache

  • Ping命令详解 精简实用

    Ping是个使用频率极高的实用程序,用于确定本地主机是否能与另一台主机交换(发送与接收)数据报.根据返回的信息,我们就可以推断TCP/IP参数是否设置得正确以及运行是否正常.需要注意的是:成功地与另一台主机进行一次或两次数 据报交换并不表示TCP/IP配置就是正确的,我们必须执行大量的本地主机与远程主机的数据报交换,才能确信TCP/IP的正确性. 简单的说,Ping就是一个测试程序,如果Ping运行正确,我们大体上就可以排除网络访问层.网卡.MODEM的输入输出线路.电缆和路由器等存在的故障,从

  • Prototype框架详解

    这里所说的"Prototype"不是JavaScript编程中的原型("prototype"),而是由"Sam Stephenson"写的一个JavaScript类库.这个构思奇妙,而且兼容标准的类库,能帮助程序员轻松建立有高度互动的"web2.0"特性的富客户端页面. •很多人初次接触Prototype,都是从其"$"系列函数开始的,这些类似于桌面应用程序的快捷方式,是Prototype框架中使用频率最高

  • 易语言到半角详解

    易语言到半角,这个就是把文本变为半角状态,我教大家操作. 1.易语言新建一个windows窗口 点击进入代码编辑区 具体看如何用易语言编写自己第一个程序? 2.我们输入到半角() 这个命令 3.展开这个命令 我们发现这个命令只有一个参数 4.这个参数比较简单 我们输入全角状态的文本"abc" 5.我们运用调试输出这个命令,具体看易语言调试输出函数实例详解 我们输入调试输出 (到半角 ("abc")) 6.结果为"abc" 这个就是半角状态下的了

  • 易语言位取反操作详解

    易语言位取反实例讲解,这个是位运算,希望能帮上大家. 1.易语言新建一个windows窗口 点击进入代码编辑区 具体可以看看如何用易语言编写自己第一个程序? 2.我们输入位取反() 这个格式和中文差不多 3.我们展开这个函数看看 只有一个参数 4.这个参数是一个数值 是整数型 我们输入3 5.我们使用调试输出这个函数 具体可以看看易语言调试输出函数实例详解 我们输入调试输出(位取反 (3)) 6.运行结果为-4 它是把3用位表示然后取反,再换算成的数值

  • 详解易语言字符命令

    易语言字符命令,这个命令比较少见,但是有用,我教大家操作. 1.易语言新建一个windows窗口 点击进入代码编辑区 具体看如何用易语言编写自己第一个程序? 2.我们输入 这个命令 字符() 3.展开这个字符命令 我们发现只有一个参数 4.这个参数比较少见,字节型它的取值范围为0~255 我们输入100看看 5.运用调试输出这个函数,具体看易语言调试输出函数实例详解 我们输入调试输出 (字符 (100)) 6.结果为 d 这个需要对照 ASCII表看看

  • Python代码调试技巧教程详解

    目录 关于代码调试的技巧,我之前写过很多的文章,加起来也有 将近 10 篇了,关注比较早的同学,也应该都有看过. 还没看过的同学,欢迎前往查阅:调试技巧 其中有一篇是关于 pdb 的调试技巧的: 里面介绍了两种 pdb 的调试入口,也是大部分所熟知的. 这里再带大家回顾一下 第一种:指定 -m pdb 来开启 $ python -m pdb pdb_demo.py 第二种:使用 pdb.set_trace() 在代码中设置断点 import pdb pdb.set_trace() 但其实,pdb

随机推荐