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

vue,项目,发布,新版,本线,自动,缓存 · 浏览次数 : 246

小编点评

**方案概述** 1. 在每次更新项目时,自动清理浏览器缓存。 2. 为 JavaScript 和 CSS 文件添加 hash 值的后缀。 3. 当文件发生改变时,hash 值会改变,强制浏览器重新下载和缓存新的文件。 **hash 和 contenthash 的区别** * **hash**:基于项目构建情况生成的哈希值,每个文件都会使用相同的哈希值。 * **contenthash**:基于文件的内容生成的哈希值,每个文件都会生成独立的哈希值。 **使用 case** * **hash**:适用于项目的整体构建过程中,用于区分不同版本的构建结果。 * **contenthash**:适用于文件级别的缓存控制中,用于强制浏览器重新下载和缓存新的文件。 **具体配置** ```js // vue.config.js const path = require("path"); 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/", }, }, ], }, ], }, }; ``` **其他注意事項** * 为了确保缓存的准确性,请确保在每次更新之前清理浏览器缓存。 * 可以根据实际需求选择合适的哈希占位符。 * 可以使用 `workbox-webpack-plugin` 来管理其他类型的缓存。

正文

背景

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

方案

每次打包后的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/。

与vue项目中发布新版本线上自动清缓存相似的内容:

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

背景 最近项目更新频繁,每次一更新客户都说还跟之前的一样。一查原因是因为客户没有清空浏览器的缓存。所以为了方便客户看到最新版本,开始调研再发布新版本后自动清理缓存。 方案 每次打包后的js和css都加上hash值后缀。当文件发生改变时,hash值也改变。这样就不会走缓存 举个例子 vue.confi

手摸手带你初探Vue 3.0

距离Vue 3.0正式发布已经过去一段时间了,2月7日Vue团队正式宣布Vue 3正式成为新的默认版本。最近接触的新项目也使用Vue 3.0来开发,因此有必要对它进行一波总结和学习。

使用 docker 打包构建部署 Vue 项目,一劳永逸解决node-sass安装问题

> 文章源于 Jenkins 构建 Vue 项目失败,然后就把 node_modules 删了重新构建发现 node-sass 安装不上了,折腾一天终于可以稳定构建了。 > 犹记得从学 node 的第一天,就被 node-sass 折磨了一整天,后面本地没问题了然后服务器开始折磨了,这次又遇到,尝试

我的第一个项目(四):(前端)发送请求以及表单校验

好家伙,本篇将继续完善前端界面 效果展示: 1.注册登陆 (后端已启动) 2.注册表单验证 (前端实现的表单验证) 在此之前: 我的第一个项目(二):使用Vue做一个登录注册界面 - 养肥胖虎 - 博客园 (cnblogs.com) 后端部分: 我的第一个项目(三):注册登陆功能(后端) - 养肥胖

浅入深出的微前端MicroApp

本文是由最近做的一个项目有感而发,因为之前做了一些技术栈的统一,为了用ant Design的pro-table,PC统一使用react,但是我们有一些老的项目是vue的,本次新页面较多,老页面的改动较少,除此之外老项目想换菜单,因此我们想借助本次机会用react开发,经过了几番思考,发现本次很适合用...

『手撕Vue-CLI』完善提示信息

前言 经过『手撕Vue-CLI』自动安装依赖,已经实现了自动安装依赖的功能。 然而,虽然项目已复制并安装依赖,但其提示信息并不够友好,于是我试着去运行了一下vue create,发现其提示信息是这样的: 于是我决定完善提示信息,也借此机会完善一下项目的代码,变量命名等。 完善提示信息 完善变量命名

Vue简单自定义Canvas验证码组件。

在您的Vue项目中,是否曾遇到过需要增加验证码来增强账户安全性的情况?这个Vue通用Canvas验证码组件!采用Canvas,实现了高度自定义和灵活的验证码生成方式,让您的网站或应用轻松应对各类验证码需求。

如何在现有的Vue项目中嵌入 Blazor项目?

目前官方只提供了angular和react俩种示例,所以本教程将来讲解如何在Vue的现有项目中使用,上期已经做好了react的教材! 准备流程 Vue 项目创建流程 使用Vue创建一个Demo项目 全部选择默认No即可 然后项目名称就用demo了 npm init vue@latest cd dem

Vue 3与ESLint、Prettier:构建规范化的前端开发环境

这篇文章介绍了如何在Vue 3项目中配置ESLint和Prettier以统一代码风格,实现代码规范性与可读性的提升。通过设置规则、解决冲突、以及将配置融入持续集成流程和代码审查过程,确保团队协作时代码风格的一致性,提升开发效率与项目维护性。

Vue微前端架构与Qiankun实践理论指南

这篇文章介绍了微前端架构概念,聚焦于如何在Vue.js项目中应用Qiankun框架实现模块化和组件化,以达到高效开发和维护的目的。讨论了Qiankun的原理、如何设置主应用与子应用的通信,以及如何解决跨域问题和优化集成过程,从而实现前端应用的灵活扩展与组织。