vue2 打包时增加时间戳防止浏览器缓存,打包后文件进行 js、css 压缩


前言

vue 开发过程中,项目前端代码需要更新,更新后由于浏览器缓存导致代码没有及时更新所产生错误,所以在打包时增加时间戳防止浏览器缓存。还有另一个好处是增加时间戳可以看到是什么时间打包的代码,防止运维偷懒 没更新甩锅。


一、什么是浏览器缓存

浏览器缓存 是指浏览器将网站资源(如图片、CSS、JS等文件)保存在本地,以便在用户再次访问同一网站时可以更快地加载页面。浏览器缓存可以分为强缓存和协商缓存两种类型。强缓存是浏览器直接从本地缓存中读取资源,而不向服务器发送请求,从而加快页面加载速度。协商缓存则是在强缓存失效时浏览器向服务器发起请求,服务器会验证资源的最新状态,并返回给浏览器是否可以使用缓存的响应。

二、展示效果

打开 F12 进入 Sources 打开项目中的 static 文件中的 css 或者 js 就可以看到 每个文件后面都有一个时间戳 如: app.20240912143942.js 就是 2024年9月12日 打包的代码。
在这里插入图片描述

三、vue.config.js 代码

  1. 压缩打包文件;
  2. js 文件和 css 文件增加时间戳;

const CompressionPlugin = require("compression-webpack-plugin");
const version = dateFormat(new Date(),"yyyyMMddHHmmss");

// 本地服务接口地址
let target = "http://192.168.1.249", // 代理服务
module.exports = {
  //开发模式反向代理配置,生产模式请使用Nginx部署并配置反向代理
  devServer: {
    port: 2890,
    proxy: {
      "/api": {
        target,
        // 远程演示服务地址,可用于直接启动项目
        ws: true, // 代理 websockets,配置这个参数
        pathRewrite: {
          "^/api": "",
        },
      },
      "/blade-wwnetservice": { // 第三方接口调用接口
        target: "http://192.168.1.249:1888"
      },
    },
  },
  //路径前缀
  publicPath: "./",
  outputDir: "dist",
  assetsDir: "static",
  lintOnSave: false, // 是否开启eslint保存检测
  productionSourceMap: false, // 不会生成.map文件减小体积
  transpileDependencies: [
    "axios",
    "vuex",
    "vue-router",
    "element-ui",
    "compression-webpack-plugin",
    "babel-polyfill",
    "classlist-polyfill",
    "vue",
  ],
  chainWebpack: config => {
    //忽略的打包文件
    config.externals({
      "vue": "Vue",
      "vue-router": "VueRouter",
      "vuex": "Vuex",
      "axios": "axios",
      "element-ui": "ELEMENT"
    });
    const entry = config.entry("app");
    entry.add("babel-polyfill").end(); //es6=>es5
    entry.add("classlist-polyfill").end();
    // entry.add('@/mock').end();
    // 开启js、css压缩
    if (process.env.NODE_ENV === "production") {
         config.plugin("compressionPlugin").use(
           new CompressionPlugin({
             test: /\.js$|\.css/, // 匹配文件名
             threshold: 10240, // 对超过10k的数据压缩
             deleteOriginalAssets: true // 不删除源文件
           })
         );
    }
  },
  configureWebpack: config => {
    // 生产环境取消 console.log
    if (process.env.NODE_ENV === "production") {
      config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true;
      // 为了浏览器不缓存静态资源,增加时间戳;
      config.output.filename= 'static/js/[name].'+version+'.js';
      config.output.chunkFilename= 'static/js/[name].'+version+'.js';
    } else {
      config.devtool = "source-map";
    }
  },
  css: {
    extract: { // 打包后css文件名称添加时间戳
      filename: `static/css/[name].${version}.css`,
      chunkFilename: `static/css/chunk.[id].${version}.css`,
      ignoreOrder: true, // 编译时忽略排序
    }
  },
};

function dateFormat(date, format) {
  format = format || 'yyyy-MM-dd HH:mm:ss';
  if (date !== 'Invalid Date') {
    let o = {
      "M+": date.getMonth() + 1, //month
      "d+": date.getDate(), //day
      "H+": date.getHours(), //hour
      "m+": date.getMinutes(), //minute
      "s+": date.getSeconds(), //second
      "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
      "S": date.getMilliseconds() //millisecond
    }
    if (/(y+)/.test(format)) format = format.replace(RegExp.$1,(date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (let k in o){
      if (new RegExp("(" + k + ")").test(format)){
        format = format.replace(RegExp.$1,RegExp.$1.length === 1 ? o[k] :("00" + o[k]).substr(("" + o[k]).length));
      }
    }
    return format;
  }
  return '';
}

四、代码压缩部分服务器不支持

所以需要将这段代码注释或者删除。

// 开启js、css压缩
if (process.env.NODE_ENV === "production") {
      config.plugin("compressionPlugin").use(
           new CompressionPlugin({
                test: /\.js$|\.css/, // 匹配文件名
                threshold: 10240, // 对超过10k的数据压缩
                deleteOriginalAssets: true // 不删除源文件
           })
      );
}

五、感谢

如果觉得有用欢迎点赞关注收藏。
有问题私信我!!~~
谢谢

<think>嗯,用户现在问的是Vue打包发布后的缓存问题。我需要先理解这个问题的背景。通常来说,当开发者用Vue构建应用,打包发布后,浏览器可能会缓存静态资源,导致用户看不到最新的版本。这确实是一个常见的问题,特别是当更新频繁的候。 首先,我得回忆一下Vue打包机制。Vue CLI默认会在生成的文件名中添加哈希值,比如app.123abc.js。这个哈希是根据文件内容生成的,如果内容没变,哈希不变,浏览器就会用缓存。但用户可能没有正确配置,或者服务器设置有问题,导致缓存策略不当。 接下来,用户可能遇到的症状是,即使部署了新版本,用户还是看到旧版,因为浏览器还在用缓存的旧文件。这候需要解决方法,比如修改文件名哈希、配置服务器头,或者使用版本控制。 然后,我需要考虑不同的解决方案。常见的包括利用Vue的哈希文件名,配置Webpack的output,使用HTML的meta标签禁止缓存,或者通过服务端配置缓存策略。另外,用户可能还不太清楚如何验证是否生效,所以需要指导他们如何检查。 还要注意用户可能的误区,比如以为改版本号就能解决问题,但实际上浏览器缓存可能还是根据文件名来的。另外,如果用户没有正确配置服务器,比如Nginx或Apache的缓存头设置,也会导致问题。 可能用户已经尝试过一些方法但没成功,比如没有正确设置Cache-Control头部,或者哈希没有正确生成。这候需要详细说明每一步的正确做法,并强调服务器配置的重要性。 另外,用户可能想知道如何自动化版本管理,比如结合CI/CD流程,或者在构建自动生成版本号。这部分内容虽然高级,但对于持续部署的场景很重要,应该提到。 最后,要确保回答结构清晰,分点列出解决方案,并给出具体的配置示例,比如Webpack的配置修改,Nginx的配置片段,这样用户可以直接参考应用。同提醒注意事项,比如哈希策略的原理,避免重复劳动,以及用户可能需要根据实际情况调整缓存间。</think>以下是针对 Vue 项目打包发布后缓存问题的完整解决方案,包含原理分析和具体实践步骤: --- ### 一、缓存问题现象 - **用户端表现**:部署新版本后,用户仍看到旧版页面 - **根本原因**:浏览器缓存了旧版静态资源(JS/CSS/字体等) - **典型场景**: 1. 文件名未变化导致强缓存生效 2. 服务器配置了过长的缓存策略 3. index.html 未配置禁用缓存 --- ### 二、核心解决方案 #### 方案 1:文件名哈希策略(Vue CLI 默认方案) ```javascript // vue.config.js module.exports = { filenameHashing: true, // 默认开启 configureWebpack: { output: { filename: '[name].[contenthash:8].js', chunkFilename: '[name].[contenthash:8].js' } } } ``` **原理**:根据文件内容生成唯一哈希,文件变化哈希值自动更新 --- #### 方案 2:HTML 文件禁用缓存 ```nginx # Nginx 配置示例 location = /index.html { add_header Cache-Control "no-cache, no-store, must-revalidate"; add_header Pragma "no-cache"; add_header Expires 0; } ``` **原理**:强制浏览器每次请求都校验 HTML 文件的新鲜度 --- #### 方案 3:版本号注入(推荐组合方案) ```javascript // main.js const version = process.env.VUE_APP_VERSION || Date.now(); __webpack_public_path__ = `/static/${version}/`; ``` 打包注入版本号: ```bash VUE_APP_VERSION=2.0.1 npm run build ``` --- ### 三、Webpack 进阶配置 #### 1. 提取 Manifest 防止 chunk 缓存 ```javascript // vue.config.js module.exports = { chainWebpack: config => { config.optimization.runtimeChunk('single'); } } ``` #### 2. 分割稳定依赖 ```javascript configureWebpack: { optimization: { splitChunks: { cacheGroups: { vendor: { test: /[\\/]node_modules[\\/](vue|vue-router|vuex)[\\/]/, name: 'vendors', chunks: 'all' } } } } } ``` --- ### 四、服务器配置示例 #### Nginx 最佳实践 ```nginx # 静态资源长期缓存 location /static/ { alias /path/to/dist/static/; expires 365d; add_header Cache-Control "public"; } # HTML 文件禁用缓存 location / { try_files $uri $uri/ /index.html; expires -1; add_header Cache-Control "no-cache"; } ``` --- ### 五、自动化部署方案 #### 1. 结合 CI/CD 的版本管理 ```yaml # GitLab CI 示例 build: stage: build script: - VUE_APP_VERSION=$(date +%s) # 使用时间戳作为版本号 - npm run build artifacts: paths: - dist/ ``` #### 2. 清除旧版本资源 ```bash # 保留最近 5 个版本 ls -dt /var/www/app/static/* | tail -n +5 | xargs rm -rf ``` --- ### 六、验证与调试方法 1. **浏览器 Network 面板**: - 检查文件是否携带新哈希值 - 查看响应头 `Cache-Control` 和 `ETag` 2. **CURL 命令验证**: ```bash curl -I https://example.com/static/js/app.abc123.js ``` 3. **缓存清除测试**: ```javascript // 强制刷新方案 window.addEventListener('load', () => { if (window.performance.navigation.type === 1) { // 普通刷新 window.location.reload(true) // 强制清除缓存 } }) ``` --- ### 七、注意事项 1. **CDN 缓存**:需配置 CDN 刷新机制 2. **Service Worker**:需处理更新逻辑 ```javascript // sw.js self.addEventListener('install', (event) => { self.skipWaiting(); // 强制激活新 Service Worker }); ``` 3. **版本回滚**:保留历史版本静态文件目录 --- 通过组合使用文件名哈希、版本控制和服务端配置,可有效解决 Vue 项目的缓存问题。建议生产环境采用:**HTML 文件禁用缓存 + 静态资源长期缓存 + 自动化版本管理**的综合策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值