数据预取js方案接入示例
收藏
我的收藏确定预取对象
找出主要元素
下面介绍如何找出影响启动 / 页面切换耗时的主要影响元素
(1)在IDE 中使用“体验评分工具” 勾选真机体验后,运行待整个页面渲染完成,点击屏幕后停止。
(2)查看体验评分结果(右图),截图部分为当前场景的最大元素,也就是主要优化对象。
(3)找到主要优化目标
影响该部分渲染的数据请求(数据来源 / 展示时机等),为主要优化接口,进行下一步「1.2 确认预取接口」。
确认预取接口
相关请求可能有以下场景。
- 1.请求参数依赖其他状态值:例如登陆态,授权态等。将动态值通过 tt.setStorage 或 tt.setStorageSync存储到本地,具体参考下述接入流程示例。
- 2.请求参数依赖部分API 动态调用结果。
- a.如根据登陆态请求不同接口,prelaunch.js 中也可以调用 JSAPI , 可以判断登陆后再走到预取请求逻辑
启动接入
示例场景
网络请求所在页面:
pages/index/index
具体场景:在启动时根据启动路径 pageid query 参数调用https://microapp.bytedance.com/miniprogram-demo/invoke/tma_demo_request?接口获取信息,在接口返回后根据接口返回内容展示页面内容。 如:
page/index/index?pageid=123
接口依赖:接口参数中依赖
token
, dataKey1
动态参数// app.js App({ onLaunch() { tt.setStorageSync('token', 'testToken') tt.setStorageSync('dataKey1', 'dataKey1Value') } }) // page/index/index.js Page({ onLoad(options){ tt.request({ url: `https://microapp.bytedance.com/miniprogram-demo/invoke/tma_demo_request?pageid=${options.pageid}`, method: 'POST', header: { token: tt.getStorageSync('token'), }, data: { dataKey1: tt.getStorageSync('dataKey1'), dataKey2: 1 }, success: (res) => { console.log("请求数据:", res.data); }, }); } })
新增prelaunch.js
// prelaunch.js registerOnPrelaunch('pages/index/index', ({path, query}) => { console.log('----begin prelaunch!!!') const queryObj = queryStringToObj(query); tt.request({ url: `https://microapp.bytedance.com/miniprogram-demo/invoke/tma_demo_request?pageid=${queryObj.pageid}`, id: `${queryObj.pageid}`, method: 'POST', header: { token: tt.getStorageSync('token'), }, data: { dataKey1: tt.getStorageSync('dataKey1'), dataKey2: 1 }, }); }); function queryStringToObj(query) { const obj = {}; query.split('&').forEach(kv => { const [key, value] = kv.split('='); obj[key] = value; }) return obj; }
- 1.到此我们已经完成了预取请求的发起,查看ide控制台可以发现已经发起了额外一次请求。
- 2.如果没有发起额外的请求,可以检查下控制台的console是否执行,没有执行可以联系平台帮忙解决。
使用预取数据
usePrefetchCache 标识使用预取, id标记请求唯一性
// page/index/index.js Page({ onLoad(options){ tt.request({ url: `https://microapp.bytedance.com/miniprogram-demo/invoke/tma_demo_request?pageid=${options.pageid}`, id: `${options.pageid}`, method: 'POST', header: { token: tt.getStorageSync('token'), }, data: { dataKey1: tt.getStorageSync('dataKey1'), dataKey2: 1 }, // 配置此字段标识要使用预取的返回值。 usePrefetchCache: true, success: (res) => { console.log("请求数据:", res); }, }); } })
- 1.修改page/index/index中的tt.request请求,添加usePrefetchCache:true参数。表示使用预取的网络请求。
- 2.查看控制台/tt.request的返回值,可以看到,只有一次网络请求。
- 3.到这已经完成数据预取接入。
- 4.预取详细逻辑如下
- a.在传入id参数后,会将id参数和url参数不带query部分作为一个key,生产一个全局缓存。
- b.在后续key相同情况时候,如果此时传入了usePrefetchCache: true,如果存之前请求的缓存,则直接返回缓存。
- c.如果没有缓存,则生成缓存。
- d.如果key相同,但是usePrefetchCache: false,则仍会正常请求,但是会更新缓存。
接入完成
查看方式:console.log 打印请求结果,在真机 vconsole 中查看。
(1)预取成功:可以看到此处控制台只发起了一次网络请求。并且 tt.request 的返回值 res.isPrefetch 为true,接入完成!
线上优化效果
完整代码
代码片段链接
// prelaunch.js registerOnPrelaunch('pages/index/index', ({path, query}) => { console.log('----begin prelaunch!!!') const queryObj = queryStringToObj(query); tt.request({ url: `https://microapp.bytedance.com/miniprogram-demo/invoke/tma_demo_request?pageid=${queryObj.pageid}`, id: `${queryObj.pageid}`, method: 'POST', header: { token: tt.getStorageSync('token'), }, data: { dataKey1: tt.getStorageSync('dataKey1'), dataKey2: 1 }, success:(res) => { // 如果需要预取接口返回的图片 tt.preloadImages({ urls: ['url1','url2'] }) } }); }); function queryStringToObj(query) { const obj = {}; query.split('&').forEach(kv => { const [key, value] = kv.split('='); obj[key] = value; }) return obj; }
// page/index/index.js Page({ onLoad(options){ tt.request({ url: `https://microapp.bytedance.com/miniprogram-demo/invoke/tma_demo_request?pageid=${options.pageid}`, id: `${options.pageid}`, method: 'POST', header: { token: tt.getStorageSync('token'), }, data: { dataKey1: tt.getStorageSync('dataKey1'), dataKey2: 1 }, // 配置此字段标识要使用预取的返回值。 usePrefetchCache: true, success: (res) => { console.log("请求数据:", res.data); }, }); } })