首页 > 其他分享 >vue项目中发布新版本线上自动清缓存

vue项目中发布新版本线上自动清缓存

时间:2023-04-17 15:09:51浏览次数:38  
标签:contenthash 文件 缓存 hash 占位 vue 线上 哈希

背景

最近项目更新频繁,每次一更新客户都说还跟之前的一样。一查原因是因为客户没有清空浏览器的缓存。所以为了方便客户看到最新版本,开始调研再发布新版本后自动清理缓存。

方案

每次打包后的js和css都加上hash值后缀。当文件发生改变时,hash值也改变。这样就不会走缓存

举个例子

vue.config.js

const path = require("path"); // 获取当前的时间戳
module.exports = {
  publicPath: "./",
  filenameHashing: false, 
  configureWebpack: {    
    output: { 
      filename: `js/js[name].[hash].js`, //hash可替换为contenthash 下面同理
      chunkFilename: `js/chunk.[id].[hash].js`,
    }
  },
  // css: {  这个可要可不要
  //   extract: { 
  //     filename: `css/[name].[hash].css`,
  //     chunkFilename: `css/chunk.[id].[hash].css`,
  //   }
  // }
};

上述配置中,我们使用了[hash]占位符来为文件名添加一个基于内容的哈希值。这样,每次发布新版本时,文件名会随之改变,从而强制浏览器重新下载和缓存新的文件。

注意,这种方法只适用于JavaScript文件和CSS文件。如果你想清除其他类型的缓存,如图片、字体等,可以使用workbox-webpack-plugin插件来生成Service Worker,并在其中添加缓存管理逻辑。你可以在vue.config.js文件中添加以下配置来使用该插件:

const { GenerateSW } = require('workbox-webpack-plugin');

module.exports = {
  // ...其他配置

  configureWebpack: {
    plugins: [
      new GenerateSW({
        // ...缓存管理逻辑
      })
    ]
  }
}

使用workbox-webpack-plugin需要一定的Service Worker基础知识,如果你不熟悉该插件的使用方法,建议先查阅相关文档。

相关说明

contenthash 和 hash有什么区别?

hash和contenthash都是Webpack中用于生成唯一哈希值的占位符,它们的主要区别在于生成哈希的依据不同。

hash是根据整个项目的构建情况生成的哈希值,也就是说,只要项目中任意一个文件发生变化,生成的哈希值就会发生改变。这意味着,如果你在项目中有多个入口文件或者多个chunk,那么它们都会使用同一个hash占位符,生成的哈希值也会相同。因此,hash通常用于项目的整体构建过程中,用于区分不同版本的构建结果。

contenthash则是根据文件的内容生成的哈希值,也就是说,只要文件内容发生变化,生成的哈希值就会发生改变。这意味着,如果你在项目中使用了contenthash占位符,那么每个文件都会生成独立的哈希值,不受其他文件的影响。因此,contenthash通常用于文件级别的缓存控制中,用于强制浏览器重新下载和缓存新的文件,而不是重复使用旧的缓存文件。

在实际开发中,建议根据具体需求选择合适的哈希占位符。如果你需要在整个项目构建过程中保持哈希值的一致性,可以使用hash占位符;如果你需要对每个文件进行独立的缓存控制,可以使用contenthash占位符。在Vue项目中,通常使用[contenthash]占位符来对JavaScript和CSS文件进行独立的缓存控制,从而实现自动清除缓存的效果。

图片资源如何打包添加hash值

module.exports = {
  output: {
    publicPath: '/assets/'
  },
  module: {
    rules: [
      {
        test: /\.(png|jpe?g|gif|svg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 8192,
              name: '[name].[hash:8].[ext]',
              outputPath: 'assets/'
            }
          }
        ]
      }
    ]
  }
};

在这个例子中,url-loader将所有小于等于8KB的图片资源转换成Base64编码的字符串,并将其嵌入到JavaScript或CSS文件中,而大于8KB的图片资源则会被输出到/assets目录中,并且其文件名包含哈希值,以避免浏览器缓存问题。最后,output.publicPath指定了图片资源的URL路径为/assets/。

长风破浪会有时,直挂云帆济沧海



标签:contenthash,文件,缓存,hash,占位,vue,线上,哈希
From: https://blog.51cto.com/u_15726982/6195160

相关文章

  • 缓存一致性设计思路
    目录Spring注解使用,控制Redis缓存更新缓存一致性问题是如何产生的?双更新模式:操作不合理,导致数据一致性问题“后删缓存”,能解决多数不一致大厂高并发,“后删缓存”依旧不一致如何解决高并发的不一致问题?延迟双删与闪电缓存如何解决缓存击穿?读操作互斥与集中更新Redis是现......
  • vue-router
    ###################npminstallvue-router                                  <router-linkto="/user"tag="button"active-class="active"exact>GotoUserPage</router-link>这个例子中,当用户点击按钮时,会跳转到/user路由,并且按钮会添......
  • vue之插槽
    #######################                    #########################......
  • Vue开发规范
    ###############################有赞:https://github.com/youzan/vanthttps://github.com/iview/iviewhttps://github.com/ElemeFE/elementhttps://github.com/JosephusPaye/Keen-UIhttps://github.com/ElemeFE/mint-uihttps://github.com/museui/muse-uihttps://github.com/yo......
  • 【vue3-element-admin】Husky + Lint-staged + Commitlint + Commitizen + cz-git 配
    前言本文介绍vue3-element-admin如何通过Husky+Lint-staged+Commitlint+Commitizen+cz-git来配置Git提交代码规范。核心内容是配置Husky的pre-commit和commit-msg两个钩子:pre-commit:Husky+Lint-staged整合实现Git提交前代码规范检测/格式化(前提......
  • Vue3中 如何使用ref标签,对组件进行操作
    在Vue2中一般用this.$ref.xxxx进行获取组件对象Vue3中就不使用这个方法了例如:<el-uploadclass="upload-demo"action="":http-request="handleUpload":on-change="handleChange":before-upload="handl......
  • vue3中使用ref语法糖
    自从引入组合式API的概念以来,一个主要的未解决的问题就是ref和响应式对象到底用哪个。响应式对象存在解构丢失响应性的问题,而ref需要到处使用.value则感觉很繁琐,并且在没有类型系统的帮助时很容易漏掉.value写法优化以上是官方原话。大概就是新的语法糖可以让我们......
  • 安装vue-lic
    vue-cli是Vue.js开发的标准工具。它简化了程序员基于webppack创建工程化的Vue项目的过程。引用自vue-cli官网上的一句话:程序员可以专注在撰写应用上,而不必花好几天去纠结\webpack配置的问题。安装和使用(1)确保电脑已经安装了node.js,如果不确定自己是否安装了node,可以在cmd命令......
  • Vue3 vue-cli创建工程的工程结构分析
    视频不能用vue2的写法了componentsHelloWorld.vue<template><divclass="hello"><h1>{{msg}}</h1><p>Foraguideandrecipesonhowtoconfigure/customizethisproject,<br>checkoutthe......
  • vue中开启https
    vue2.0中项目工程根目录下,找到文件 vue.config.js。设置 module.exports.devServer.https:true项目工程根目录下,找到文件vue.config.js。设置module.exports.devServer.https:truemodule.exports={productionSourceMap:false,configureWebpack:{devt......