数据预取时如何避免重复请求和资源浪费?
我在做商品详情页的性能优化,想用数据预取提前加载用户可能点击的商品信息。但发现如果用户没点进去,之前预取的数据就白请求了,而且如果多个地方同时预取同一个接口,还会触发多次重复请求。
我试过用 Map 缓存 Promise,但不确定是不是最佳实践。另外,页面上有些懒加载的模块用了 CSS 控制显示状态,比如:
.product-preview {
opacity: 0;
pointer-events: none;
transition: opacity 0.3s;
}
.product-preview.loaded {
opacity: 1;
pointer-events: auto;
}
这种情况下,预取的数据和组件渲染时机怎么协调才不会浪费带宽?有没有成熟的方案可以参考?
试试这个方法:建立一个全局的请求管理器,用 WeakMap 存储接口请求的状态和返回值。每个请求前先检查是否在进行中或已完成,如果是就直接返回缓存的 Promise。这样能避免重复发起相同的请求。
对于懒加载模块,建议加个判断条件:只有当组件即将进入视口时才触发数据预取。可以监听滚动事件或者用 Intersection Observer API 检测元素可见性。
至于你提到的 CSS 控制显示状态,可以在数据准备好后再添加 loaded 类。这样既不会浪费带宽,也能保证用户体验流畅。
最后别忘了设置合理的过期时间,防止缓存太久的数据影响展示准确性。这事儿得根据具体业务场景来定,多测试几次就知道合适的策略了。开发这事就是这样,细节调好了性能自然就上去了。