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

打印 上一主题 下一主题

主题 1732|帖子 1732|积分 5196


前言

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

一、什么是浏览器缓存

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

打开 F12 进入 Sources 打开项目中的 static 文件中的 css 大概 js 就可以看到 每个文件后面都有一个时间戳 如: app.20240912143942.js 就是 2024年9月12日 打包的代码。

三、vue.config.js 代码


  • 压缩打包文件;
  • js 文件和 css 文件增长时间戳;
  1. const CompressionPlugin = require("compression-webpack-plugin");
  2. const version = dateFormat(new Date(),"yyyyMMddHHmmss");
  3. // 本地服务接口地址
  4. let target = "http://192.168.1.249", // 代理服务
  5. module.exports = {
  6.   //开发模式反向代理配置,生产模式请使用Nginx部署并配置反向代理
  7.   devServer: {
  8.     port: 2890,
  9.     proxy: {
  10.       "/api": {
  11.         target,
  12.         // 远程演示服务地址,可用于直接启动项目
  13.         ws: true, // 代理 websockets,配置这个参数
  14.         pathRewrite: {
  15.           "^/api": "",
  16.         },
  17.       },
  18.       "/blade-wwnetservice": { // 第三方接口调用接口
  19.         target: "http://192.168.1.249:1888"
  20.       },
  21.     },
  22.   },
  23.   //路径前缀
  24.   publicPath: "./",
  25.   outputDir: "dist",
  26.   assetsDir: "static",
  27.   lintOnSave: false, // 是否开启eslint保存检测
  28.   productionSourceMap: false, // 不会生成.map文件减小体积
  29.   transpileDependencies: [
  30.     "axios",
  31.     "vuex",
  32.     "vue-router",
  33.     "element-ui",
  34.     "compression-webpack-plugin",
  35.     "babel-polyfill",
  36.     "classlist-polyfill",
  37.     "vue",
  38.   ],
  39.   chainWebpack: config => {
  40.     //忽略的打包文件
  41.     config.externals({
  42.       "vue": "Vue",
  43.       "vue-router": "VueRouter",
  44.       "vuex": "Vuex",
  45.       "axios": "axios",
  46.       "element-ui": "ELEMENT"
  47.     });
  48.     const entry = config.entry("app");
  49.     entry.add("babel-polyfill").end(); //es6=>es5
  50.     entry.add("classlist-polyfill").end();
  51.     // entry.add('@/mock').end();
  52.     // 开启js、css压缩
  53.     if (process.env.NODE_ENV === "production") {
  54.          config.plugin("compressionPlugin").use(
  55.            new CompressionPlugin({
  56.              test: /\.js$|\.css/, // 匹配文件名
  57.              threshold: 10240, // 对超过10k的数据压缩
  58.              deleteOriginalAssets: true // 不删除源文件
  59.            })
  60.          );
  61.     }
  62.   },
  63.   configureWebpack: config => {
  64.     // 生产环境取消 console.log
  65.     if (process.env.NODE_ENV === "production") {
  66.       config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true;
  67.       // 为了浏览器不缓存静态资源,增加时间戳;
  68.       config.output.filename= 'static/js/[name].'+version+'.js';
  69.       config.output.chunkFilename= 'static/js/[name].'+version+'.js';
  70.     } else {
  71.       config.devtool = "source-map";
  72.     }
  73.   },
  74.   css: {
  75.     extract: { // 打包后css文件名称添加时间戳
  76.       filename: `static/css/[name].${version}.css`,
  77.       chunkFilename: `static/css/chunk.[id].${version}.css`,
  78.       ignoreOrder: true, // 编译时忽略排序
  79.     }
  80.   },
  81. };
  82. function dateFormat(date, format) {
  83.   format = format || 'yyyy-MM-dd HH:mm:ss';
  84.   if (date !== 'Invalid Date') {
  85.     let o = {
  86.       "M+": date.getMonth() + 1, //month
  87.       "d+": date.getDate(), //day
  88.       "H+": date.getHours(), //hour
  89.       "m+": date.getMinutes(), //minute
  90.       "s+": date.getSeconds(), //second
  91.       "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
  92.       "S": date.getMilliseconds() //millisecond
  93.     }
  94.     if (/(y+)/.test(format)) format = format.replace(RegExp.$1,(date.getFullYear() + "").substr(4 - RegExp.$1.length));
  95.     for (let k in o){
  96.       if (new RegExp("(" + k + ")").test(format)){
  97.         format = format.replace(RegExp.$1,RegExp.$1.length === 1 ? o[k] :("00" + o[k]).substr(("" + o[k]).length));
  98.       }
  99.     }
  100.     return format;
  101.   }
  102.   return '';
  103. }
复制代码
四、代码压缩部分服务器不支持

所以需要将这段代码表明大概删除。
  1. // 开启js、css压缩
  2. if (process.env.NODE_ENV === "production") {
  3.       config.plugin("compressionPlugin").use(
  4.            new CompressionPlugin({
  5.                 test: /\.js$|\.css/, // 匹配文件名
  6.                 threshold: 10240, // 对超过10k的数据压缩
  7.                 deleteOriginalAssets: true // 不删除源文件
  8.            })
  9.       );
  10. }
复制代码
五、感谢

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表