← 返回面试目录

浏览器 DevTools 深度实操指南

Elements · Console · Network · Sources · Application · Performance · 快捷键速查

DevTools DOM 调试 Network 分析 断点调试 性能优化 存储调试

DevTools 打开方式 & 全局快捷键

工欲善其事,必先利其器。掌握快捷打开方式是高效调试的第一步。

常用打开方式

1 快捷键打开 — Mac: Cmd + Option + I  |  Windows: F12
2 元素选择模式 — Mac: Cmd + Shift + C  |  Windows: Ctrl + Shift + C,直接进入页面元素选取
3 直接打开 Console — Mac: Cmd + Option + J  |  Windows: Ctrl + Shift + J
4 右键菜单 — 页面任意位置右键 → "检查"(Inspect),自动定位到对应元素
5 浏览器菜单 — Chrome 菜单 → 更多工具 → 开发者工具

Dock 位置切换

DevTools 打开后,可以点击右上角的 三点菜单 或按 Cmd + Shift + D 切换停靠位置:

底部 Dock
右侧 Dock
左侧 Dock
独立窗口
Tip: 宽屏推荐右侧 Dock,排查移动端问题时推荐独立窗口 + 设备模拟。

Settings 设置

F1Cmd + , 打开 DevTools Settings:

  • Preferences — 主题(Dark/Light)、字体大小、默认面板
  • Workspace — 映射本地文件夹实现持久化修改
  • Experiments — 实验性功能(如 CSS Overview 面板)
  • Ignore List — 调试时忽略第三方库代码(如 node_modules)
  • Throttling — 自定义网络节流配置
  • Devices — 自定义设备模拟分辨率
Tip: 推荐在 Settings → Preferences 中开启 "Auto-open DevTools for popups",调试弹窗时不再错过时机。

全局快捷键速查

操作MacWindows / Linux
打开 / 关闭 DevToolsCmd + Option + IF12
打开 Console 面板Cmd + Option + JCtrl + Shift + J
元素选择模式Cmd + Shift + CCtrl + Shift + C
设备模拟模式Cmd + Shift + MCtrl + Shift + M
快速切换 Dock 位置Cmd + Shift + DCtrl + Shift + D
搜索当前面板Cmd + FCtrl + F
全局搜索所有文件Cmd + Option + FCtrl + Shift + F
命令菜单 (Command Menu)Cmd + Shift + PCtrl + Shift + P
切换面板标签(左右)Cmd + ] / Cmd + [Ctrl + ] / Ctrl + [
类比理解:DevTools 就像是浏览器的"X光机",让你透视页面的骨骼(DOM)、皮肤(CSS)、神经系统(JS)、血液循环(Network),每一个面板都是一个专业科室。

Elements 面板 — DOM & CSS 调试

前端调试最常用的面板,实时查看和修改 DOM 结构与 CSS 样式。

DOM 树操作

操作方法说明
展开 / 折叠节点点击节点左箭头或双击标签展开子树,也可用右方向键展开、左方向键折叠
搜索 DOMCmd + F按标签名、类名、文本内容搜索,支持 CSS 选择器和 XPath
复制选择器右键 → Copy → Copy selector生成唯一的 CSS 选择器路径,如 #app > div > ul > li:nth-child(3)
复制 JS 路径右键 → Copy → Copy JS path生成可直接在 Console 中使用的 DOM 访问代码
滚动到视图中右键 → Scroll into view快速定位页面中隐藏或不在视口的元素
删除节点右键 → Delete element 或 Delete 键即时移除 DOM 节点,可按 Cmd + Z 撤销
强制状态点击 .hov 按钮模拟 :hover / :focus / :active / :visited / :focus-within
拖拽移动拖拽节点到新位置实时调整 DOM 顺序,排查布局问题
编辑属性双击属性名 / 属性值 / 文本直接修改 class、id、内联文本等
以 HTML 编辑右键 → Edit as HTML批量编辑整个节点的 HTML
Tip: 选中节点后按 H 键可以快速切换元素的 visibility: hidden,按 Delete 键删除节点,Cmd + Z 可撤销任何 DOM 操作。

样式面板详解

Styles 面板

  • CSS 优先级从高到低 显示所有匹配规则
  • 每条规则旁标注 文件名 + 行号,点击可跳转到 Sources 面板对应位置
  • 被划线的属性 = 不生效(被更高优先级覆盖或属性无效)
  • 点击属性值可用 上下方向键 微调数值(+1 / -1),按住 Shift 步进 ±10,按住 Alt 步进 ±0.1
  • 点击颜色值弹出 颜色选择器,支持取色、HSL/HEX/RGBA 切换
  • element.style 区域可直接添加内联样式
  • 点击右上角 +.cls 按钮可以添加/移除 class
/* Styles 面板中显示示例 */ /* styles.css:42 */ ← 文件来源 + 行号 .card-title { font-size: 16px; ← 生效 color: red; ← 划线 = 被覆盖 color: blue; ← 不生效 } /* element.style */ ← 内联样式(最高优先级之一) font-weight: bold;

Computed 面板

  • 显示每个 CSS 属性的 最终计算值(浏览器最终渲染使用的值)
  • font-size: 2em 在 Computed 中显示为实际像素值,如 32px
  • 点击任意属性可展开查看 所有来源及优先级,标明哪个规则最终胜出
  • 勾选 "Show all" 可查看所有 CSS 属性(包括继承的默认值)

Box Model 可视化

  • 在 Styles 下方或 Computed 面板顶部展示 盒模型图
  • 由外到内:MarginBorderPaddingContent
  • 上、右、下、左四个数值均可 直接点击编辑
  • 非常直观地排查元素的实际占用空间

CSS 变量 & 主题调试

CSS 自定义属性(变量)在 Styles 面板中可以直接查看和修改:

/* CSS 变量定义 */ :root { --primary-color: #B4B8F0; --font-size-base: 14px; } /* 使用处 */ .card { color: var(--primary-color); font-size: var(--font-size-base); }

在 Styles 面板中悬停变量名会显示当前值,点击可跳转到定义位置。直接修改变量值可实时看到全局效果 — 非常适合调试主题色和设计系统。

实战场景

场景 1:样式不生效排查

当你写了 CSS 但页面没有变化时,按以下流程排查:

1 选中目标元素,在 Styles 面板查看是否有你写的规则
2 如果规则存在但属性被 划线 → 被更高优先级覆盖,检查是否有 !important 或更具体的选择器
3 如果规则 根本不存在 → 选择器不匹配(class 名拼写错误、DOM 结构与选择器不一致)
4 切到 Computed 面板,搜索目标属性,查看哪个规则最终胜出
常见陷阱:
  • !important 滥用导致样式覆盖混乱
  • CSS 特异性(Specificity)计算错误:#id > .class > tag
  • 样式文件未正确加载 — 检查 Network 面板是否 404
  • CSS 属性拼写错误,如 collor 不会报错只是静默失效

场景 2:响应式调试

1Cmd + Shift + M 进入设备模拟模式
2 在顶部工具栏选择预设设备(iPhone、iPad 等)或自定义分辨率
3 拖动视口宽度边缘或输入数值,实时查看布局变化
4 在 Styles 面板中查看 媒体查询断点(灰色 @media 标记)
Tip: 点击 Styles 面板上方的媒体查询栏(彩色竖条),可以快速跳转到对应断点宽度。右键媒体查询条可以选择跳转到 CSS 源码。
类比理解:Elements 面板就像装修师傅的工具箱 — DOM 树是房屋结构图,Styles 面板是色卡和材料清单,Box Model 是量尺。你可以随时换壁纸(CSS)、移家具(DOM)、量尺寸(Computed),所见即所得。

Console 面板 — 报错 & 日志

前端排错的第一道防线。读懂 Console 的红色报错,你就解决了 50% 的问题。

报错类型识别

级别颜色常见类型含义
Error 红色 SyntaxError 语法错误 — 代码写法有问题,如缺少括号、拼写错误
ReferenceError 引用错误 — 使用了未声明的变量或函数
TypeError 类型错误 — 对 null/undefined 调用方法,或参数类型不对
RangeError 范围错误 — 如递归爆栈、无效数组长度
Warning 黄色 Deprecated API 使用了即将废弃的 API,建议迁移
Info 蓝色 console.info() 信息提示
Log 白色 console.log() 普通日志
如何阅读错误信息:
Uncaught TypeError: Cannot read properties of undefined (reading 'map') at UserList (UserList.js:23:18) at renderWithHooks (react-dom.js:16185:18) at mountIndeterminateComponent (react-dom.js:18342:5)

拆解:

  • TypeError — 错误类型
  • Cannot read properties of undefined (reading 'map') — 试图对 undefined 调用 .map()
  • UserList.js:23:18 — 出错文件 + 行号 + 列号,点击可直接跳转
  • 堆栈 — 从上到下是调用链,最上面是出错位置,下面是调用者

Console 技巧大全

console 方法

// 基本输出 console.log('普通日志'); console.warn('⚠ 警告信息'); console.error('❌ 错误信息'); console.info('ℹ 提示信息'); // 表格输出 — 数组/对象的最佳展示方式 console.table([ { name: '张三', age: 25, city: '北京' }, { name: '李四', age: 30, city: '上海' }, ]); // 分组输出 console.group('用户信息'); console.log('姓名: 张三'); console.log('年龄: 25'); console.groupEnd(); // 计时 — 性能分析利器 console.time('API请求耗时'); await fetch('/api/users'); console.timeEnd('API请求耗时'); // 输出: API请求耗时: 234ms // 计数 for (let i = 0; i < 5; i++) { console.count('循环次数'); // 循环次数: 1, 2, 3, 4, 5 } // 断言 — 条件为 false 时才输出 console.assert(user.age > 0, '年龄必须大于0'); // 清屏 console.clear();

Console 内置快捷变量和函数

命令功能示例
$0当前 Elements 面板选中的元素$0.classList
$1 ~ $4历史选中的前几个元素$1 = 上一个选中的
$(selector)等价 document.querySelector$('.card')
$$(selector)等价 document.querySelectorAll(返回数组)$$('li')
copy(obj)复制到剪贴板copy($0.outerHTML)
keys(obj)返回对象自身可枚举属性名keys(localStorage)
values(obj)返回对象自身可枚举属性值values({a:1,b:2})
monitor(fn)监控函数调用及参数monitor(fetch)
debug(fn)调用函数时自动断点debug(handleClick)

过滤与搜索

  • 按级别过滤:点击 Console 左上角的 Levels 按钮勾选 Verbose / Info / Warnings / Errors
  • 按文字搜索:在过滤框输入关键词
  • 正则过滤:输入 /pattern/ 格式的正则表达式
  • 排除过滤:输入 -pattern 排除包含该文字的日志

实用操作

  • 清屏: Cmd + K 或点击 🚫 按钮
  • Preserve Log: 勾选后页面刷新/跳转不会丢失日志
  • Selected Context Only: 只显示当前选中 iframe 的日志
  • 右键日志 → Save as: 导出所有日志为文件
  • 右键日志 → Store as global variable: 保存为临时变量 temp1
Tip: console.log 输出对象时是引用类型!展开看到的值可能是 之后修改过的。需要快照时使用 console.log(JSON.parse(JSON.stringify(obj)))

实战场景

场景 1:接口 404

Console 显示红色错误:

GET https://api.example.com/ussers 404 (Not Found)
1 注意 URL 中 ussers 拼写错误(应为 users)
2 点击错误信息中的链接,自动跳转到 Network 面板对应请求
3 在 Network 面板查看 Response,确认 404 详情

场景 2:undefined 变量 — ReferenceError

Uncaught ReferenceError: userData is not defined at renderProfile (profile.js:15:22) at <anonymous>:1:1
1 点击 profile.js:15:22 跳转到源码
2 检查第 15 行附近,发现变量名拼写错误或未导入
3 在 Console 中输入 userData 确认当前作用域是否存在

场景 3:CORS 跨域报错

Access to fetch at 'https://api.other.com/data' from origin 'https://myapp.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

排查步骤:

  • 这是 服务端问题,前端无法直接解决
  • 需要后端在 Response Headers 中添加 Access-Control-Allow-Origin
  • 开发环境可通过代理(如 webpack devServer proxy)绕过
  • 在 Network 面板中可以看到请求发出了但响应被浏览器拦截
类比理解:Console 就像是汽车的仪表盘和故障指示灯。红色 Error 是引擎故障灯,黄色 Warning 是保养提醒,普通 Log 是行驶记录。学会看仪表盘,你就能快速定位问题。

Network 面板 — 网络请求全链路

前端排错的核心面板!接口调试、性能分析、资源加载排查都离不开它。这是面试高频考点。

重要提示:打开 Network 面板后 不会 显示之前的请求!必须先打开面板,再刷新页面或操作。勾选 "Preserve log" 可以在页面跳转时保留日志。

请求列表详解

列名含义重点关注
Name请求的 URL 路径和文件名点击可查看详情
StatusHTTP 状态码200 成功 / 301 重定向 / 404 未找到 / 500 服务器错误
Type资源类型document / script / stylesheet / xhr / fetch / img / font
Initiator请求的发起者哪个 JS 文件/哪行代码发起的,排查重复请求利器
Size响应大小实际大小 vs 传输大小(gzip 压缩后)
Time总耗时从请求发出到响应完成的时间
Waterfall时间瀑布图可视化各请求的加载时序和并行情况

筛选与搜索

类型筛选按钮

All
XHR
JS
CSS
Img
Doc
Font
WS

属性过滤(Filter 输入框)

# 按状态码过滤 status-code:404 status-code:200 # 按大小过滤 larger-than:1M larger-than:100k # 按请求方法过滤 method:POST method:GET # 按域名过滤 domain:api.example.com # 按 MIME 类型过滤 mime-type:application/json # 组合使用 method:POST status-code:500
Tip:Cmd + F 打开搜索框,可以搜索请求和响应中的内容(如在所有响应中搜索某个字段值)。

请求详情(点击请求后)

Headers 标签页

┌─ General ──────────────────────────────────┐ │ Request URL: https://api.example.com/users │ │ Request Method: GET │ │ Status Code: 200 OK │ │ Remote Address: 93.184.216.34:443 │ │ Referrer Policy: strict-origin-when-origin │ └────────────────────────────────────────────┘ ┌─ Response Headers ─────────────────────────┐ │ Content-Type: application/json │ │ Access-Control-Allow-Origin: * │ │ Set-Cookie: token=abc123; HttpOnly; Secure │ │ Cache-Control: max-age=3600 │ └────────────────────────────────────────────┘ ┌─ Request Headers ──────────────────────────┐ │ Cookie: session_id=xyz789 │ │ Authorization: Bearer eyJhbG... │ │ Content-Type: application/json │ │ User-Agent: Mozilla/5.0 ... │ └────────────────────────────────────────────┘ ┌─ Query String Parameters ──────────────────┐ │ page: 1 │ │ pageSize: 20 │ │ keyword: "张三" │ └────────────────────────────────────────────┘

关键看点:

  • General 中的 Status Code:快速判断请求成败
  • Request Headers 中的 Cookie / Authorization:排查鉴权问题
  • Response Headers 中的 Set-Cookie / CORS 头:排查跨域和 Cookie 问题
  • Query String Parameters:确认 GET 请求的参数是否正确

Payload 标签页

查看请求发送的数据:

  • Query String Parameters — URL 中的查询参数
  • Form Data — 表单提交的数据(Content-Type: application/x-www-form-urlencoded)
  • Request Payload — JSON 格式的请求体(Content-Type: application/json)
Tip: 查看 Payload 是排查"后端说没收到参数"的标准流程 — 先确认前端到底发了什么。

Preview / Response 标签页

  • Preview — 格式化展示:JSON 会美化显示成可折叠的树结构,图片会显示预览
  • Response — 原始响应文本,可复制完整内容

Timing 时序分析(重点!)

点击请求 → Timing 标签页,查看请求各阶段耗时:

Stalled
浏览器等待分配连接的时间(连接池满/排队)
DNS Lookup
DNS 解析域名到 IP 地址。首次访问较慢,之后有缓存
Initial Connection
建立 TCP 连接。复用连接时为 0
SSL
TLS/SSL 握手时间(HTTPS 请求)
Request Sent
发送请求报文的时间。通常很短
Waiting (TTFB)
Time To First Byte — 等待服务器返回第一个字节。TTFB 高 = 服务端慢
Content Download
下载响应体的时间。大 = 资源体积大或带宽低
瓶颈判断指南:
  • TTFB 过长(>1s):服务端处理慢 — 检查后端日志、数据库查询、服务端渲染
  • Content Download 过长:响应体太大 — 开启 gzip/brotli 压缩、分页、减少返回字段
  • Stalled 过长:浏览器并发限制(同域最多 6 个连接)— 使用 CDN、HTTP/2 多路复用
  • DNS Lookup 过长:DNS 解析慢 — 使用 dns-prefetch
  • SSL 过长:TLS 握手慢 — 考虑 OCSP Stapling、使用 CDN

Initiator 发起者

点击请求 → Initiator 标签页,查看请求的 完整调用栈

Initiator: fetchData @ api.js:42 loadUserList @ UserList.js:18 useEffect @ UserList.js:10 react @ react-dom.js:16185 mountComponent @ react-dom.js:18342

从下往上看调用链,定位到 你自己的代码 中的发起位置。非常有助于排查:

  • 重复请求(某个组件重复渲染导致多发了一次请求)
  • 非预期的请求(不知道哪个组件触发的)
  • 请求顺序问题

实战场景

场景 1:接口 500 — 服务端错误

1 Network 列表中找到 500 状态码的请求(红色高亮)
2 点击 → Response 标签页查看服务端返回的错误信息
3 切到 Payload 标签页确认发送的参数是否正确(字段名、格式、值)
4 携带 Response 错误信息 + Payload 参数 → 反馈给后端同学

场景 2:页面加载慢 — Waterfall + Timing 分析

1 打开 Network,勾选 "Disable cache",刷新页面
2 查看 Waterfall 瀑布图,找到耗时最长的请求(按 Time 排序)
3 点击最慢的请求 → Timing 分析瓶颈环节
4 检查是否有资源阻塞渲染(长条排在关键资源前面)
5 底部状态栏查看总请求数、总传输大小、总加载时间(DOMContentLoadedLoad 时间)

场景 3:重复请求 — Initiator 定位代码

1 在 Network 中发现同一个接口被调用了多次
2 点击重复请求 → 查看 Initiator 调用栈
3 在调用栈中找到你自己的代码位置(跳过框架代码)
4 常见原因:React 组件重复渲染(useEffect 缺少依赖/未做 memo)、事件重复绑定

场景 4:Cookie 问题 — 登录态丢失

1 在 Network 中找到返回 401 的请求
2 检查 Request Headers 中是否有 Cookie 字段
3 如果没有 Cookie → 检查 Set-Cookie 的 DomainPathSameSiteSecure 属性
4 常见原因:跨域请求未携带 Cookie(需设置 credentials: 'include' + CORS 头)
类比理解:Network 面板就像是快递追踪系统。每个请求是一个包裹,Status 是签收状态,Timing 是各中转站耗时,Waterfall 是所有包裹的物流时间线,Initiator 是寄件人的详细信息。

Sources 面板 — 前端断点调试

比 console.log 更强大的调试方式 — 像调试后端代码一样调试前端 JS。

文件树导航

标签功能用途
Page当前页面加载的所有资源查看和搜索 HTML/CSS/JS 源码
Snippets保存的脚本片段常用调试脚本,可随时运行(右键 → Run)
Filesystem映射本地项目文件夹在 DevTools 中直接编辑源文件并保存到本地
Overrides覆盖远程文件修改线上环境的 CSS/JS 并持久保存到本地(刷新不丢失)
Tip: 在 Sources 中按 Cmd + P(Quick Open)可以快速按文件名搜索打开文件,支持模糊匹配。

断点类型大全

1. 行断点(最常用)

  • 在源码行号左侧 点击 设置蓝色标记
  • 代码执行到该行时会暂停
  • 再次点击取消断点

2. 条件断点

  • 右键行号 → "Add conditional breakpoint"
  • 输入条件表达式,如 user.id === 123items.length > 100
  • 只有条件为 true 时才暂停 — 循环中调试特定迭代的利器

3. Logpoint(日志点)

  • 右键行号 → "Add logpoint"
  • 输入表达式如 "user:", user.name, "age:", user.age
  • 不会暂停执行,只在 Console 中输出 — 等价于免修改代码的 console.log

4. DOM 断点

  • 在 Elements 面板中 右键元素"Break on"
  • subtree modifications — 子节点变化时断点
  • attribute modifications — 属性变化时断点(如 class/style 改变)
  • node removal — 节点被移除时断点

5. XHR/Fetch 断点

  • 在右侧 XHR/fetch Breakpoints 面板点击 + 按钮
  • 输入 URL 关键词,如 /api/users
  • 当请求 URL 包含该关键词时,在 fetch()XMLHttpRequest.send() 处暂停
  • 非常适合排查"这个接口什么时候被调用的"

6. Event Listener 断点

  • 在右侧 Event Listener Breakpoints 面板展开事件类别
  • 勾选具体事件:click / keypress / scroll / mouseover / load / error ...
  • 当事件触发时,在事件处理函数的第一行暂停

调试操作

调试面板详解

操作快捷键说明
Resume(继续执行)F8继续运行直到下一个断点或程序结束
Step Over(单步跳过)F10执行当前行,不进入函数内部。最常用的操作
Step Into(单步进入)F11进入函数内部逐行执行
Step Out(跳出函数)Shift + F11执行完当前函数剩余代码,跳回到调用者
Step(下一步)F9进入 async/await 内部,与 Step Into 类似但能穿透异步
面板位置功能
Scope右侧面板查看当前作用域所有变量:Local(局部)、Global(全局)、Closure(闭包)、Block(块级)
Call Stack右侧面板当前调用栈,从上到下是函数调用链。点击任意帧可切换到对应作用域
Watch Expressions右侧面板添加监视表达式,实时显示值变化。如 this.state.countarr.length
Breakpoints右侧面板管理所有断点列表,可勾选启用/禁用
// 调试时悬停变量显示值 function calculateTotal(items) { // ← 设断点 let total = 0; // ← F10: total = 0 for (const item of items) { // ← 悬停 items 查看内容 total += item.price * item.qty; // ← 悬停 item.price 查看值 } // ← Watch: total 实时更新 return total; }
Tip: 断点暂停时,你可以直接在 Console 中输入任何表达式来查看当前作用域中的变量值,甚至可以调用函数。

实战场景

场景 1:按钮点击没反应 — Event Listener 断点

1 打开 Sources 右侧 Event Listener Breakpoints → Mouse → 勾选 click
2 点击页面上的按钮 → 代码暂停在事件处理函数
3 如果 没有暂停 → 说明事件处理函数根本没绑定上!检查 addEventListener / onClick 绑定代码
4 如果暂停了,用 F10 单步执行,看哪一步出问题

场景 2:数据计算结果错误 — 断点 + Step Into

1 在计算函数入口处设置 行断点
2 在 Watch 面板添加关键变量,如 resultitems.length
3F11 (Step Into) 逐行执行,观察每一步变量值的变化
4 发现某一步计算结果不符合预期 → 定位到 bug

场景 3:接口调用时机不对 — XHR 断点

1 在 XHR Breakpoints 面板添加 /api/orders
2 操作页面触发请求 → 代码暂停在 fetch() 调用处
3 查看 Call Stack,从上到下找到调用链 → 确认是哪个组件/函数在什么时机发起的
4 发现是 useEffect 依赖项写错导致不必要的调用
类比理解:Sources 面板的断点调试就像"暂停时间"。你在关键位置按下暂停键,然后可以一步一步慢放(Step Over/Into),检查每个变量此刻的状态。比在代码里到处加 console.log 高效百倍。

Application 面板 — 存储调试

调试登录状态、本地缓存、Service Worker 等客户端存储问题。

Cookies

字段含义调试关注点
NameCookie 名称是否包含预期的 Cookie
ValueCookie 值双击可直接编辑
Domain所属域名Cookie 只在匹配域名下生效
Path生效路径子路径可继承,跨路径不共享
Expires / Max-Age过期时间Session = 浏览器关闭即失效
HttpOnlyJS 无法访问有此标记的 Cookie 不会出现在 document.cookie 中,防 XSS
Secure仅 HTTPS 传输HTTP 环境下此 Cookie 不会发送
SameSite跨站限制Strict / Lax / None,影响跨域请求是否携带

操作:双击字段可编辑 · 选中后按 Delete 删除 · 右键可清除所有 Cookie

SameSite 注意:
  • SameSite=Strict:完全不允许跨站发送,最安全但影响体验
  • SameSite=Lax(默认):允许顶级导航的 GET 请求携带
  • SameSite=None:允许跨站发送,但 必须 配合 Secure

LocalStorage & SessionStorage

特性LocalStorageSessionStorage
生命周期永久(手动清除)标签页关闭即清除
作用域同源(协议+域名+端口)共享仅当前标签页
容量约 5MB约 5MB
常见用途主题偏好、Token 持久化、用户设置表单临时数据、页面状态

操作:左侧选择域名 → 右侧显示键值对 · 双击编辑 · 右键删除 · 右键清除全部

// Console 中操作 localStorage.setItem('theme', 'dark'); localStorage.getItem('theme'); // 'dark' localStorage.removeItem('theme'); localStorage.clear(); // 清空所有 sessionStorage.setItem('form', JSON.stringify({name:'张三'})); JSON.parse(sessionStorage.getItem('form'));

IndexedDB

  • 浏览器内置的结构化数据库,适合存储大量数据
  • 展开左侧数据库名 → 查看对象仓库(Object Store)→ 查看记录
  • 支持索引、事务、游标查询
  • 常用于离线应用、大型客户端缓存
  • 可以直接在 Application 面板中编辑和删除记录

Cache Storage

  • Service Worker 使用的缓存 API
  • 展开可查看所有缓存名称及其中的 Request/Response 对
  • 常用于 PWA 离线缓存策略
  • 调试时可以右键删除缓存验证缓存策略是否生效

实战场景

场景 1:登录状态异常 — 看 Cookie

1 打开 Application → Cookies → 选择当前域名
2 查找 tokensession_id Cookie 是否存在
3 检查 Expires 是否已过期,Domain 是否匹配
4 检查 SameSite 是否阻止了跨域携带

场景 2:数据持久化问题 — 看 LocalStorage

1 打开 Application → Local Storage → 选择域名
2 查看存储的键值对是否正确 — 值是否被意外覆盖或清空
3 如果 JSON 格式数据,检查是否被正确序列化/反序列化
4 在 Console 中直接用 API 验证:localStorage.getItem('key')
类比理解:Application 面板是浏览器的"保险箱和仓库"。Cookie 是随身钥匙扣(小、每次请求带着),LocalStorage 是家里的保险柜(大、持久),SessionStorage 是酒店房间保险箱(关标签页就没了),IndexedDB 是自建地下仓库(超大容量)。

Performance & Lighthouse

量化性能瓶颈,用数据驱动优化。不只是"感觉慢",而是知道慢在哪里、慢了多少。

Performance 面板

使用流程

1 打开 Performance 面板,点击 Record(圆点按钮)开始录制
2 在页面上执行你要分析的操作(滚动、点击、输入等)
3 点击 Stop 停止录制
4 分析生成的性能报告

关键视图

视图含义分析方法
火焰图(Main) 主线程上所有 JS 执行、样式计算、布局、绘制的调用栈 查找宽条(长任务),顶部红色三角 = 超过 50ms 的长任务
Network 时间线 网络请求加载时序 查看关键资源的加载顺序和阻塞情况
Frames 每帧渲染时间 绿色 = 正常 <16.67ms,黄色 = 接近掉帧,红色 = 已掉帧
Timings 关键时间节点标记 FP / FCP / LCP / DCL / Load 等关键时间点
Summary 饼图 时间分布占比 Loading / Scripting / Rendering / Painting / Other / Idle
Performance — Main (主线程火焰图) 录制时长 2.4s 0ms 400ms 800ms 1200ms 1600ms 2400ms 50ms 阈值 Task Task (long)  1.0s ▲ 超过 50ms 的长任务 Task Parse HTML Evaluate Script (app.bundle.js) Layout Paint Timer Fired Recalc Style compileModule runJobs UpdateLayout handleClick parseImport renderList setState 📊 怎么读这张图 横向越宽 = 执行越慢。最顶层那根紫色长条横跨近一半时间,是头号嫌疑犯。 顶部红色三角 ▲ = 长任务(> 50ms),会阻塞主线程、卡顿掉帧的元凶。 颜色对应类别:紫=脚本,绿=布局/样式,橙=JS 回调(Timer/Event),蓝=绘制,粉=用户函数。 纵向堆叠 = 调用栈。上方调用下方,点开任一块可看其子函数;定位耗时函数往上找根。 ✅ 优化动作 本例应针对 Evaluate Script (app.bundle.js) 做代码分割 / 懒加载,把那根长条拆成几根短条。
Main 火焰图:宽条 = 慢,红三角 = 长任务。性能优化的第一切入点永远是"最宽的那根条"。
Summary 饼图 — 总录制时间占比 Scripting 45% Scripting 45% JS 执行 — 占比高说明脚本慢 Rendering 18% 样式计算 + 布局 Painting 12% 绘制 + 合成 Loading 10% 网络请求 + 解析 Idle 15% 空闲 — 越多越好
Summary 饼图示例:一眼看出哪类工作耗时最多。本例 Scripting 占近一半,优化重点在 JS 执行。
性能瓶颈判断:
  • Scripting 占比高:JS 执行慢 — 减少主线程工作,使用 Web Worker,懒加载
  • Rendering 占比高:样式计算/布局频繁 — 减少 DOM 操作,避免强制同步布局
  • Painting 占比高:绘制面积大或层数多 — 使用 will-change,减少复杂阴影/渐变
  • 红色三角(长任务):任务超过 50ms,会阻塞用户交互 — 拆分任务,使用 requestIdleCallback
Tip: 勾选 "Screenshots" 可以在录制时捕获每帧的屏幕截图,拖动时间线可以像看视频一样回放页面状态变化。

Lighthouse 审计

使用方法

1 打开 Lighthouse 面板(可能藏在 >> 更多面板中)
2 选择审计类别:Performance / Accessibility / Best Practices / SEO
3 选择设备模式:Mobile / Desktop
4 点击 "Analyze page load" 开始分析
5 等待 30-60 秒查看评分报告
Lighthouse 审计报告 — 评分仪表盘 76 / 100 Performance 需改进 92 / 100 Accessibility 通过 88 / 100 Best Practices 通过 58 / 100 SEO 未通过 评分颜色规则 90-100 通过 50-89 需改进 0-49 未通过
Lighthouse 顶部四个仪表盘。本例 Performance 和 SEO 是短板,应优先优化。

核心指标解读

指标全称含义优化方向
FCP First Contentful Paint 首次内容绘制 — 第一个文本/图片渲染时间 减少渲染阻塞资源,优化服务端响应
LCP Largest Contentful Paint 最大内容绘制 — 最大可见内容渲染时间 优化图片加载、字体加载、服务端响应
TBT Total Blocking Time 总阻塞时间 — FCP 到可交互之间所有长任务的阻塞部分总和 拆分长任务、代码分割、减少 JS 执行
CLS Cumulative Layout Shift 累积布局偏移 — 页面加载期间意外移动的量 给图片/广告位设固定尺寸,避免动态插入内容
SI Speed Index 速度指数 — 页面内容视觉填充的速度 减少主线程工作,延迟加载非关键资源
TTI Time to Interactive 可交互时间 — 页面完全可交互的时间 减少 JS 体积,代码分割,预加载关键资源
页面加载核心指标时间轴 时间 0 1s 2s 3s 3.9s FP 0.4s First Paint FCP 0.8s LCP 2.4s 最大内容绘制 ★核心 TTI 3.9s DCL 1.8s Load 3.2s FCP → LCP:用户感知的"主要内容加载"区段(1.6s) LCP 阈值(Google 标准): ≤2.5s 良好 2.5-4s 需改进 >4s 差 本例 2.4s = 良好 ✅
核心指标按时间先后在加载过程中依次触发。LCP 是 Google Core Web Vitals 三要素之一,最值得关注。
Tip: Lighthouse 报告中每个指标都可以展开查看具体的优化建议,包括已通过(绿色)、需改进(橙色)、未通过(红色)的具体项目。
类比理解:Performance 面板是浏览器的"心电图" — 录制一段操作,然后逐帧分析心跳(主线程)是否健康。Lighthouse 则是"体检报告" — 给你的页面打分,告诉你哪里不合格、怎么改善。

DevTools 快捷键速查

熟练使用快捷键可以大幅提升调试效率,建议打印出来贴在显示器旁边。

全局快捷键

操作MacWindows
打开 DevToolsCmd + Option + IF12
打开 ConsoleCmd + Option + JCtrl + Shift + J
元素选择Cmd + Shift + CCtrl + Shift + C
搜索当前面板Cmd + FCtrl + F
全局搜索所有文件Cmd + Option + FCtrl + Shift + F
清 ConsoleCmd + KCtrl + L
Step Over(单步跳过)F10F10
Step Into(单步进入)F11F11
Step Out(跳出函数)Shift + F11Shift + F11
Resume(继续执行)F8F8
设备模拟Cmd + Shift + MCtrl + Shift + M
截屏Cmd + Shift + P → screenshotCtrl + Shift + P → screenshot
切换面板标签Cmd + ] / Cmd + [Ctrl + ] / Ctrl + [

Elements 面板快捷键

操作快捷键说明
展开节点右方向键展开当前折叠的节点
折叠节点左方向键折叠当前展开的节点
递归展开Opt + 右方向键展开所有子节点
编辑属性Enter进入编辑模式
隐藏元素H切换 visibility: hidden
删除元素Delete删除选中的节点
撤销操作Cmd + Z撤销 DOM 修改
搜索 DOMCmd + F按选择器、文本、XPath 搜索

Sources 面板快捷键

操作快捷键说明
暂停脚本F8 / Ctrl + \\暂停/恢复脚本执行
单步跳过F10执行当前行,不进入函数
单步进入F11进入函数内部
跳出函数Shift + F11执行完当前函数并跳出
快速打开文件Cmd + P按文件名搜索打开
跳转到行Cmd + G输入行号跳转
跳转到函数Cmd + Shift + O按函数/方法名搜索
切换断点点击行号添加/移除断点
条件断点右键行号添加条件断点或日志点

Command Menu 神器

Cmd + Shift + P(Mac)或 Ctrl + Shift + P(Windows)打开命令菜单:

# 常用命令 screenshot → 截取页面截图(全页 / 可视区域 / 节点) Coverage → 打开代码覆盖率面板 FPS meter → 显示实时帧率 Rendering → 打开渲染面板(paint flashing / layout shift regions) CSS Overview → CSS 概览分析 Network conditions → 修改网络条件(离线 / 3G / 自定义) JavaScript disabled → 禁用 JavaScript Dock to right → 切换 Dock 位置
Tip: Command Menu 是 DevTools 中最被低估的功能。几乎所有面板操作都可以通过这里快速访问,输入 ? 可以查看所有可用命令。