前端调试技巧

作者:Blue布鲁日期:2025/12/3

本文档介绍前端开发中常用的调试技巧,涵盖 Console、VSCode Debug 和 Chrome Debugger 的使用方法。

一. Console

Console 是前端开发中最基础也是最常用的调试工具 console.log()、console.info()、console.warn()、console.error() 这些都是比较基础的输出功能,这里不再赘述~

console.table()

非常适合用于输出结构化数据(对象、数组等) 对于接口返回用这种输出方法非常好,还能点击表头排序

1// 输出数组
2const users = [
3  { id: 1, name: 'Alice', age: 25 },
4  { id: 2, name: 'Bob', age: 30 },
5  { id: 3, name: 'Charlie', age: 35 }
6];
7console.table(users);
8
9// 输出对象
10const user = {
11  name: 'John',
12  email: '[email protected]',
13  age: 30,
14  address: {
15    city: 'Beijing',
16    country: 'China'
17  }
18};
19console.table(user);
20

console.time() / console.timeEnd()

用于测量代码执行时间。

1console.time('API 请求耗时');
2fetch('/api/data')
3  .then(response => response.json())
4  .then(data => {
5    console.timeEnd('API 请求耗时'); // API 请求耗时: 234.567ms
6  });
7

二. VSCode Debug

VSCode 提供了强大的调试功能,可以直接在编辑器中设置断点、单步调试、监控变量值等。 VSCode 系的编辑器操作方法都一样,如 Cursor~

2.1 配置调试环境

VSCode 侧边栏选择 Run and Debug 并创建 launch.json 文件 创建 launch.json 时选择自己对应的浏览器即可(Chrome or Edge)

1{
2  "version": "0.2.0",
3  "configurations": [
4    {
5      "type": "chrome",
6      "request": "launch",
7      "name": "Launch Chrome against localhost",
8      "url": "http://localhost:8080", // 这里改成自己本地开发的 url
9      "webRoot": "${workspaceFolder}",
10      "skipFiles": [
11        "${workspaceFolder}/node_modules/**" // debug 时忽略 node_modules,只有我们业务代码进行 Debug 建议加上
12      ]
13    }
14  ]
15}
16

配置好后,点击菜单栏的 Launch 按钮,会重新打开一个 chrome 的窗口

2.2 调试控制

此时在对应代码行数前端点击一下,出现红点时即 打断点 成功,此时刷新页面即可看到代码停在这里,可以鼠标 Hover 查看对应变量值,也可以选择 Step Over (F10) 代码一步一步执行,可以看到代码详细的执行逻辑。

调试时,上面的基本按钮功能:

  • 继续 (F5): 继续执行到下一个断点
  • 单步跳过 (F10): 执行当前行,不进入函数内部
  • 单步进入 (F11): 进入函数内部
  • 单步跳出 (Shift + F11): 跳出当前函数
  • 重启 (Ctrl + Shift + F5): 重新开始调试
  • 停止 (Shift + F5): 停止调试

3.2 变量监视及错误捕获

变量监视

可以在变量监视的面板中监听某个变量,在调试过程中实时看到变量变化

错误捕获

在断点面板中开启Caught Exceptions,即可在有异常时,自动断点到错误代码行处~

三. Chrome Debugger

Chrome Debugger 是指在代码中使用 debugger 语句进行调试的方法。当代码执行到 debugger 语句时,如果浏览器 DevTools 已打开,程序会自动暂停,此时可以查看变量值、调用堆栈等信息。

3.1 debugger 语句基础

什么是 debugger 语句

debugger 是 JavaScript 的一个关键字,当浏览器 DevTools 打开时,执行到该语句会自动暂停程序执行。

1function myFunction() {
2  const data = { name: 'John', age: 30 };
3  debugger; // 程序会在这里暂停
4  console.log(data);
5}
6

使用前提

  1. 必须打开 Chrome DevTools:如果 DevTools 未打开,debugger 语句会被忽略
  2. 确保 Source Maps 启用:开发环境通常默认启用,生产环境需要配置
  3. 代码必须被执行:只有执行到的 debugger 才会生效

3.2 基础使用场景

调试函数执行

在函数开始或关键位置添加 debugger

1// lib/utils/format-number.ts
2export const formatNumber = (num: number) => {
3  debugger; // 查看传入的参数
4  const formatted = num.toLocaleString('en-US');
5  debugger; // 查看格式化后的结果
6  return formatted;
7};
8

调试条件分支

在条件判断处添加 debugger,查看条件值和执行路径:

1function processUser(user: User) {
2  debugger; // 查看 user 对象
3  if (user.age >= 18) {
4    debugger; // 进入此分支
5    return handleAdult(user);
6  } else {
7    debugger; // 进入此分支
8    return handleMinor(user);
9  }
10}
11

调试循环

在循环中添加 debugger,可以逐步查看每次迭代:

1function processItems(items: Item[]) {
2  for (let i = 0; i < items.length; i++) {
3    debugger; // 每次循环都会暂停,可以查看 i  items[i]
4    const item = items[i];
5    processItem(item);
6  }
7}
8
9// 或者只在特定条件下暂停
10function processItems(items: Item[]) {
11  for (let i = 0; i < items.length; i++) {
12    if (items[i].status === 'error') {
13      debugger; // 只在遇到错误状态时暂停
14    }
15    processItem(items[i]);
16  }
17}
18

调试 React 组件

在组件函数体中添加 debugger,查看每次渲染时的 props 和 state:

1// components/UserProfile.tsx
2export const UserProfile: React.FC<Props> = ({ userId }) => {
3  const [user, setUser] = useState<User | null>(null);
4  const [loading, setLoading] = useState(false);
5  
6  debugger; // 查看组件渲染时的 props 和初始 state
7  
8  useEffect(() => {
9    debugger; // 查看 useEffect 执行时的 userId
10    setLoading(true);
11    fetchUser(userId).then(data => {
12      debugger; // 查看获取到的用户数据
13      setUser(data);
14      setLoading(false);
15    });
16  }, [userId]);
17  
18  debugger; // 查看渲染时的最终状态
19  return <div>{user?.name}</div>;
20};
21

3.3 Chrome DevTools 断点调试面板

暂停后的操作

debugger 暂停程序后,可以在 DevTools 中:

查看变量值

  • 在 Sources 面板的 Scope 区域查看局部变量
  • 将鼠标悬停在代码中的变量上查看值
  • 在 Console 中输入变量名查看值

监视变量

  • 在 Watch 面板添加要监视的变量
  • 即可在调试过程中实时插件变量值的变化

单步调试

暂停后可以使用单步调试:

  • F8 (Resume): 继续执行到下一个 debugger
  • F10 (Step over): 单步跳过,不进入函数内部
  • F11 (Step into): 单步进入,进入函数内部
  • Shift + F11 (Step out): 单步跳出,跳出当前函数

参考资料


前端调试技巧》 是转载文章,点击查看原文


相关推荐


Python网络爬虫从入门到实战
new_dev2025/11/30

一 什么是爬虫 爬虫能做什么 政治角逐 2016年这场美国总统竞选被媒体称作“第一次数字化竞选”,希阿姨和川大大都组建了庞大的技术团队,将大量资金花在获取和使用投票者的信息上。民意调查结果,一直是总统大选时最倚重的数据来源。在长达半年的总统竞选活动中,会有许多组织或机构通过不同方式进行大量调查,并将结果汇总整理加工成民意调查数据。在更大的数据规模上,总统候选人们也采用了同样的策略,所依赖的数据来源也不仅仅是民意调查结果,还涵盖了诸多的如facebook这类的社交网站和公开及私有的数据库。


C++语言程序设计——11 C语言风格输入/输出函数
晚风(●•σ )2025/11/27

目录 一、输入函数二、输出函数(一)占位符(二)精度控制 一、输入函数 getchar()从标准输入读取一个字符,成功时返回读取的字符(ASCII码),失败时返回-1。 scanf() 进行格式化输入,可以读取各种数据类型(整数、浮点数、字符串等)。 例如,用 scanf 输入两个 char 类型变量,并输出: #include <iostream> using namespace std; int main() { char a, b; scanf("%c


基于最小拉普拉斯残差插值的去马赛克算法
ghie90902025/11/25

基于最小拉普拉斯残差插值的去马赛克算法。这是一种用于从Bayer模式图像中恢复全彩色图像的高质量算法。 算法原理 最小拉普拉斯残差插值(MLRI)基于以下关键思想: 颜色通道间的相关性:在同一位置,不同颜色通道间存在强相关性拉普拉斯算子:用于估计插值方向的平滑性残差最小化:选择使拉普拉斯残差最小的插值方向参考代码 利用最小拉普拉斯残差插值的去马赛克算法 www.youwenfan.com/contentcsm/82205.html MATLAB实现 function [rgb_image]


LeetCode 热题 100——普通数组——最大子数组和
做怪小疯子2025/11/23

14.最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [5,4,-1,7,8] 输出:23 提示: 1 <= nums.length <= 105 -


全脑智能“破局者”诞生,黑芝麻智能SesameX™,重构具身智能新范式
高工智能汽车2025/11/22

当前,全球人工智能技术正在加速向“物理世界赋能”,智能汽车与机器人产业技术融合进入深水区,一场关乎“全脑智能”的产业革命已经悄然来临。 11月20日,全球车规级高性能AI芯片厂商黑芝麻智能举行「多维进化 智赋新生」机器人平台产品发布会,并发布多维具身智能计算平台——黑芝麻智能SesameX™,包含一整套从端侧模组到全脑智能的体系化计算平台。 据了解,黑芝麻智能SesameX多维具身智能计算平台是行业唯一符合车规安全的具身智能计算平台,亦是行业首个针对具身智能商业化部署的全栈计算平台,包含商用


MySQL中的字符集与排序规则
程序新视界2025/11/20

在MySQL中,当使用字符串类型时,有两方面的知识我们需要特别关注一下:字符集和排序规则。如果使用不当,则可能会导致性能问题或在插入数据时出现一些异常情况。 字符集定义了对应列允许使用的字符,而排序规则是用于比较这些字符的基础规则。通常,每个类型的字符集都会有多种排序规则,但一个排序规则只能属于一个字符集。 这篇文章,我们就围绕MySQL中字符集以及排序规则展开,详细聊聊相关的技术点。 MySQL中的字符集 MySQL支持广泛的字符集,包括GB2312、GBK、BIG5等本地字符集,以及多种Un


基于 Kafka 与时间轮实现高性能延迟消息
master_hl2025/11/19

1.整体链路 Kafka → RocksDB → SystemTimer → TimingWheel → Kafka public void sendDelay(long delayMs, String topic, String message) { try { DelayMessage delayMessage = new DelayMessage(delayMs, topic, message); rocksDB.put(delayMessage.g


Python 的内置函数 sum
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 sum Python 的内置函数 sum() 是一个用于计算可迭代对象中所有元素之和的高效工具。这个函数可以接受一个可迭代对象(如列表、元组、集合等)作为参数,并返回其中所有元素的总和。 基本用法 numbers = [1, 2, 3, 4, 5] total = sum(numbers) # 返回 15 可选参数 sum() 函数还接受一个可选的第二个参数 start,用于指定求和的初始值。默认情况下 start 为 0。


ios包体积管理方案
denggun123452025/11/16

iOS 包体积优化是一个系统性的工程,需要从代码、资源、第三方库、构建配置等多个维度进行综合管理。下面我将梳理一个全面的 iOS 包体积管理方案。 一、包体积分析 在进行任何优化之前,必须先了解 App 体积到底由什么构成。 使用 Xcode 的 App Thinning Size Report 操作:Archive -> Distribute App -> App Store Connect -> 选择 Ad Hoc 或 App Store -> Next -> 在 "App T


Bash 入门
hubenchang05152025/11/15

#Bash 入门 #Hello World Bash 的内置命令 echo 可以打印文本。例如: $ echo Hello World Hello World echo 命令的 -e 选项激活转义字符的解释。例如: $ echo -e "Hello \n World" Hello World #命令格式 Bash 命令基本遵循以下格式: 命令 参数1 参数2 参数3 ... 例如在 echo Hello World 中,echo 是命令,Hello 是参数1,World 是参数2。 而

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读