DotLottieReact加载.lottie文件偶发失败并抛出DOMException的问题求助
DotLottieReact加载.lottie文件偶发失败并抛出DOMException的问题求助
针对你在React 18 + Vite 4项目里遇到的这个偶发问题,我整理了几个常见的原因和对应的解决思路,你可以逐一排查试试:
可能的原因及解决办法
1. Vite下public资源的路径解析问题
在Vite项目中,public目录下的资源引用有特定的规则:
- 你当前用的
./crown.lottie相对路径,在某些路由场景下可能会出现解析错误,导致资源加载不完整。 - 解决方式:改用绝对路径(因为public目录的资源会被部署到项目根目录),或者通过
import.meta.env.BASE_URL拼接路径,确保路径始终正确:// SecondSection.jsx 修改路径写法 <Animation url={`${import.meta.env.BASE_URL}crown.lottie`}/>
2. .lottie文件本身的损坏或格式异常
偶发的加载失败有可能是文件本身存在损坏,或者在打包、传输过程中出现了截断:
- 你可以重新导出/下载一份完整的
.lottie文件替换现有文件,同时核对文件的MD5值,确保和源文件一致;也可以用LottieFiles官方预览工具打开文件,确认动画本身没有结构错误。
3. 组件渲染时机与资源预加载不匹配
有时候组件在资源还没完全加载完成就开始渲染,会触发解析错误:
- 可以给组件添加加载状态和错误处理逻辑,提前预加载资源:
// Animation.jsx 优化代码 import React, { useState, useEffect } from 'react'; import { DotLottieReact } from '@lottiefiles/dotlottie-react'; export const Animation = ({url="path/to/animation.lottie"}) => { const [isLoaded, setIsLoaded] = useState(false); const [loadError, setLoadError] = useState(null); useEffect(() => { const preloadResource = async () => { try { const response = await fetch(url); if (!response.ok) throw new Error('资源加载失败'); await response.blob(); setIsLoaded(true); } catch (err) { setLoadError(err); } }; preloadResource(); }, [url]); if (loadError) return <div>动画加载失败,请刷新重试</div>; if (!isLoaded) return <div>加载中...</div>; return ( <DotLottieReact src={url} loop autoplay /> ); };
4. 包版本兼容性问题
当前使用的@lottiefiles/dotlottie-react版本可能和React 18、Vite 4存在兼容性冲突:
- 可以尝试升级到最新版本的包:
也可以查看官方文档确认版本兼容情况,必要时回退到稳定兼容的版本。npm update @lottiefiles/dotlottie-react
备注:内容来源于stack exchange,提问作者Aga




