Skip to content

检测项目是否有新版发布

在Vue项目中,判断是否发布新包通常涉及到比较项目的某个版本号与服务器上的版本号是否一致,如果不一致就刷新页面更新为最新发布的代码。

vue2 检测新包

package.json:

"scripts": {
    build": "node ./src/utils/version/dynamicVersion.js && vue-cli-service build",
}

src/utils/version/dynamicVersion.js:

const fs = require('fs')
const path = require('path')

let versionPath = path.resolve(__dirname, '../../../public/version.json')

let versionData = {}
versionData.version = new Date().getTime()
// 写入
fs.writeFile(versionPath, JSON.stringify(versionData, null, '\t'), err => {
  err && console.log('记录打包', err)
})

在router.beforeEach时检测:

import axios from 'axios'

let VERSION_NAME
let url = ''

VERSION_NAME = 'test-version'
url = `//${window.location.host}/version.json`

axios.get(url + `?t=${new Date().getTime()}`).then(res => {
  if (res.status === 200) {
    let vueVersion = res.data.version
    let localVueVersion = localStorage.getItem(VERSION_NAME)
    localStorage.setItem(VERSION_NAME, vueVersion)
    if (localVueVersion && localVueVersion + '' !== 'undefined' && localVueVersion + '' !== vueVersion + '') {
      // alert('检测到新版本,请点击确认刷新页面哦')
      window.location.reload(true)
      return
    }
  }
}).catch((error) => {
  console.log(error)
})

vue3+vite 检测新包

vite.config.js:

alt text

src/plugins/refreshVersion.js:

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) => {
  // version.json 存储在public目录下
  let configPath
  return {
    name: 'refreshVersion',
    configResolved(resolvedConfig) {
      // version.json路径  ../xhh-project/public
      // console.log('运行环境', resolvedConfig.mode)
      configPath = resolvedConfig.publicDir
    },
    async buildStart() {
      // path.sep \
      const file = configPath + path.sep + 'version.json'
      const content = JSON.stringify({ version: options.version })
      // version.json已存在,修改
      if (fs.existsSync(configPath)) {
        writeVersion(file, content)
      } else {
        // 创建
        fs.mkdir(configPath, (err) => {
          if (err) throw err
          writeVersion(file, content)
        })
      }
    }
  }
}

src/permission.js:

router.beforeEach(async (to, from, next) => {
  // 是否上传了新版本
  await versionIsUpdate()

  ...
})
 
const versionIsUpdate = async () => {
  if (process.env.NODE_ENV === 'production') {
    const response = await axios.get(`//${window.location.host}/version.json`)
    // console.log('版本比较', __PROJECT_VERSION__, response.version)
    // 发布新版,页面刷新前__PROJECT_VERSION__是上个版本的version,response.version是最新打包的version
    if (__PROJECT_VERSION__ !== response.version) {
      console.log('检测到有新版本')
      setTimeout(() => {
        window.location.reload()
      })
    }
  }
}