前端更新提示
发表于:2024-11-25 |

前言

大家好,好久没见,最近和大学同学一起在赚外快,搞一套简单的商城的东西,也是赚了万把块钱,就没更新博客,现在项目到收尾阶段了,博客也就重新开始更新,本篇文章记录一下一个简单的前端更新提示的逻辑。

实现逻辑

我们都知道,vue项目打包之后的index.html是基本这样的一个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="./logo.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>管理系统</title>
<script type="module" crossorigin src="./assets/index-f4cbc7d5.js"></script>
<link rel="stylesheet" href="./assets/index-281dda9e.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

每一次更新,我们的script标签和link后面的地址是不一样的,那我们就可以根据这个来进行判断页面是否更新了。

实现

创建autoUpdate.js

这里我用了tdesign的弹窗组件,你也可以用自己的,本质上我们需要检测的是script标签的内容,我们可以搞简单点,直接比对html的内容即可。

  1. 这里因为我这个项目打包之后的目录,在服务器上是在bonded-area-web目录下面的,所以加了这个,你可以根据实际情况调整。
  2. 我们测试本地环境是不需要检测这个东西,因此可以加上process.env.NODE_ENV === 'production'线上环境的判断。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { DialogPlugin } from "tdesign-vue-next";
// 更新提示
// 保存旧的html代码字符串
let oldHtml = '';
// 弹窗dom
let dia=null

// 从服务端获取最新的html代码
async function fetchHtml() {
// fetch('/xxx')获取的就是html文件,
// 再用text()转为字符串
// 加上时间戳避免缓存
return await fetch(`/bonded-area-web?timestamp=${+new Date()}`)
.then(res => res.text())
}

// 判断需不需要更新
async function needUpdate() {
const newHtml = await fetchHtml()
// 默认不需要更新
let result = false
if (oldHtml && oldHtml !== newHtml) {
// 有旧值,并且新旧值不同,才需要更新
result = true
}
// 没有旧值,或者新旧值一样,就无需更新

// 无论用户更不更新版本,都更新旧值,
// 这样当用户选择不更新时就不会再提示了
// 除非刷新页面
oldHtml = newHtml
return result
}

// 递归调用,10秒一次
function autoRefresh() {
setTimeout(async () => {
if (await needUpdate()&&!dia) {
dia=DialogPlugin.alert({
header: '提示',
body: '检测到有新版本,点击确定刷新',
onConfirm: () => {
dia.hide()
location.reload()
}
})
}
autoRefresh()
}, 10000)
}

// 判断环境,只有线上环境才会自动更新
if (process.env.NODE_ENV === 'production'){
autoRefresh()
}

入口文件导入

然后在入口文件main.js导入即可。

1
import "./autoUpdate"

结语

本篇文章就简单到这里了,更多内容敬请期待,债见~

上一篇:
【可视化学习】95-跳一跳小游戏(一)
下一篇:
浏览器Http的413报错