美文网首页
webpack、vite增加系统版本号插件,自动更新网页

webpack、vite增加系统版本号插件,自动更新网页

作者: LemonTree7 | 来源:发表于2023-12-13 19:16 被阅读0次

1、vite.config中增加版本号生成插件

在/src/utils文件夹中添加versionUpdatePlugin.ts文件

//简易Ts版
// versionUpdatePlugin.js
import fs from 'fs';
import path from 'path';
interface OptionVersion {
    version: number | string;
}
interface configObj extends Object {
    publicDir: string;
}

const writeVersion = (versionFileName: string, content: string | NodeJS.ArrayBufferView) => {
    // 写入文件
    fs.writeFile(versionFileName, content, (err) => {
        if (err) throw err;
    });
};

export default (options: OptionVersion) => {
    let config: configObj = { publicDir: '' };
    return {
        name: 'version-update',
        configResolved(resolvedConfig: configObj) {
            // 存储最终解析的配置
            config = resolvedConfig;
        },
        buildStart() {
            // 生成版本信息文件路径
            const file = config.publicDir + path.sep + 'version.json';
            // 这里使用编译时间作为版本信息
            const content = JSON.stringify({ version: options.version });
            if (fs.existsSync(config.publicDir)) {
                writeVersion(file, content);
            } else {
                fs.mkdir(config.publicDir, (err) => {
                    if (err) throw err;
                    writeVersion(file, content);
                });
            }
        },
    };
};

在vite.config中添加如下代码,编译的时候会是生成当前版本version.json文件在根目录

import versionUpdatePlugin from "./src/utils/versionUpdatePlugin";

//版本时间戳
const CurrentTimeVersion = new Date().getTime();
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  return {
    define: {
      // 定义全局变量
      "process.env.VITE__APP_VERSION__": CurrentTimeVersion,
    },
    plugins: [
      ...
    versionUpdatePlugin({
        version: CurrentTimeVersion,
      }),
    ]
  }
});

在/router/index.ts中添加版本监控代码

import axios from "axios";
// 版本监控
const versionCheck = async () => {
  if (import.meta.env.MODE === 'dev') return;
  if(!process.env.VITE__APP_VERSION__) return;
  const response = await axios.get(`${window.location.origin}/version.json`)
  // eslint-disable-next-line no-undef
  if (process.env.VITE__APP_VERSION__ !== response.data.version) {
    window.location.reload()
  }
}

router.afterEach(async (to, from, next) => {
  //在页面跳转之后如果更新版本了,就刷新当前页面
  //如果需要在跳转之前进行刷新,就在router.beforeEach中进行调用
  versionCheck();
});

在相应的环境(.env、.env.dev、.env.pro)里面添加版本参数

VITE__APP_VERSION__ = ''

2、webpack中添加versionUpdatePlugin插件

主要是部分项目vue2使用的vue.config,里面的打包工具用的webpack,为了兼容旧项目,增加了插件进行打包。
在/src/utils中添加versionUpdatePlugin.js插件

//简易版
// versionUpdatePlugin.js

const fs = require("fs");
const path = require("path");

const writeVersion = (versionFileName, content) => {
  // 写入文件
  fs.writeFile(versionFileName, content, (err) => {
    if (err) throw err;
  });
};

function versionUpdatePlugin(options) {
  this.options = options;
}

versionUpdatePlugin.prototype.apply = function (compiler) {
  console.log(compiler, "done", this.options);
  compiler.plugin("done", () => {
    let config = { publicDir: compiler.options.output.path };
    // 生成版本信息文件路径
    const file = config.publicDir + path.sep + "version.json";
    // 这里使用编译时间作为版本信息
    const content = JSON.stringify({ version: this.options.version });
    if (fs.existsSync(config.publicDir)) {
      writeVersion(file, content);
    } else {
      fs.mkdir(config.publicDir, (err) => {
        if (err) throw err;
        writeVersion(file, content);
      });
    }
  });
};

module.exports = versionUpdatePlugin;

在vue.config中添加

const versionUpdatePlugin = require("./src/utils/versionUpdatePlugin");
let timeStamp = new Date().getTime();

module.exports = {
  ...
  configureWebpack: (config) => {
    if(process.env.NODE_ENV === "development"){
      const plugins = [];
      // 版本
      plugins.push(
        new versionUpdatePlugin({
          version: timeStamp,
        })
      );
    }
  config.plugins = [...config.plugins, ...plugins];
  },
  chainWebpack(config) {
    config.plugin('define').tap(args => {
      args[0]['process.env'].APP_VERSION = `${timeStamp}`;
      return args
    });
  }
}

在/src/router/index.js中添加

import axios from "axios";
// 版本监控
const versionCheck = async () => {
  console.log('build time:', process.env.APP_VERSION, process.env.NODE_ENV === "development");
  if (process.env.NODE_ENV == "development") return
  const response = await axios.get('version.json')
  // eslint-disable-next-line no-undef
  if (process.env.APP_VERSION !== response.data.version) {
    window.location.reload()
  }
}

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

以上2种方法会在遇到版本不同时进行页面自动刷新。

附录:
https://blog.csdn.net/qq_39448719/article/details/106369224
https://blog.csdn.net/qwe134133987/article/details/127979312

相关文章

网友评论

      本文标题:webpack、vite增加系统版本号插件,自动更新网页

      本文链接:https://www.haomeiwen.com/subject/cxobgdtx.html