下拉刷新按需加载动画库需解耦动态import()与刷新逻辑,用promise缓存确保只加载一次,并配合刷新生命周期控制动画启停与资源销毁。

下拉刷新时按需加载动画库,关键在于把动态 import() 和刷新逻辑解耦,避免重复请求、保证加载完成后再触发动画。
监听下拉刷新并触发动态导入
不要在每次下拉回调里直接调用 import(),而应加一层状态控制,确保只加载一次。例如使用一个 Promise 缓存加载结果:
let animModule = null;
const loadAnimation = () => {
if (animModule) return animModule;
animModule = import('lottie-web').then(module => {
// 可选:预初始化或暴露常用方法
return module.default || module;
});
return animModule;
};
// 下拉刷新回调中
onPullDownRefresh(() => {
loadAnimation().then(Lottie => {
const anim = Lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: true,
path: '/assets/refresh.json'
});
// 刷新完成后可 stop/destroy
});
});
避免重复加载和资源浪费
动态导入本身是幂等的(同一路径多次调用返回相同 Promise),但若刷新频繁或网络不稳定,仍可能因未加锁导致多个并发请求。建议:
- 用闭包或模块级变量缓存 Promise,不依赖 import() 自带的去重(部分打包器行为不一致)
- 加载失败时提供降级方案,比如显示 CSS 动画或纯文本提示
- 必要时加 loading 状态标记,防止用户快速多次下拉触发多轮加载
配合刷新生命周期合理控制动画
动画库加载完成 ≠ 刷新动作结束。应结合小程序或框架的刷新 API(如微信小程序 wx.stopPullDownRefresh() 或 Vue 的 onUpdated)来协调时机:
- 在
import()成功后立即启动动画,视觉反馈更及时 - 数据请求完成、DOM 更新后,再调用
stopPullDownRefresh()并停止/销毁动画实例(防止内存泄漏) - 若使用 Lottie,记得调用
anim.destroy()或anim.stop()避免后台持续运行
构建与路径注意点
确保动画库能被正确打包分块:
- 使用支持 code-splitting 的构建工具(Vite、Webpack 5+、Rollup)
- 导入路径必须是静态字符串(不能是模板字面量拼接的变量),否则无法被识别为动态导入
- 若用 CDN,可用
import('https://cdn.jsdelivr.net/npm/lottie-web@2.12.2/build/player.min.js'),但需注意跨域和全局变量注入方式(如改用eval加载需谨慎)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











