- const { writeFile, mkdir, existsSync } = require('fs')
- // 动态生成版本号
- const createVersion = () => {
- // mkdir('./dist', { recursive: true }, (err) => {
- //检测dist目录是否存在
- if (existsSync('./dist')) {
- writeFile(`./dist/version.json`, `{"version":"${Date.now()}"}`, (err) => {
- if (err) {
- console.log('写入version.json失败')
- console.log(err)
- } else {
- console.log('写入version.json成功')
- }
- })
- } else {
- setTimeout(createVersion, 1000)
- }
- // })
- }
- setTimeout(createVersion, 10000)
以下两种方式都需要在vue.config.js里加上上面这段代码
第一种
- // auto-update.js
- /*
- * @Description: 自动更新
- */
-
- import Vue from 'vue'
- import Modal from './updateModal.vue'
-
- let currentVersion // 当前版本
- let hidden = false // 页面是否隐藏
- let setTimeoutId
-
- // 获取版本号
- const getVersion = async () => {
- return fetch(process.env.VUE_APP_BASE_URL + 'version.json?timestep=' + Date.now()).then(res => res.json())
- }
-
- // 检查更新
- const checkUpdate = async () => {
- const version = (await getVersion()).version
- if (Number(version) > Number(currentVersion)) {
- const result = confirm('发现新版本,点击确定更新')
-
- if (result) {
- location.reload() // 刷新当前页
- }
-
- }
- }
-
- // 自动更新
- const autoUpdate = async () => {
- setTimeoutId = setTimeout(async () => {
- console.log(setTimeoutId, '这是个检查自动更新的定时器')
- // 页面隐藏了就不检查更新
- if (!hidden) {
- checkUpdate()
- }
- autoUpdate()
- }, 10 * 1000)
- }
-
- // 停止检测更新
- const stop = () => {
- if (setTimeoutId) {
- clearTimeout(setTimeoutId)
- setTimeoutId = ''
- }
- }
-
- // 开始检查更新
- const start = async () => {
- currentVersion = (await getVersion()).version
- autoUpdate()
- // 监听页面是否隐藏
- document.addEventListener('visibilitychange', () => {
- console.log(document.hidden, '能监听到啥')
- hidden = document.hidden
- if (hidden) {
- stop()
- } else {
- checkUpdate()
- autoUpdate()
- }
- })
- }
-
- export default { start }
第二种
- // update.worker.js, 我放在了public下
-
- let currentVersion // 当前版本
- let hidden = false // 页面是否隐藏
- let setIntervalId
-
- // 获取版本号
- const getVersion = async () => {
- // return fetch('http://localhost:8080/version.json?timestep=' + Date.now()).then(res => res.json())
- // const url = window.location.origin // 无法读取window
- return fetch('https://xxxx.com/version.json?timestep=' + Date.now()).then(res => res.json(), { cache: 'no-store' })
- }
-
- // 检查更新
- const checkUpdate = async () => {
- let isUpdate = false
- const version = (await getVersion()).version
- if (Number(version) > Number(currentVersion)) {
- console.log('发现新版本,点击确定更新--update.worker.js')
- return (isUpdate = true)
- } else {
- return (isUpdate = false)
- }
- }
-
- // 停止检测更新
- const stop = () => {
- if (setIntervalId) {
- clearInterval(setIntervalId)
- setIntervalId = ''
- }
- }
-
- self.onmessage = async event => {
- var data = event.data
- currentVersion = (await getVersion()).version
-
- if (data.pageVisibility) {
- stop()
- return
- }
-
- setIntervalId = setInterval(async () => {
- const isUpdate = await checkUpdate()
- if (isUpdate) {
- stop()
- self.postMessage({
- isUpdate: true
- })
- }
- }, 5 * 1000)
-
- console.log(data, '子线程worker.js')
- }
随便一个全局文件里使用下面代码
- var worker = new Worker('http://localhost:8080/update.worker.js')
- const url = window.location.origin
- var worker = new Worker(url + 'update.worker.js')
- // var worker = new Worker('/update.worker.js')
- let data = { pageVisibility: false }
- worker.postMessage(data)
- worker.onmessage = function(event) {
- console.log(event.data, 'worker主线程1')
-
- if (event.data?.isUpdate) {
- // const result = confirm('发现新版本,点击确定更新')
- // if (result) {
- // // location.reload(true) // 刷新当前页
- // // window.location.reload(true)
- // window.location.replace(window.location.href)
- // }
- Notification({
- title: '页面更新提示',
- message: '网页内容有更新,请按shift+F5刷新页面',
- duration: 0,
- type: 'success',
- onClose: () => {}
- })
- worker.terminate()
- }
- }
-
- worker.onerror = function(event) {
- console.log(event)
- // console.error(event.filename + ':' + event.message)
- //如果发生错误,立即终止代码
- worker.terminate()
- }
-
- // 监听页面是否隐藏
- document.addEventListener('visibilitychange', () => {
- console.log(document.hidden, '能监听到啥-html')
- let hidden = document.hidden
- data.pageVisibility = hidden
- })