Bug 与 Debug
Bug 的产生
世界上第一次出现电脑问题是由于虫子导致的,因此将问题命名为 Bug(虫子)。
前端 Debug 的特点
-
多平台
- 浏览器、Hybrid、NodeJS、小程序、桌面应用等
-
多环境
- 本地开发环境、线上环境
-
多工具
- Chrome devTools、Charles、Spy-Debugger、Whistle、vConsole ...
-
多技巧
- Console、BreakPoint、sourceMap、代理等
Chrome DevTools
-
Elements | Console | Source | Performance | Network
-
通过 F12 打开 Chrome DevTools。
Elements
显示页面的结构以及元素的样式。
- 动态修改元素和样式
Console
控制台,显示网页的日志。
分类:
-
console.log
-
console.warn
-
console.error
-
console.debug
-
console.info
-
console.table
具像化的展示 JSON 和 数组数据
-
console.dir
通过类似文件树的方式展示对象的属性
-
占位符
给日志添加样式,可以突出重要的信息
%s:字符串占位符%o:对象占位符%c:样式占位符%d:数字占位符
Source
-
左侧:页面资源文件目录树
-
中间:代码预览区域
-
右测上面:Debug 工具栏
从左到右依次为:
- 暂停(继续)
- 单步跳过
- 进入函数
- 跳出函数
- 单步执行
- 激活(关闭)所有断点
- 代码执行异常处自动
-
右侧下面:断点调试器
- Watch:点击右侧的 + 号可以添加对变量的监控,查看该变量的值
- Breakpoints:断点列表,勾选 / 取消可以激活 / 禁用对应断点
- Scope:作用域列表(包含闭包)
- Local:当前作用域
- Global:全局作用域
- Call Stack:当前 JavaScript 代码的调用栈
- XHR / fetch Breakpoints:所有请求的断点
- DOM Breakpoints:
- Global Listeners:
- Event Listener Breakpoints:
- CSP Violation Breakpoints:
Network
显示网络请求,以及提供网络设置功能。
Application
显示本地存储相关的信息。
- Local Storage
- Session Storage
- IndexedDB
- Web SQL
- Cookie
Performance
点击左上角的实心圆进行录制。
-
第一层:控制面板
-
第二层:概览面板
- FPS:每秒帧数
- CPU:处理各个任务花费的时间
- NET:各个请求花费时间
-
第三层:线程面板
- Frames:帧线程
- Main:主线程,负责执行 JavaScript,解析 HTML/CSS,完成绘制
- Raster:Raster 线程,负责完成某个 layer 或者某些块 tile 的绘制
-
第四层:统计面板
Lighthouse
显示核心 Web 指标:
-
Largest Contentful Paint(LCP):最大内容绘制,测量 加载 性能
为了提供良好的用户体验,LCP 应在页面首次开始加载后的 2.5 秒内发生
-
First Input Delay(FID):首次输入延迟,测量 交互性
为了提供良好的用户体验,页面的 FID 应为 100 毫秒或更短
-
Cumulative Layout Shift(CLS):累计布局偏移,测量 视觉稳定性
为了提供良好的用户体验,页面的 CLS 应保持在 0.1 或更少
移动端 H5 调试
真机调试 | 代理调试 | 常用工具
真机调试
iOS
- 使用 Lightning 数据线将 iPhone 与 Mac 相连
- iPhone 开启 Web 检查器(设置 -> Safari -> 高级 -> 开启 Web 检查器)
- iPhone 使用 Safari 浏览器打开要调试的页面
- Mac 打开 Safari 浏览器调试(菜单栏 -> 开发 -> iPhone 设备名 -> 选择调试页面)
- 在弹出的 Safari Developer Tools 中调试
没有 iPhone 设备可以在 Mac App Store 安装 Xcode 使用其内置的 iOS 模拟器。
Android
- 使用 USB 数据线将手机与电脑相连
- 手机进入开发者模式,勾选 USB 调试,并允许调试
- 电脑打开 Chrome 浏览器,在地址栏输入:
chrome://inspect/#devices并勾选 Descover USB devices 选项 - 手机允许远程调试,并访问调试页面
- 电脑点击 inspect 按钮
- 进入调试页面
直接使用手机扫码查看,体验更佳。
VConsole
- 日志(Logs):console.log | info | error | ...
- 网络(Network):XMLHttpRequest,Fetch,sendBeacon
- 节点(Element):HTML 节点树
- 存储(Storage):Cookies、LocalStorage、SessionStorage
- 手动执行 JS 命令行
- 自定义插件
使用代理工具调试
原理:
- 电脑作为代理服务器
- 手机通过 HTTP 代理连接到电脑
- 手机上的请求都经过代理服务器
以 Charles 为例:
- 安装 Charles
- 查看电脑 IP 和 端口
- 将 IP、端口号填入手机 HTTP 代理
- Charles 允许授权
- 使用 SwitchHosts! 软件给 Mac 电脑配 HOsts
- 手机访问开发环境页面
默认情况下,Charles 无法抓取到 HTTPS 的请求,需要安装证书。
常用代理工具
- Charles:适合查看、控制网络请求,分析数据
- Fiddler:与 Charles 类似,适合 windows 平台
- spy-debugger:远程调试手机页面,抓包
- Whistle:基于 Node 实现的跨平台 Web 调试代理工具
NodeJS 调试
- 执行命令
node --inspect=8888 index.js - chrome 浏览器访问服务
- 点击绿色 node 图标打开 node 调试面板(在 chrome://inspect/#devices 中配置 network target)
- 在 node 调试面板中使用断点调试
常用开发调试技巧
线上即时修改 Overrides
- 打开 Sources 面板下的 Overrides
- 点击 Select folders for Overrides。选择一个本地的空文件夹目录
- 允许授权
- 在 page 中修改代码,修改完成后 command + s 保存
- 打开 devTools,点击右上角的三个小点 -> More tools -> Changes,就能看到所有修改了
利用代理解决开发阶段的跨域问题
- 浏览器 === 请求 ===> 代理服务器 = 转发请求 => 真实服务器
- 浏览器 <= 转发响应 = 代理服务器 <=== 响应 === 真实服务器
启动本地 source map
线上不存在 Source Map 时可以使用 Map Local 网络映射功能来访问本地的 Source Map 文件。
使用代理工具 Mock 数据
- 右键选中要 mock 数据的接口,选择 save response,保存文件到本地
- 本地打开保存的文件,编辑想 mock 的数据并保存
- 右键选中第一步的接口,选择 Map Local,Local Path 选择第二步的文件