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

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

时间:2023-04-12 14:14:26浏览次数:47  
标签:contenthash 文件 缓存 hash js 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,js,vue,线上,哈希
From: https://www.cnblogs.com/never404/p/17309582.html

相关文章

  • 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发
    @目录发送验证码登录退出登录界面控件获取用户信息功能项目地址前端代码的框架采用vue.js+elementUI这套较为简单的方式实现,以及typescript语法更方便阅读。首先添加全局对象:loginForm:登录表单对象twoFactorData:两步验证数据,showTwoFactorSuccess:是否显示两步验证成......
  • Vue3+element-plus封装文字超出一行,省略号显示,鼠标悬浮展示全部
    1.组件封装<template><el-tooltipeffect="dark":disabled="isShowTooltip":content="content"placement="top"><p:class="['line1',className]"@mouseover="onMouseOver(refNa......
  • Vue.js 路由的props配置
    视频index.js(解构赋值,连续解构赋值)Message.vue7.路由的props配置​ 作用:让路由组件更方便的收到参数{ name:'xiangqing', path:'detail/:id', component:Detail, //第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件 //pr......
  • vue属性之监听属性(watch)
    目录简介语法示例简介当一个变量的值发生变化时,执行对应的函数语法#在属性中添加watch属性,并以需要监听变量的名字进行定义函数data:{show:'abc'}watch:{show(){我是函数内容}}示例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • vue项目通过外部配置文件读取接口地址- 在webpack-index.html模板中使用环境变量
    概述:在index.html模板中判断当前环境,处于开发环境下时读取process环境变量、处于生产环境下时读取根目录配置文件(./config.js),两种环境下将配置统一挂载到window全局变量上(SET_CONFIG)config.jswindow.SITE_CONFIG={appTitle:'系统测试',version:'1.0.0',apiURL:''......
  • vue之组件
    目录简介全局组件语法示例局部组件语法示例组件间通信父子页面通信之父传子语法示例组件通信之子传父语法示例使用ref进行父子组件通信方法示例动态组件(component)普通方法实现使用组件component实现动态组件相关keep-alive组件之插槽(slot)匿名插槽具名插槽简介组件(component......
  • web网站使用indexedDB缓存大数量案例
    前言及背景indexedDB是html5标准引入的web数据持久化方案之一,现代浏览器大多按照标准对其进行了实现,我在新的项目中用到它来作为持久化数据存储,由于最近在web端项目,每次web前端需要实时计算中间成果预计18G的中间过度数据,预计最终每次生成200M以上的结果数据,在此过程耗时30多......
  • 1.Vue的基本原理
    当一个Vue实例创建时,Vue会遍历data中的属性,用Object.defineProperty(vue3.0使用proxy)将它们转为getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的watcher程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用时,会......
  • Vue3快速上手
    Vue3快速上手1.Vue3简介2020年9月18日,Vue.js发布3.0版本,代号:OnePiece(海贼王)耗时2年多、2600+次提交、30+个RFC、600+次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/releases/tag/v3.0.02.Vue3带来了什么1.性能的提升打包大小减少41%初次......
  • 1.Vue的基本原理
    当一个Vue实例创建时,Vue会遍历data中的属性,用Object.defineProperty(vue3.0使用proxy)将它们转为getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的watcher程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用......