Vue 项目每次发版后要清理浏览器缓存 问题

2023-07-04  本文已影响0人  IssunRadiance
打包的时候给每个打包文件后面加一个时间戳,通过vue.config.js配置
const path = require('path')
const webpack = require('webpack')
const timeStamp = new Date().getTime()
module.exports = {
  publicPath: './',
  // 打包的时候不使用hash值.因为我们有时间戳来确定项目的唯一性了.
  filenameHashing: false,
 
  // 将构建好的文件输出到哪里
  outputDir: 'dist',
  
  configureWebpack: { // 重点
    // 输出重构 打包编译后的js文件名称,添加时间戳.
    output: {
      filename: `js/[name].${timeStamp}.js`,
      chunkFilename: `js/chunk.[id].${timeStamp}.js`,
    }
  },
 
  css: { //重点.
    extract: { // 打包后css文件名称添加时间戳
      filename: `css/[name].${timeStamp}.css`,
      chunkFilename: `css/chunk.[id].${timeStamp}.css`,
    }
  }
}
先说一下单独解决这个问题的方法
// 在main.js中
/* 路由异常错误处理,尝试解析一个异步组件时发生错误,重新渲染目标页面 */
router.onError((error) => {
  const pattern = /Loading chunk (\d)+ failed/g;
  const isChunkLoadFailed = error.message.match(pattern);
  const targetPath = router.history.pending.fullPath;
  if (isChunkLoadFailed) {
    // 用路由的replace方法,
    // 并没有相当于F5刷新页面,
    // 失败的js文件并没有从新请求,
    // 会导致一直尝试replace页面导致死循环,
    // 而用 location.reload 方法,相当于触发F5刷新页面,
    // 虽然用户体验上来说会有刷新加载察觉,但不会导致页面卡死及死循环,
    // 从而曲线救国解决该问题
    window.location.reload();
    // router.replace(targetPath);
  } else {
    console.log('no')
  }
});
结合我们上面的问题,想到了一个新的解决方式,在打包的时候,文件名称不变,使用版本号。这样也可以实现每次打包发布后不需要强制清理缓存,又不会出现找不到文件的情况
configureWebpack: {
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    },
    output: {
      filename: `js/[name].js?v=${timeStamp}`,
      chunkFilename: `js/chunk.[id].js?v=${timeStamp}`,
    }
  },
  css: { 
    extract: { 
      filename: `css/[name].css?v=${timeStamp}`,
      chunkFilename: `css/chunk.[id].css?v=${timeStamp}`,
    }
  },

这样就可以啦!!!

上一篇 下一篇

猜你喜欢

热点阅读