为更好帮助大家优化小程序性能,解决卡顿、白屏、加载速度慢等问题,平台上线了简单好用的《数据预取js方案》🎉
实验发现,数据预取能力开发成本在 0.5 天左右,部分小程序对比优化前后成功看到小程序页面内容的人数提升 0.5%~1% ✅详细接入示例可查看👉《数据预取js方案接入示例》
收集了大家在数据预取接入过程中常见的11个问题,快来看看这些问题怎样更高效地解决吧⬇️
常见问题
(1)业务接口依赖 tt.login 无法直接预取
新的数据预取方案 prelaunch.js 支持 tt.login 等API,具体支持范围见《数据预取js方案-预取环境中支持的API》。如有其他需求,可以直接通过社区、开发者助手等方式反馈。
(2)业务接口参数需要 md5 签名
使用三方框架开发的小程序, prelaunch.js 因为不支持原生打包,所以普通开发者如果使用到crypto-js时不知道如何处理。这里暂时提供一段精简后的crypto-js代码(只包含md5 / HmacMD5,core),详情请查看:数据预取js方案。
(3)业务接口依赖启动场景值
新的预取方案支持在 prelaunch.js 中调用 tt.getLaunchOptionsSync,可以通过该API 直接获取启动参数。
(4)部分场景不希望命中预取结果
数据预取js方案中,本次请求不命中预取结果,可以将 usePrefetchCache 设置为 false, 或者调整 id 为未预取过的请求。
示例场景:希望详情接口只在页面A 使用缓存,其他页面发起请求时不希望命中预取。
示例建议:配置预取时,id 命名为 ${字符串}_${页面path} 作为标识。
(5)预取了很多接口,为什么优化不明显
数据预取的接口或图片并不是越多越好,目标是将重点请求接入预取(如LCP 的触发元素或其来源请求)
数据预取只是将请求前置,预取时发起过多请求也会有资源竞争,可能导致预取耗时过长,预取结果命中率降低。
建议接入个数:1~3 个(接口 或 图片数量,分开计数);
分析步骤:见《启动性能优化指引》。
(6)数据预取的请求会阻塞后面的请求吗? 相同的请求,如果预取没有请求完毕,会发起两遍吗
- 数据预取不会阻塞,是并行的状态,后续相同的请求,会使用之前请求的结果。
- 不会发起两遍,如果调用 tt.request 时请求时传入的 id 参数相同,那么第二个请求不会发起网络请求,会直接复用第一次请求。
(7)prelaunch.js 执行时机是什么时候,和请求前置到 onLaunch 效果一样么
prelaunch 效果更好,onLaunch 阶段任务更多,API 调用可能会被阻塞,prelaunch 的执行是在一个独立的线程,效率更高。
(8)数据预取链接失败,捞日志发现timeout
可能原因有:
- 手机和电脑不在同一个局域网。
- 电脑打开了防火墙,导致手机无法访问,关闭后正常,可以在手机上直接访问 ip:7047 看是否能通。
(9)如何在 prelaunch.js 中使用环境变量
可以通过字符串替换的方式来注入环境变量
(10)「registerOnPrelaunch 的回调在小程序生命周期只会触发一次」,启动页面A 和 app 都注册了,两个回调都会触发吗?
通过 registerOnPrelaunch 注册的 app 和 特定页面的回调,都会执行, app 先执行。
(11)数据预取js 方案和配置方案可以一起使用么
不建议一起用,两者效果相同,只保留一种就可以。因为数据预取js 方案是一个独立的 worker 环境,请求链路无法复用,两个预取请求都会发出,导致不必要的资源浪费。