小程序首屏 4 秒,如何基于 vConsole 定位是 JS 执行还是网络耗时

解读

面试官把“首屏 4 秒”抛给你,核心想验证三件事:

  1. 你是否能把“体感 4 秒”拆成可量化的阶段(网络、渲染、JS、数据拼装)。
  2. 你是否知道 vConsole 在国内小程序生态里是唯一可落地的“线上无侵入抓包+时序”工具,而不是 Chrome DevTools。
  3. 你是否具备“用弱网/高并发场景还原现场”的性能测试思维,而不是只盯代码。

一句话:让你用 vConsole 给出“到底是网络还是 JS”的判责证据,并说出下一步压测/埋点/优化的闭环方案。

知识点

  1. 小程序启动链路(冷启动)
    下载代码包 → 注入基础库 → 业务 JS 初始化 → 首屏数据请求 → setData 渲染 → 图片/字体拉取 → 首屏结束(FP/FMP)。
  2. vConsole 能力边界
    Network 面板:只能看到 wx.request/wx.cloud.callFunction 等“小程序层”请求,不含 DNS/TCP/SSL,但能看到 sendStart/downloadEnd 时间戳,足够判责。
    System 面板:打印 AppService 逻辑层 console,可手动打“阶段桩”。
    Performance 面板(基础库 2.25+):自带 Mark/Measure,可在真机拿到逻辑层 JS 执行耗时,精度 5 ms。
  3. 性能测试判责公式
    首屏耗时 = 代码包下载 + 业务 JS 执行 + 首屏接口耗时 + 首次 setData + 渲染层绘制 + 图片懒加载。
    任一段 > 1 s 即可被用户感知,> 2 s 即算瓶颈。
  4. 国内特殊坑
    安卓 4G 弱网(电信 3G 重定向)、企业微信/钉钉双宿主、插件代码包 2 M 限制、运营商劫持导致 302,都会放大“网络”侧耗时。
  5. 定位套路
    “双面板+一标记”:Network 看接口,Performance 看 JS,console.time 打桩看 setData→渲染。

答案

步骤一:复现场

  1. 让测试同学在“微信开发者工具→真机调试 2.0”里打开 vConsole,并打开“性能面板”开关;同时打开“网络面板”。
  2. 用 QNET 或 Charles 把网络降到 4G 弱网(上行 100 kbps、下行 400 kbps、丢包 2%),冷启动小程序,连抓 5 次,取中位值。

步骤二:拆阶段
在 app.js 与首页 index.js 关键位置手动打桩:

console.time('jsInit')   // app.js 第一行
console.timeEnd('jsInit') // onLaunch 尾行
console.time('getData')   // 发起首屏请求前
console.timeEnd('getData') // setData 回调里

vConsole System 面板会打印出“jsInit: 260 ms”“getData: 580 ms”等。

步骤三:读面板

  1. Network 面板找到首屏接口,看“总耗时”列。若 > 1.2 s,且 TTFB 占 70% 以上,即可判为“后端/网关慢”。
  2. Performance 面板看“Scripting”条形图,若 > 300 ms 且连续占满一帧,即可判为“JS 执行重”。
  3. 若 jsInit 打印 > 500 ms,且 Performance 里“Require”模块阶段长,说明代码包未做按需注入或 vendor 过大。

步骤四:给结论
把上面三段数据写进“性能测试简报”:
“弱网 4G 下,首屏 4.1 s = 代码包下载 1.3 s + JS 执行 0.9 s + 首屏接口 1.5 s + 渲染 0.4 s。瓶颈在接口与代码包,建议 1. 服务端加 CDN 边缘节点回源,2. 开启小程序分包+按需注入,3. 接口并行化+gzip。”

步骤五:回归
用 JMeter 压测后端接口 500 并发,95 RT 降到 300 ms 以内;再用微信云测 50 款中低端机验证,首屏中位值从 4.1 s 降到 1.8 s,满足 SLA 2 s。

拓展思考

  1. 如果 vConsole 看到接口只要 400 ms,但 Performance 里“Scripting”只有 80 ms,首屏仍 3 s,要考虑“图片/字体阻塞渲染”。可在骨架屏完成后用 IntersectionObserver 懒加载,把图片请求挪到首屏外。
  2. 线上真实用户无法强制打开 vConsole,可在 TBS 性能日志里把“首屏接口耗时”与“逻辑层 JS 耗时”通过 wx.getPerformance() 埋点,上报到 SLS,建立 95 分位监控,性能测试定期跑 4G 弱网基线用例做 diff。
  3. 若小程序跑在企业微信里,vConsole 可能被宿主屏蔽,此时用“企业微信开发者工具→远程调试”绕开,或抓包+代码插桩双保险,保证定位链不断。