常用移动前端开发调试方式

常用移动前端开发调试方式

因为日常开发经常需要在移动设备上调试测试开发的 H5 页面,但是一直都没怎么总结过移动前端开发相关的调试工具或方法,今天稍微总结一下比较好用的调试工具,也罗列了一些没有用过但是值得了解的工具

通用调试工具方法

Chrome 移动设备模拟器

Chrome 浏览器开发者工具内置了可用于模拟移动设备的功能,这也是最常用的调试方式,这里只是简单说明操作步骤:

  1. 在 PC 端打开 Chrome 浏览器并打开目标页面,然后 F12 打开开发者工具
  2. 点击开发者工具左上角的手机图标,刷新页面后即可调试
  3. 页面顶部设备选择下拉菜单可选择默认的多种品牌机型,以及仿真的网络状态
  4. 选择下来菜单中的 Edit 进入适配设备的机型选择,既有浏览器提供的机型,也可以根据需要设定自定义机型(主要是测试宽高比)

因为使用起来方便,所以开发调试的大部分都能满足需求,但是要更仿真更严谨还是需要在真机中调试。

vConsole 移动端网页上的调试控制台

vConsole 是一款轻量级、可拓展、针对手机网页的前端开发者调试面板。

通过该工具可以方便地在移动真机的 Web 页面中通过以下特性实现调试功能:

  • 查看 console 日志
  • 查看网络请求信息
  • 查看页面 element 结构
  • 查看 Cookie、localStorage 和 SessionStorage
  • 手动执行 JavaScript 命令行
  • 自定义插件

这款类库应该是使用最广泛的工具,而且使用起来也比较简单,与 PC 端 Chrome 等开发者调试工具使用方式类似,所以就不多叙述了。

更多关于此工具的使用教程可以参阅 vConsole 使用教程

除此之外,有个同样是 AlloyTeam 出品的错误监控上报、支持生产环境通过 URL 带参数唤起 vConsole 的库 AlloyLever 也值得关注一下。

同类型的产品有 eruda

实现原理

通过在页面注入 JavaScript 脚本实现模拟类似 Chrome DevTool 的调试面板。

通过重写 XHMLHttpRequest、fetch、console 方法实现网络请求和日志打印的拦截,并输出到控制面板中的 Network 和 Console 标签。

通过遍历 Cookie、LocalStorage、SessionStorage 对象下的所有存储键值以获取当前网页的本地存储数据。

而 Element 标签中的页面 DOM 树结构,则通过从 document.documentElement 节点开始向子孙节点递归生成。

Charles 数据传输抓包工具

试想以下在日常开发中可能会遇到的场景:

  1. 在本地开发完移动 H5 页面后,想与后端联调接口,但是接口部署在机房服务器上,域名非 IP 地址,这个时候联调会存在跨域问题,应该怎样解决?
  2. 线上 Web App 表现异常,没法在线上页面使用调试面板进行调试,怎样定位问题?
  3. 线上 Web App 表现异常,接口请求响应表现正常,单从代码层面无法定位问题根源,怎样更好地定位问题?

在 Charles 强大的抓包功能面前,这些问题通通都不是问题。我们先介绍一下 Charles:

Charles 是一款基于 HTTP 协议的代理服务器,通过截取请求和请求结果达到分析抓包的目的。

以下是 Charles 的功能特性:

  • 支持 HTTP 和 HTTPS 代理,截取分析 SSL 请求
  • 支持流量控制,可以模拟弱网测试环境
  • 支持接口并发请求
  • 支持重发网络请求,方便后端调试
  • 支持修改网络请求参数
  • 支持网络请求的截获并动态修改
  • 支持断点调试,构建异常的测试场景

使用方式

使用 Charles 抓包手机向服务器发送请求的操作步骤:

  1. 安装根证书:菜单 -> Help -> SSL Proxying -> Install Charles Root Certificate

安装根证书

  1. 找到安装好 Charles 的根证书后,确保证书的所有选项均为始终信任(这个证书后续会下载到你的手机中使用)

总是信任

  1. 然后开启 Charles 的代理服务:Proxy -> Proxy Setting,port 端口填 8888,选中 Enable transparent HTTP proxying

找到当前使用的 Mac 笔记本的 IP 地址(通过 Charles -> Help -> Local IP Address 可以获取)

开启Charles代理

  1. 给 iPhone 设置代理
  • 打开 iPhone,连接 Wifi(需要确保 iPhone 与 Mac 连接的是相同的 Wifi)
  • 打开 Wifi 名后的蓝色感叹号,在最下面找到 HTTP 代理,点击进入
  • 选择 手动,服务器上填上端口号 8888
  1. 随便打开网页,这个时候 Charles 会弹出请求连接的确认菜单,选择左边选项 Allow

6) 在手机浏览器中(最好是 Safari),输入 chls.pro/ssl,会弹出安装证书的请求,输入密码,一直点安装即可

  • 打开设置,点击 通用 -> 关于本机 -> 证书信任设置,找到当前要作为代理的电脑名,打开信任开关

这个时候既可以截取到 HTTP/HTTPS 的网络请求了。

实现原理

Charles实现原理

事实上 Charles 就是充当所谓的 中间人 角色,把我们的设备发送的请求拦截下来,并转发给我们的目标服务器,而后将响应的信息返回给我们的设备。

前提是设备上需要安装并信任 Charles 的证书,这个为了当 HTTPS 传输时,Charles 需要拦截解密数据并利用服务端的证书公钥和 HTTPS 连接的对称密钥做后续的传输加密。

由于本人使用 Charles 比较多,但其实还有很多类似的抓包工具,例如:

  • 软件类
    • Fiddler
    • Wireshark
    • Weinre:基于 Web Inspector 的远程调试工具,可以在 PC 上直接调试运行在手机上的页面
  • 工具包类
    • spy-debugger:一站式页面调试、抓包工具,能远程调试任何手机浏览器页面,任何手机移动端 Webview,无需 USB 连接设备(实现原理与 Charles 类似)
    • whistle:基于 Node 实现的跨平台抓包调试代理工具,功能强大,支持 WebSocket、反响代理、插件扩展等特性

基于 iOS 的开发调试

Safari + 数据线 远程设备调试

前期准备:iPhone + MacBook + 各自安装 Safari

调试方式:

  1. 打开 iPhone 设置 -> Safari 浏览器 -> 高级 -> Web 检查器
  2. 打开 MacBook 上的 Safari 浏览器 偏好设置 -> 高级 -> 在菜单栏中显示“开发”菜单
  3. 用数据线连接 iPhone 和 MacBook,并选择 信任 设备,在 iPhone 上的 Safari 浏览器打开需要调试的页面,并在 MacBook 上的 Safari 中选择 开发 -> (连接设备名称)-> (调试页面域名)
  4. 选中后会出现如下图所示的界面,这样就可以实现如 PC 端的调试功能

如果 Safari 调试面板一片空白可以下载个 Safari Technology Preview

基于 Android 的开发调试

Chrome + USB 远程设备调试

通过安卓手机与任意系统的电脑同时安装 Chrome 浏览器,并通过 USB 进行有线连接,可以通过浏览器内置的功能实现远程调试,简单来说就是通过 PC 端 Chrome 的开发者工具调试手机上 Chrome 打开的网页。

调试方式:

  1. Android 手机和 PC 电脑同时下载 Chrome 浏览器
  2. 打开 Android 手机 设置 -> 开发者选项 -> USB 调试(可能不同厂商的设定不一致,最终目的就是打开 USB 调试,如果打开路径不一样的,可以自行探索或搜索对应设备打开 USB 调试的方式)。
  3. 利用 USB 数据线,将 Android 手机与 PC 电脑连接,手机理论上会提示是否允许 USB 调试,选择 确认 的选项的就好了
  4. 打开 PC 电脑上的 Chrome 浏览器,打开开发者工具 Console -> 右侧 Customize and control DevTools -> More tools -> Remote devices
  5. 每个页面右侧均有一个 Inspect 检查的按钮,点击就会出现你熟悉的画面,

更详尽的调试方式可以参考 Google 官方的开发者文档相关章节:

微信

微信开发者工具

微信生态包括公共号网页开发、小程序、小游戏等使用微信开发者工具就行了,这没有什么争议,毕竟官方提供的工具。

文档:微信开发者工具

缓存清除方法

这里提提搜到的一个微信内网页缓存的清除方法:

  1. 微信中打开网页 http://debugx5.qq.com
  2. 滑动到底部,选中四个缓存选项 Cookie、文件缓存、广告过滤缓存 和 DNS 缓存,点击清除即可

其他付费服务

在调研过程中也发现了一些挺不错的付费调试工具:


参考资料:

0%