解决vite项目发版后浏览器缓存问题

问题:更新环境的版本后,再次点开时是旧的前端

下图中,当时最新的发布版本还是 26 号,却显示 22号的

image.png

打开某页面时,页面渲染失败,如下所示

image.png

原因:

vite 默认配置后,打包后 css 和 js 的名字后面都加了哈希值,不会有缓存问题。
但是 index.html 是有缓存的,其中加载的 css\js 文件已经不对了。 于是,出现报错 TypeError: Failed to fetch dynamically imported module。

image.png

解决方案:

① 处理 TypeError: Failed to fetch dynamically imported module

相关 issue:

在 ErrorBoundary 中,捕获到错误这种错误后,自动刷新页面 (不过会看见闪屏,体验感不太好)

 const fetchResourcesErrors = ['Failed to fetch dynamically imported module', 'Importing a module script failed']
   if (fetchResourcesErrors.some((item) => isString(error?.message) && error.message?.includes(item))) {
     window.location.reload()
   }

② 不缓存 index.html

a.前端在 .html 页面加 meta 标签

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
    <meta http-equiv="expires" content="0">

b.后端 nginx 配置,让 index.html 不缓存

add_header Cache-Control "no-cache, no-store";

相关文章:

Vite项目部署时,如果希望自动清理浏览器缓存,通常需要配合一些服务器端设置或者前端配置。以下是一些常用的做法: 1. **HTTP头控制**: 在服务器响应中添加 `Cache-Control` 和 `ETag` 头部信息。例如,设置 `Cache-Control: no-cache, no-store, must-revalidate` 可以告诉浏览器不要缓存资源。`Last-Modified` 或 `ETag` 也可以用于条件请求,只有当资源有更新时才从服务器获取。 ```javascript // server.js (使用Express为例) app.get('/api/*', function(req, res) { res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); res.setHeader('Pragma', 'no-cache'); res.setHeader('Expires', '0'); res.set('Last-Modified', new Date().toUTCString()); }); ``` 2. **URL策略**: 可以通过在文件名、本号等后加上时间戳或哈希值来创建一个新的URL,这样每次改动都会生成新的地址,浏览器会认为这是全新的资源,从而清空缓存。 3. **预布环境**(如`production`或`staging`):为生产环境单独配置,这样每次部署到新环境时,即使文件内容不变,用户访问的URL也会改变,间接达到清除缓存的效果。你可以通过环境变量或构建工具动态选择正确的域名或路径。 4. **利用CDN服务**: 许多CDN服务商如阿里云CDN等允许你设置缓存策略,比如设置过期时间或基于文件hash的缓存键,以控制缓存刷新。 5. **客户端提示**: 使用JavaScript的 `window.location.reload()` 或者 `hardReload=true` 参数强制刷新页面,这也能清空浏览器缓存,但用户体验较差。 记得在部署前进行测试,确保更改不会对用户的正常访问造成影响。另外,以上方法并不能保证100%清除所有用户的缓存,因为用户可能手动保存了某些资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值