前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学会前端调试技巧,提升排错效率

学会前端调试技巧,提升排错效率

原创
作者头像
黄啊码
修改2022-07-15 12:18:20
1.2K0
修改2022-07-15 12:18:20
举报

一、Bug 与 Debug

我们系统程序的漏洞就叫 bug。世界上第一个 bug ,是 1946 年霍普发现了第一个电脑上的 bug,竟然是一只飞蛾“臭虫”。解决这些问题的过程叫做捉虫、调试,也就是 Debug。

Debug 的特点

  1. 多平台:浏览器、NodeJS、Hybrid、小程序、桌面应用......
  2. 多环境:本地开发环境、线上环境
  3. 多工具:Chrome Devtool、Charles、Spy-Debugger、Whistle、vConsole......
  4. 多技巧:Console、BreakPoint、sourceMap、代理......

二、Chrome Devtool

修改元素和样式——Element面板

修改元素、调试样式,我们常用的就是 Chrome 开发者工具 Element 面板,如下就是该面板的用途:

  • 点击 .cls 开启动态修改元素的 class
  • 输入字符串可以动态的给元素添加类名
  • 勾选/取消类名可以动态的查看类名生效效果
  • 点击具体的样式值(字号、颜色、宽度高度等) 可以进行编辑,浏览器内容区域实时预览
  • Computed 下点击样式里的箭头可以跳转到 styles 面板中的 css 规则
image.png
image.png

Console面板

输出日志,需要用到 Console 面板,以下是几种 console 常见的用法:

  • console.log:输出信息
  • console.warn:输出警告信息
  • console.error:输出错误信息
  • console.debug:调试信息
  • console.info:console.log 别名,输出信息
  • console.table:将复合类型的数据(JSON、数组)转为表格显示
  • 占位符:给日志添加样式,可以突出重要的信息

%s: 字符串占位符;%o: 对象占位符; %c:样式占位符;%d:数字占位符。

image.png
image.png

Source Tab

Source 面板,主要可以查看源代码,并且能断点调试,如下是该面板功能介绍:

image.png
image.png
  • 区域1:⻚面资源文件目录树
  • 区域2:代码预览区域
  • 区域3:Debug 工具栏从左到右依次为
    • 暂停(继续)
    • 单步跳过
    • 进入函数
    • 跳出函数
    • 单步执行
    • 激活(关闭)所有断点
    • 代码执行异常处自动断点
  • 区域4:断点调试器

Break Point 与 Watch

Break Point 是存放所有调试断点的列表,Watch 则是观察变量值的变化,如图所示:

image.png
image.png
  • 使用关键字 debugger 或 代码 预览区域的行号可以设置断点
  • 执行到断点处时代码暂停执行
  • 展开 Breakpoints 列表可以查 看断点列表,勾选/取消可以 激活/禁用对应断点
  • 暂停状态下,鼠标 hover 变量可以查看变量的值
  • 在调试器 Watch 右侧点击 + 可以添加对变量的监控,查看该变量的值

Scope 与 Call Stack

  • 展开 Scope 可以查看作用域列表(包含闭包
  • 展开 Call Stack 可以查看当前 javaScript 代码的调用栈
image.png
image.png

Perfomance

Perfomance 面板,主要用来检测性能问题。平时开发应该很少用到,但遇到页面性能提升瓶颈时,这是个很好的利器,帮助我们快速排查定位出引起性能问题的原因。我们先来看看该面板几个区域的主要功能:

image.png
image.png
  • 区域1:控制面板:录制页面加载/操作、清空、快照/内存捕捉等
  • 区域2:概览面板
    • FPS:帧率,每秒帧数
    • CPU:处理各个任务花费的时间
    • NET:各个请求花费时间
    • HEAP:内存消耗记录,包括存在内存未销毁的js变量、文档量、dom节点、事件监听、GPU占用内存等
  • 区域3:线程面板
    • Network:各个请求发生的时间点
    • Frames:帧线程
    • Main:主线程,负责加载、执行JavaScript,解析html、css,生成render树,完成绘制painting(帮助我们理解浏览器的页面渲染原理)
    • Raster:Raster线程,负责完成某个layer或者某些块的绘制
  • 区域5:统计面板

Network

Network 网络面板,是我们开发调试经常用到的,可以查看 xhr/fetch 接口请求、加载的资源(js/css/img/media/font...)。下面是该面板的主要区域:

  • 区域1:控制面板
  • 区域2:过滤面板
  • 区域3:概览区域
  • 区域4:Request Table 面板
  • 区域5:总结面板
  • 区域6:请求详情面板
image.png
image.png

我们经常用 Request Table 面板查看接口请求,点开某个请求,就能查看接口详情。其中包含请求头、响应头、请求状态码等。比如一个接口状态码是4xx,属于客户端错误,我们就需要排查自己前端的代码问题;如果状态码是5xx,属于服务器端错误,我们就可以找后端撕逼,协助他们排查解决。

Application

Application 应用面板,主要用来查看本地的一些缓存数据,比如 Storage、Cookie、离线缓存、本地数据库等,如下图所示:

image.png
image.png

Security

Security 面板,用来查看页面的https证书相关状态,比如安全源信息、https协议的CA证书(颁发机构、有效期、签名算法、公共密钥......)等。

image.png
image.png

三、移动端调试-H5

真机调试

IOS

  1. 使用 Lightning 数据线将 iPhone 与 Mac 相连
  2. iPhone 开启 Web 检查器(设置 -> Safari -> 高级 -> 开启 Web 检查器)
  3. iPhone 使用 Safari 浏览器打开要调试的页面
  4. Mac 打开 Safari 浏览器调试(菜单栏 —> 开发 -> iPhone 设备名 -> 选择调试页面)
  5. 在弹出的 Safari Developer Tools 中调试

没有 iPhone 设备可以在 Mac App Store 安装 Xcode 使用其内置的 iOS 模拟器

iPhone

  1. 使用 USB 数据线将手机与电脑相连
  2. 手机进入开发者模式,勾选 USB 调试,并允许调试
  3. 电脑打开 Chrome 浏览器,在地址栏输入: chrome://inspect/#devices 并勾选 Discover USB devices 选项
  4. 手机允许远程调试,并访问调试页面
  5. 电脑点击 inspect 按钮
  6. 进入调试界面

直接使用手机扫码查看,体验更佳

使用代理工具调试

移动端h5开发,需要抓包进行接口调试,这时可以选择代理工具。下面以 Charles 为例:

  1. 安装 Charles
  2. 查看电脑 IP 和 端口
  3. 将 IP、端口号填入手机 HTTP 代理
  4. Charles 允许授权(默认情况下,Charles 无法抓取https的请求,需要安装证书)
  5. 使用 SwitchHosts! 软件给 Mac 电脑配 Hosts
  6. 手机访问开发环境页面

代理工具的原理:

  • 电脑作为代理服务器
  • 手机通过 HTTP 代理连接到电脑
  • 手机上的请求都经过代理服务器,电脑自然就抓取到手机上的请求了

常用工具

Charles

Charles:适合查看、控制网络请求,分析数据。

image.png
image.png

Fiddler

Fiddler:与Charles类似,适合 windows 平台。

image.png
image.png

spy-debugger

spy-debugger: 远程调试手机页面,抓包。

image.png
image.png

Whistle

Whistle: 基于 Node 实现的跨平台 Web 调试代理工具。

image.png
image.png

四、常用调试技巧

线上即时修改

我们平时在 Source 面板在线修改调试代码,会实时更新效果,但浏览器一刷新之前修改的全部恢复原样,这样子调试代码效率就很低,只能浏览器调试改点,代码跟着改点很麻烦。为了解决这个问题,我们可以使用 Overrides 保存线上修改后的文件,并能清晰看出改动了哪些地方,最后修改代码也方便。

image.png
image.png

Overrides 使用步骤如下:

  1. 打开 Sources 面板下的的 Overrides。
  2. 点击 Select folders for Overrides。选择一个本地的空文件夹目录。
  3. 允许授权
  4. 在 page 中修改代码,修改完成后 command + s 保存。
  5. 打开 devTools ,点击右上角的三个小 点 -> More tools -> Changes,然后就 能看到所有修改了。

启用本地 source map

线上环境的代码是打包压缩的,且没有 source map 文件,排查定位问题不方便,这时可以使用 Charles,配置 Map Local,将线上环境代理到本地,运行本地文件,本地有 source map就能快速定位到问题啦。

image.png
image.png

小黄鸭调试大法

上述调试技巧都没啥帮助时,我们可以采取终极调试大法——小黄鸭调试大法。 传说中程序大师随身携带一只小黄鸭,在调试代码的时候会在桌上放上这只小黄鸭,然后详细地向鸭子解释每行代码,然后很快就将问题定位修复了。

image.png
image.png

五、总结

我们开发写代码,虽然追求高质量编码,但 bug 终究不可避免。当遇到bug排查定位问题时,我们就会用到调试技巧,如下是我做的一些总结:

  • 样式问题排查:使用 Element 面板
  • 接口问题排查:善用 Network 网络面板、Console 日志面板
  • 线上环境问题排查:启用 OverridesCharles 配置 Map Local
  • 移动端问题排查:使用代理抓包工具(CharlesFiddler...)
  • 隐藏深的问题排查:小黄鸭调试大法(一行行挨着读代码,梳理清楚代码逻辑)

欲善其事必先利器,要想提升排错效率,快速解决线上问题,我们就需要用好上述介绍的前端调试工具和技巧。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Bug 与 Debug
    • Debug 的特点
    • 二、Chrome Devtool
      • 修改元素和样式——Element面板
        • Console面板
          • Source Tab
            • Break Point 与 Watch
            • Scope 与 Call Stack
          • Perfomance
            • Network
              • Application
                • Security
                • 三、移动端调试-H5
                  • 真机调试
                    • IOS
                    • iPhone
                  • 使用代理工具调试
                    • 常用工具
                      • Charles
                      • Fiddler
                      • spy-debugger
                      • Whistle
                  • 四、常用调试技巧
                    • 线上即时修改
                      • 启用本地 source map
                        • 小黄鸭调试大法
                        • 五、总结
                        相关产品与服务
                        远程调试
                        远程调试(Remote Debugging,RD)在云端为用户提供上千台真实手机/定制机/模拟器设备,快速实现随时随地测试。运用云测技术对测试方式、操作体验进行了优化,具备多样性的测试能力,包括随时截图和记录调试日志,稳定的支持自动化测试, 设备灵活调度,用例高效执行, 快速定位产品功能和兼容性问题。云手机帮助应用、移动游戏快速发现和解决问题,节省百万硬件费用,加速敏捷研发流程。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档