首页/文章/前端

Vite前端部署:版本更新,即刻知晓

2024-09-20
10904 分钟
...

最近测试和用户频繁反馈,说经常会出现页面点不动了。然后每次都回复,刚发完版,刷新下就好了。但时间长了,就被怀疑是能力问题,因为其他项目为什么不这样呢?

先做一些准备工作,复盘一下当时的场景:

运行 pnpm create vite vue3-vite-router --template vue 在本地快速新建一个项目

进入项目目录中,运行pnpm i 安装依赖,安装成功后启动项目pnpm dev, 启动成功后运行 pnpm build进行打包。打包完成后根目录下会多出一个dist目录。运行 pnpm preview预览构建后的项目。

页面可以正常打开:

页面窗口保持不变(不进行刷新等其他操作)。在AboutView.vue文件中随便修改一点修改。再次运行打包pnpm build和预览 pnpm preview。在刚才的页面中点击 About 进行导航切换后,About页面对应的js文件请求失败了。

经过排查,是发版后js的文件名hash变了,原页面对应的html文件引用的js hash名称还是上一版本的,由于做了懒加载,所以点击跳转新页面时,对应的js文件不存在导致。懒加载的优化变成了事故,我冤枉啊~~~(我发誓:以后能跑起来绝对不优化)

为了证明自己的开发能力(掉发能力),针对vite项目调研了两种方案(纯前端方案,绝不麻烦后端):

翻看vite官方文档上发现了一个简单的办法:当vite加载动态导入失败时,会触发 vite:preloadError 事件。可以使用这个事件进行处理。

在main.js中增加以下代码:

window.addEventListener('vite:preloadError', (event) => {
  console.log('检测到有新版本,5秒后即将刷新...');
  setTimeout(() => {
    window.location.reload() 
    console.log('页面已更新为最新版本...');
  }, 5000)
})

先执行 pnpm buildpnpm preview,刷新页面。然后随意修改AboutView.vue的代码,重新执行 pnpm buildpnpm preview,点击About后,js请求异常,会触发vite:preloadError事件,然后执行回调中的刷新逻辑。

总结:这个方法比较简单,但是只能应用在路由切换的场景中。

还有一种场景是无路由切换时,代码未及时进行更新。对我们的项目来说,都是在晚上发布,如果有版本更新,运维同学会在群里及时同步测试和产品同学。如果需要解决,需要进行轮询操作。具体请参考:2种纯前端检测版本更新提示

目测最佳的时间方案为:

vite打包构建时生成版本号json文件,并将json文件保存到构建好的静态资源目录中。

路由变化时执行:对比json文件中的版本号与缓存中是否一致。若一致,则进行弹窗提示用户进行刷新。

相关代码参考了这篇文章:vite前端版本升级,刷新页面

  1. 新建一个vite插件,完成将发布版本的时间戳写入文件。代码如下:
import path from "path";
import fs from "fs";


const writeVersion = async (versionFile, content) => {
  fs.writeFile(versionFile, content, (err) => {
    if (err) throw err;
  });
};

export default (options) => {
  
  let configPath;
  return {
    name: "refreshVersion",
    configResolved(resolvedConfig) {
      
      configPath = resolvedConfig.publicDir;
    },
    async buildStart() {
      
      const file = configPath + path.sep + "version.json";
      
      const content = JSON.stringify({ version: options.version });
      if (fs.existsSync(configPath)) {
        
        writeVersion(file, content);
      } else {
        
        fs.mkdir(configPath, (err) => {
          if (err) throw err;
          writeVersion(file, content);
        });
      }
    },
  };
};
  1. vite配置文件中使用该插件,并在全局缓存版本时间戳,便于后续比对使用。代码如下:
import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import refreshPlugin from './src/plugins/refreshPlugin.js'
const now = new Date().getTime(); 



export default defineConfig({
  plugins: [
    vue(),
    
     refreshPlugin({
      version: now
    })
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  
  define: {
    __APP_VERSION__: now,
  }
})
router/index.js




router.beforeEach(async (to, from, next) => {
  await versionCheck() 
  next()
});


const versionCheck = async () => {
  if (process.env.NODE_ENV === 'development') return
  const response = await axios.get('version.json')
  if (__APP_VERSION__ !== response.data.version) {
      
      console.log('有新版本,5秒后自动刷新页面');
      setTimeout(() => {
          window.location.reload()
      }, 5000)
  }
}

与第一种方案相同操作,先后运行两次 pnpm buildpnpm preview。结果显示,第二次build后,路由切换自动刷新完成。

总结:本文提出了vite项目中版本变化的刷新问题,通过监听vite异常事件事件维护比对发布版本时间戳两种方案,成功解决了自动刷新问题,并展示了demo相关代码和运行结果。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
前端2026-07-17
HTML Form 可以把 POST 响应加载进 iframe
在接入支付验证、身份认证或第三方授权页面时,我们经常会遇到这样的流程: 1. 后端返回一个第三方接口地址。 2. 这个地址必须通过 请求访问。 3. 接口返回 HTML,或者重定向到真正的验证页面。 4. 验证页面需要嵌入当前网站,而不是打开新标签页。 5. 验证完成后,当前页面继续执行后续业务。 第一次遇到这个需求,很容易想到: 但涉及第三方支付时,这种方式通常会遇到 CORS、Cookie、重定向和跨域页面读取限制。 实际上,HTM...
学习
前端2026-05-29
前端判断一个网页是否允许被 iframe 内嵌
前端 不能 100% 准确提前判断 一个网页是否允许被 iframe 内嵌,因为决定权主要在目标网站返回的 HTTP 响应头 里,而普通前端 JS 通常读不到跨域页面的响应头。 核心判断看这两个东西: 1. 老一点但仍常见。 表示完全不允许被 iframe 嵌入。 表示只允许同源页面 iframe 嵌入。 以前有这个,但现代浏览器支持很差,基本不建议依赖。 2. 现在更推荐看这个。 表示不允许任何页面嵌入。 表示只允许同源嵌入。 表示只...
学习
前端2026-03-20
网页唤起 Android App 调试笔记(App Links)
  在最近的项目中,我遇到了 网页访问特定 URL 应该唤起 Android App,但实际只打开网页 的问题。通过调试和排查,整理出以下经验和步骤。 1\. 项目与环境信息(脱敏处理) 网站域名: 唤起页面: Android App 包名: intent filter 配置示例: assetlinks.json 已上线,包含 App 的 SHA256 签名指纹 2\. 问题现象 用户访问 页面时, 网页打开了,但 App 没...
学习
前端2026-03-02
深入理解 Cookie:安全属性、访问边界与渲染场景实践
本文系统梳理 Cookie 核心机制,聚焦 HttpOnly/SameSite 等安全属性 、 访问权限边界 、 CSR/SSR 差异 ,附关键代码示例与安全清单。适合开发查阅与知识沉淀。 一、Cookie 是什么?为什么需要它? HTTP 是无状态协议。Cookie 是服务端通过 响应头下发、浏览器自动存储并在后续 同源请求中携带 的小型文本数据(通常 ≤4KB),用于: 会话维持(Session ID) 用户偏好(语言/主题) 跨请...
学习
前端2026-03-02
退出登录时 Cookie 清除指南
核心结论 :登出 ≠ 单方面操作。HttpOnly 与非 HttpOnly Cookie 需 前后端协同清除 ,缺一不可。残留 Cookie = 安全隐患 + 用户体验漏洞。 🔒 为什么不能“一键清空”? 浏览器出于安全设计: 后端 :只能通过 响应头清除 自己设置过 的 Cookie(需属性完全匹配) 前端 JS :可读写非 HttpOnly Cookie,但 无法触碰 HttpOnly Cookie 无“清除全部”API :任何服...
学习
前端2025-12-15
懒加载图片在同一个 Item 中逐个出现的原因与解决方案
懒加载图片在同一个 Item 中逐个出现的原因与解决方案 适用场景 :使用原生 实现图片懒加载的动态列表,每个列表项(item)包含多张图片。 📌 问题描述 在开发一个动态渲染的列表时,每个 item 中包含三张图片,并使用 HTML 原生的懒加载属性: 观察到的现象: 开启懒加载时 :三张图片 不是同时出现 ,而是 从左到右(或从上到下)依次加载显示 ,有明显的时间差。 关闭懒加载(移除 )后 :三张图片 看起来是一起出现的 ,视觉...
学习

评论

请登录后发表评论

去登录
加载评论中...