当前位置: 首页 > news >正文

`console.log`调试完全指南

大家好,这里是 Geek技术前线

今天我们来探讨 Console.log() 的一些优点。并分析一些基本概念和实践,这些可以让我们的调试工作变得更加高效。
在这里插入图片描述

理解前端 log 与后端 log 的区别

前端 log 与后端 log 有着显著的不同,理解这一点至关重要。与后端系统中持久化 log 对于监控和调试不同,前端开发的流动性带来了不同的挑战。在调试后端时,我们通常会使用 tracepoints。

然而,前端由于需要不断刷新、重新加载、切换上下文等,情况就大不相同。在前端,过于依赖复杂的 log 机制可能会变得繁琐。

虽然 tracepoints 在基本打印语句之上仍然更为优越,但在前端工作流程中,持续的测试和浏览器重载减少了它们的优势。此外,像将 log 记录到文件或结构化摄取这样的功能在浏览器中很少有用

不过,使用 log 记录器仍然被认为是长期 log 记录的最佳实践,而典型的 Console.log 在短期 log 记录中也有一些小技巧。

利用 Console log 级别

浏览器控制台的一个隐藏功能是它对 log 级别的支持,这比基本的打印语句要强大得多。控制台提供了五个级别:

log:标准 log 记录

debug:与 log 相同,但用于调试目的

info:信息性消息,通常与 log/debug 呈现相似

warn:可能需要注意的警告

error:发生的错误

虽然 log 和 debug 可能难以区分,但这些级别使得调试体验更加有序和过滤。浏览器允许根据这些级别过滤输出,类似于服务器端 log 系统的功能,让我们能够专注于相关消息。
image

使用 CSS 自定义控制台输出

前端开发为我们提供了创造性解决方案的机会,而 log 记录也不例外。在控制台中使用 CSS 样式可以使 log 更加引人注目。通过在控制台消息中使用 %c,我们可以应用自定义的 CSS 样式:

console.customLog = function (msg) {console.log("%c" + msg,"color:black;background:pink;font-family:system-ui;font-size:4rem;-webkit-text-stroke: 1px black;font-weight:bold");
};
console.customLog("Dazzle");

这种方法在我们需要让特定 log 突出或以视觉方式组织输出时非常有用。我们可以使用多个 %c 替换符来为 log 消息的不同部分应用各种样式。

image

使用 console.trace() 进行堆栈追踪

console.trace() 方法可以在特定位置打印堆栈追踪,这在理解代码流时有时会非常有帮助。然而,由于 JavaScript 的异步特性,堆栈追踪并不总是像后端调试那样简单。不过,在某些场景下,例如同步代码段或事件处理,它仍然非常有价值。

断言

前端代码中的断言允许开发者强制执行预期,并促进“快速失败”的心态。使用 Console.assert(),我们可以测试条件:

console.assert(x > 0, "x must be greater than zero");

在浏览器中,失败的断言会显示为错误,类似于 console.error。一个额外的好处是,断言可以从生产构建中剔除,从而消除任何性能影响

image

将对象复制到剪贴板

在调试过程中,我们常常需要检查对象,而 copy(object) 方法则允许我们将对象的内容复制到剪贴板,以便在外部使用。这一功能在我们需要传输数据或在浏览器外部分析数据时非常有用。

使用 console.dir() 和 dirxml() 进行检查

console.dir() 方法提供了更详细的对象视图,展示了它们的属性,就像在调试器中看到的一样。这对于检查 DOM 元素或探索 API 响应特别有帮助。同时,console.dirxml() 允许我们以 XML 形式查看对象,这在调试 HTML 结构时也非常实用。

计数函数调用

跟踪函数被调用的频率或代码块的执行次数是至关重要的。console.count() 方法可以记录它被调用的次数,帮助我们验证函数是否按预期被调用:

function myFunction() {console.count("myFunction called");
}

我们可以使用 console.countReset() 来重置计数器。这个简单的工具可以帮助我们捕捉性能问题或确认正确的执行流程。

使用分组组织 log

为了防止 log 杂乱,我们可以使用控制台分组来组织相关消息。console.group() 开始一个可折叠的 log 部分,而 console.groupEnd() 则关闭它:

console.group("My Group");
console.log("Message 1");
console.log("Message 2");
console.groupEnd();

分组使得我们更容易浏览复杂的 log,并保持控制台的整洁。

Chrome 特定的调试功能

监控功能:Chrome 的 monitor() 方法可以记录对函数的每一次调用,显示参数,从而提供一种方法追踪的体验。

监控事件:使用 monitorEvents(),我们可以记录某个元素上的事件。这对于调试用户界面交互非常有用。例如,monitorEvents(window, 'mouseout') 只会记录 mouseout 事件。

查询对象实例queryObjects(Constructor) 列出所有使用特定构造函数创建的对象,让我们对内存使用和对象实例化有更深入的了解。

总结

前端调试工具已经取得了长足的进步。这些工具提供了一系列丰富的功能,远远超出了简单的 console.log() 语句。从 log 级别和 CSS 样式到断言和事件监控,掌握这些技巧可以彻底改变我们的调试工作流程。

参考 https://hackernoon.com/front-end-debugging-part-2-consolelog-to-the-max-explained?source=rss

相关文章:

`console.log`调试完全指南

大家好,这里是 Geek技术前线。 今天我们来探讨 Console.log() 的一些优点。并分析一些基本概念和实践,这些可以让我们的调试工作变得更加高效。 理解前端 log 与后端 log 的区别 前端 log 与后端 log 有着显著的不同,理解这一点至关重要。…...

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…...

16 —— Webpack多页面打包

需求&#xff1a;把 黑马头条登陆页面-内容页面 一起引入打包使用 步骤&#xff1a; 准备源码&#xff08;html、css、js&#xff09;放入相应位置&#xff0c;并改用模块化语法导出 原始content.html代码 <!DOCTYPE html> <html lang"en"><head&…...

微服务即时通讯系统的实现(服务端)----(3)

目录 1. 消息存储子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 数据管理1.4.1 数据库消息管理1.4.2 ES文本消息管理 1.5 接口的实现1.5.1 消息存储子服务所用到的protobuf接口实现1.5.2 最近N条消息获取接口实现1.5.3 指定时间段消息搜索接口实现1.5.4 关键字消…...

.net6.0 mvc 传递 model 实体参数(无法对 null 引用执行运行时绑定)

说一下情况&#xff1a; 代码没问题&#xff0c;能成功从数据库里查到数据&#xff0c;能将数据丢给ViewBag.XXXX, 在View页面也能获取到 ViewBag.XXXX的值&#xff0c;但是发布到线上后报这个错&#xff1a; Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 …...

VUE 入门级教程:开启 Vue.js 编程之旅

一、Vue.js 简介 Vue.js 是一套构建用户界面的渐进式 JavaScript 框架。它专注于视图层的开发&#xff0c;能够轻松地与其他库或现有项目进行整合。Vue.js 的核心库只关注视图层&#xff0c;通过简洁的 API 实现数据绑定和 DOM 操作的响应式更新&#xff0c;让开发者可以高效地…...

Ubantu系统docker运行成功拉取失败【成功解决】

解决docker运行成功拉取失败 失败报错 skysky-Legion-Y7000-IRX9:~$ docker run hello-world docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head “http://%2Fvar%2Frun%2Fdocker.sock/_ping”: dial uni…...

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…...

机器学习——生成对抗网络(GANs):原理、进展与应用前景分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一. 生成对抗网络的基本原理二. 使用步骤2.1 对抗性训练2.2 损失函数 三. GAN的变种和进展四. 生成对抗网络的应用五. 持续挑战与未来发展方向六. 小结 前言 生…...

「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏

本篇将带你实现一个简单的数字猜谜游戏。用户输入一个数字&#xff0c;应用会判断是否接近目标数字&#xff0c;并提供提示“高一点”或“低一点”&#xff0c;直到用户猜中目标数字。这个小游戏结合状态管理和用户交互&#xff0c;是一个入门级的互动应用示例。 关键词 UI互…...

Ps:存储 Adobe PDF

在 Adobe Photoshop 中&#xff0c;将图像保存为 PDF 文件时&#xff0c; 会弹出“存储 Adobe PDF” Save Adobe PDF对话框。在此对话框中提供了多个选项&#xff0c;用于控制 PDF 文件的输出&#xff0c;包括一般设置&#xff08;选择预设、兼容性和保留编辑功能&#xff09;、…...

DDR3保姆级使用教程:ZYNQ 7010

内容:使用DDR3 IP核&#xff0c;向DDR3写入数据&#xff0c;然后再读出数据&#xff0c;通过串口打印。 设备&#xff1a;ZYNQ 7010 xc7z010clg-400-1。软件VIVADO 2018.3 &#xff08;1&#xff09;工程模块&#xff1a;一个写FIFO&#xff0c;一个读FIFO。一个ZYNQ IP核&am…...

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

简介&#xff1a;本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤&#xff0c;包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义&#xff0c;阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法&#xff0…...

【JAVA] 杂谈: java中的拷贝(克隆方法)

这篇文章我们来介绍什么是拷贝&#xff0c;并且实现浅拷贝到深拷贝。 目录 一、浅拷贝 1.1 clone 方法 1.2 实现浅拷贝&#xff1a; 1.2.1 重写 clone方法 1.2.2 实现接口 Cloneable 1.2.3 调用克隆方法 1.2.4 原理图&#xff1a;​ 1.3 浅拷贝的不足 1.3.1 增加引用…...

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...

关于BeanUtils.copyProperties是否能正常复制字段【详细版】

话不多说&#xff01;先总结&#xff1a; 1、字段相同&#xff0c;类型不同&#xff08;不复制&#xff0c;也不报错&#xff09; 2、子类父类 (1)子类传给父类&#xff08;可以正常复制&#xff09; (2)父类传给子类&#xff08;可以正常复制&#xff09; 3、子类父类&#x…...

爬虫框架快速入门——Scrapy

适用人群&#xff1a;零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy&#xff1f; Scrapy 是一个基于 Python 的网络爬虫框架&#xff0c;它能帮助你快速爬取网站上的数据&#xff0c;并将数据保存到文件或数据库中。 特点&#xff1a; 高效&#xff1a;支…...

鸿蒙开发-HMS Kit能力集(应用内支付、推送服务)

1 应用内支付 开发步骤 步骤一&#xff1a;判断当前登录的华为账号所在服务地是否支持应用内支付 在使用应用内支付之前&#xff0c;您的应用需要向IAP Kit发送queryEnvironmentStatus请求&#xff0c;以此判断用户当前登录的华为帐号所在的服务地是否在IAP Kit支持结算的国…...

TYUT设计模式大题

对比简单工厂&#xff0c;工厂方法&#xff0c;抽象工厂模式 比较安全组合模式和透明组合模式 安全组合模式容器节点有管理子部件的方法&#xff0c;而叶子节点没有&#xff0c;防止在用户在叶子节点上调用不适当的方法&#xff0c;保证了的安全性&#xff0c;防止叶子节点暴露…...

Webman中实现定时任务

文章目录 Webman中实现定时任务一、引言二、安装与配置1、安装Crontab组件2、创建进程文件3、配置进程文件随Webman启动4、重启Webman5、Cron表达式&#xff08;补充&#xff09;例子 三、使用示例四、总结 Webman中实现定时任务 一、引言 在现代的后端开发中&#xff0c;定时…...

从零部署私有AI助手:igogpt项目实战与优化指南

1. 项目概述与核心价值最近在折腾AI应用部署的时候&#xff0c;发现了一个挺有意思的项目&#xff0c;叫igolaizola/igogpt。乍一看这个名字&#xff0c;可能会有点摸不着头脑&#xff0c;但如果你对开源AI模型部署和WebUI界面搭建感兴趣&#xff0c;那这个项目绝对值得你花时间…...

通过 Taotoken 的 Token Plan 套餐在 Ubuntu 长期项目中实现预算可控

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过 Taotoken 的 Token Plan 套餐在 Ubuntu 长期项目中实现预算可控 在长期运行的 AI 辅助项目中&#xff0c;成本的可预测性和可…...

高精度电压基准技术:LT6657的创新与应用

1. 高精度电压基准的技术演进与系统需求在精密数据采集系统的设计中&#xff0c;电压基准如同整个系统的"心脏"&#xff0c;其稳定性直接决定了测量结果的可靠性。过去二十年里&#xff0c;我参与过数十个工业测量项目&#xff0c;深刻体会到基准源选择对系统性能的致…...

终极显卡驱动清理指南:如何使用Display Driver Uninstaller彻底解决驱动残留问题

终极显卡驱动清理指南&#xff1a;如何使用Display Driver Uninstaller彻底解决驱动残留问题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/dis…...

从零到一:基于iSYSTEM winIDEA与IC5000的嵌入式程序烧写与调试实战指南

1. 环境准备&#xff1a;搭建你的嵌入式开发工作台 第一次接触iSYSTEM工具链时&#xff0c;我完全被各种专业术语搞懵了。后来才发现&#xff0c;只要把环境搭好&#xff0c;后面的操作就像拼乐高一样简单。这里我会手把手带你配置好winIDEA和IC5000调试器&#xff0c;避开那些…...

AI工具搭建自动化视频生成生成日志审计

1&#xff0c;它是个啥 其实就是拿AI当黑盒&#xff0c;把视频生成这件事拆成按脚本跑的一连串动作&#xff0c;然后全程记下谁在什么时候调了哪个模型、输出了啥、花了多少秒、花了多少钱。做这件事的人&#xff0c;多半是公司里管产研的那几位&#xff0c;他们怕的不是AI干砸…...

现代生产级微服务+容器治理完整技术栈与架构方案详解(国内主流完整云原生微服务闭环架构)

文章目录一、业务开发层&#xff08;代码基座&#xff0c;所有业务的底层核心&#xff09;1.1 核心开发框架基座1.2 持久层与分库分表框架1.3 统一认证授权体系&#xff08;企业必备&#xff09;二、微服务治理层&#xff08;保障高可用&#xff0c;简历核心亮点&#xff09;2.…...

探索分叉网络:构建替代规范,明确多项目标以避现有网络弊端

引言本文档是一系列关于构建替代网络规范的非正式笔记&#xff0c;旨在避开现有网络的诸多弊端&#xff0c;同时保留其优点。需注意&#xff0c;这不是正式规范&#xff0c;内容可能随时间改变。网络由多个组件组成&#xff0c;每个组件或许都要重新审视。目前&#xff0c;我们…...

打破语言壁垒:Translumo屏幕实时翻译工具的终极使用指南

打破语言壁垒&#xff1a;Translumo屏幕实时翻译工具的终极使用指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否…...

31_AI短片实战第四弹:主观视角空间控制与分屏快速剪辑的AI生成策略(附提示词)

文章目录 一、第九镜:前方巨大峡谷——主观视角的空间精确控制 镜头设定 为什么这个镜头很难 迭代修正全记录 主观视角生成黄金法则 二、第十分镜:快速剪辑风格分屏——怪兽逼近与油门踩到底 镜头设定 尝试一次性生成 最终方案:拆分生成,后期合成 什么时候应该“拆开做”?…...