Loading chunk {n} failed 的解决方法
背景:
- 前端代码更改后,每次发布到测试环境,用户的页面如果不刷新,会读取缓存,导致页面白掉!
- 本地没有过,都是打包到服务器上才有
error info
1 |
|
报错原因分析:
- webpack 打包重命名了改动过的 css 和 js 文件,并删除了原有的文件
- 场景 1.用户正在浏览页面时你发包了,并且你启用了懒加载,用户的 html 文件中的 js 和 css 名称就和服务器上的不一致导致
- 场景 2.用户浏览器有 html 的缓存,访问了上一个版本发布的资源导致
- webpack 进行 code spilt 之后某些 bundle 文件 lazy loading 失败
- 其他原因:
- 服务器打包时没有进行
rm -f public/dist/*
操作 - chunk 文件内容是不是被篡改(通过抓包排查)
- 没有升级版本号导致的问题
- 服务器打包时没有进行
关键
- 刷新:会重新获取一遍 html 文档,chunk 对应信息也就刷新
- 仅捕获到错误就刷新,很可能出现死循环,因为浏览器或类似于 Nginx 缓存设置的原因,浏览器不一定每次刷新去获取新的 index.html
解决方案
- 方案 1:结合重试次数和重试间隔来重试,用 location.reload 方法,相当于触发 F5 刷新页面
- 缺点:reload 方法,相当于触发 F5 刷新页面,用户会察觉加载刷新
- 捕获到了 Loading chunk {n} failed 的错误时,重新渲染目标页面,通过正则检测页面出错:用 window.location.reload(true)刷新页面
1 |
|
方案 2:构建时静态资源路径带上版本信息
- 如路径中携带,如原来请求
/static/js/balabal.[hash].js
,现在/[version]/static/balabal.[hash].js
- 如路径中携带,如原来请求
方案 3:增加配置让页面每次加载新数据而不是走缓存,同时让后端帮忙修改 Nginx,设置 no-cache,让页面不要每次去读取缓存
1 |
|
- 方案 4:尝试入口文件 client\index.tsx 处进行热更新
1 |
|
方案 5(使用 Umi 框架的项目)
- 1.
将 .umirc.js 中的 publicPath 配置成 /
- 2.如果构建的 dist 文件多加一层目录 base
1
2
3
4location /base {
# 用于配合 browserHistory使用
try_files $uri $uri/ /index.html;
}- 1.
方案 6
找到 public/index.html 页面,在脚本上 src 前加上”/“
1 |
|
拓展
React.Lazy 的原理
1 |
|
1 |
|
封装 retry 方法
1 |
|
Loading chunk {n} failed 的解决方法
https://www.pengsifan.com/2020/12/01/Loading chunk {n} failed/