放弃 console.log 吧!用 Debugger 你能读懂各种源码

放弃 console.log 吧!用 Debugger 你能读懂各种源码

放弃 console.log 吧!用 Debugger 你能读懂各种源码

很多同学不知道为什么要用 debugger 来调试,console.log 不行么?

还有,会用 debugger 了,还是有很多代码看不懂,如何调试复杂源码呢?

这篇文章就来讲一下为什么要用这些调试工具:

console.log vs Debugger

相信绝大多数同学使用 console.log 调试的,把想看的变量值打印在控制台。

这样能满足需求,但是遇到对象的打印就不行了。

比如我想看 webpack 源码里的 compilation 对象的值,我打印了一下:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

但你会发现对象的值也是对象的时候不会展开,而是打印一个 [Object] [Array] 这种字符串。

更致命的是打印的太长会超过缓冲区的大小,terminal 里会显示不全:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

而你用 debugger 来跑,在这里打个断点来看就没这些问题了:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

有的同学可能会说,那打印一个简单的值的时候用 console.log 还是很方便呀。

比如这样:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

真的么?

那还不如用 logpoint:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

 

放弃 console.log 吧!用 Debugger 你能读懂各种源码

代码执行到这里就会打印:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

而且没有污染代码,用 console.log 的话调试完之后这个 console 不也得删掉么?

但是 logpoint 不用,它就是个断点的设置,不在代码里。

当然,最重要的是 Debugger 调试是可以看到调用栈和作用域的!

首先是调用栈,它就是代码的执行路线。

比如这个 App 的函数组件,你可以看到渲染这个函数组件会经历 workLoop、beginWork、renderWithHooks 这些流程:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

你可以点开调用栈的每一帧看下都执行了啥逻辑,用到啥数据。比如可以看到这个函数组件的 fiber 节点:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

再就是作用域,点击每一个栈帧就可以看到每个函数的作用域中的变量:

放弃 console.log 吧!用 Debugger 你能读懂各种源码

放弃 console.log 吧!用 Debugger 你能读懂各种源码

可以看到调用栈来理清出错前都走了哪些代码,可以通过作用域来看到每一个变量的值。

有了这些东西,排查错误不就很轻松了么!

而你用 console.log 呢?

啥也没,只能自己猜。

由于本篇文章都是gif动图,今天上传太累了,要看全文,请点击以下链接:https://cybozudev.kf5.com/hc/community/question/34258651/

原文链接:https://www.cnblogs.com/cybozu/p/17325769.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:放弃 console.log 吧!用 Debugger 你能读懂各种源码 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月18日

相关文章

  • js验证email的正则

    JS验证 Email 的正则表达式是一项很重要的前端技能,本篇攻略旨在帮助想要掌握这项技能的读者们进行学习。 1. 什么是正则表达式 正则表达式是一种特殊的文本字符串,用于在文本中查找、替换和匹配符合某些特定规则的字符串。利用正则表达式可以简化很多复杂的字符串操作,使代码更加简洁高效。 2. 邮箱正则表达式规则 验证Email的正则表达式需要遵循RFC 53…

    JavaScript 2023年6月10日
    00
  • javascript prototype的深度探索不是原型继承那么简单

    下面我将为你详细讲解“Javascript Prototype的深度探索不是原型继承那么简单”的完整攻略。 一、了解prototype 在Javascript中,每个对象都有一个prototype属性,这个属性指向了它所对应的构造函数的原型对象(也称为原型),也是实现JavaScript中原型继承的关键。 示例代码: function Person(name…

    JavaScript 2023年6月10日
    00
  • 日常收集JS邮箱验证正则表达式

    当我们在开发 web 应用时,经常会有需要验证邮箱地址的情况,其中验证方法之一就是使用正则表达式。下面,我们来讲解一个较为完整的日常收集JS邮箱验证正则表达式的攻略。 确定目标 在进行任何一项技术攻略时,第一步都是要明确目标。对于本文所讲的“日常收集JS邮箱验证正则表达式”的攻略,其目标是收集常用的 JS 邮箱验证正则表达式并进行整合。 收集来源 在确定了目…

    JavaScript 2023年6月10日
    00
  • ASP.NET MVC 3实现访问统计系统

    下面是ASP.NET MVC 3实现访问统计系统的攻略。 简介 ASP.NET MVC 3是Microsoft推出的一种基于MVC设计模式的Web应用程序框架,可以帮助开发者更容易地创建高度可测试的、基于Web的应用程序。 在本攻略中,我们将介绍如何利用ASP.NET MVC 3来实现一个简单的访问统计系统,以跟踪网站访问量及其它相关数据。 实现步骤 创建M…

    JavaScript 2023年6月11日
    00
  • JavaScript的递归之递归与循环示例介绍

    以下是“JavaScript的递归之递归与循环示例介绍”完整攻略: 前言 JavaScript的递归和循环是编程中的两种常见方法,常用于处理重复性操作。递归需要注意堆栈溢出、效率等问题,而循环则需要注意控制条件和循环变量等问题。正确选择适合的方式能够让程序更加高效、简洁。本文将通过两条示例说明递归和循环的不同实现方式及其效果。 示例一:斐波那契数列 斐波那契…

    JavaScript 2023年5月28日
    00
  • 详解Python中logging日志模块在多进程环境下的使用

    1. 概述 logging是Python官方提供的通用日志模块,可以帮助开发者轻松实现对程序的日志记录和管理。在多进程环境下,要想实现多个进程共同使用同一个日志文件,需要使用logging模块的多进程支持。 本文主要介绍如何使用logging模块在多进程环境下进行日志记录。 2. 配置多进程支持 在使用logging模块时,需要先对其进行配置。在多进程环境下…

    JavaScript 2023年5月28日
    00
  • javascript中的关于类型转换的性能优化

    当在JavaScript中处理各种类型的数据时,类型转换是不可避免的。由于JavaScript的动态类型特性,有时候需要将一种数据类型转换为另一种数据类型。然而,频繁的类型转换往往会导致性能损失。因此,我们需要优化这些类型转换,以提高代码的运行效率。 以下是关于在JavaScript中进行类型转换的性能优化的攻略: 1. 显式类型转换 在JavaScript…

    JavaScript 2023年6月10日
    00
  • Js视频播放器插件Video.js使用方法详解

    Js视频播放器插件Video.js使用方法详解 简介 Video.js是一个开源的JavaScript库,用于在不同的浏览器和设备上播放HTML5视频和音频。它具有许多功能,包括自定义外观,广告插入,播放列表,字幕和音频曲目等。 在本篇教程中,我们将详细介绍Video.js的使用方法,并提供一些示例说明。 安装 首先,你需要从Video.js官网下载库文件。…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部