关于发版后如何自动清理缓存

标签: 清理 缓存 | 发表时间:2022-09-23 17:03 | 作者:饼干_
出处:https://juejin.cn/tag/%E6%9E%B6%E6%9E%84

theme: channing-cyan

前言

提到发版后如何自动清理缓存,大家都普遍都会想到配置nginx设置不缓存然后在配置打包生成hash值即可。但实际上据我本人亲测好像是没有用的(反正我试过不行T T),于是乎便产生了这篇文章。本文基于 vue 2.x 来进行配置。

思路

首先要知道怎么获取到最新版本,以及怎么判断客户端是旧版本。

服务端

我们知道,由 vue-cli 生成的项目中带有 public 文件夹,该文件夹下的文件不会被 webpack 处理,于是我们在该目录下新建一个 config.json 来存放我们的版本号:

image.png

这个 json 文件中大致是这个样:

  {
    "version": ""
}

有了这个文件后我们在 vue.config.js里配置一些东西,我们在每次打包后都会生成一个版本号存到 config.json中的 version属性里。

版本号的命名大家可以自行定义,但要保证版本号的唯一性。这里我使用了 git-revision-webpack-plugin这个插件,他可以获取到 git分支 + commit hash 等一些提交信息,利用这些信息我们组装成一个唯一的版本号:

  // vue.config.js
const gitRevisionPlugin = new GitRevisionPlugin();
const VERSION = `${gitRevisionPlugin.branch()}_${gitRevisionPlugin.version()}_${gitRevisionPlugin.commithash()}_${Timestamp}`;

组装完之后,我们写入 config.jsonversion里(完整代码):

  // vue.config.js
const path = require("path");
const fs = require("fs");
const gitRevisionPlugin = new GitRevisionPlugin();
const VERSION = `${gitRevisionPlugin.branch()}_${gitRevisionPlugin.version()}_${gitRevisionPlugin.commithash()}_${Timestamp}`;
const configJSON = require(resolve("public/config.json"));
const configFile = path.resolve(__dirname, "public/config.json");
fs.writeFileSync(
  configFile,
  JSON.stringify(
    {
      ...configJSON,
      version: VERSION,
    },
    null,
    2
  )
);

这样在每次发版时服务器上都会存有一个最新的版本号了,接下来我们看看客户端如何处理。

客户端

在客户端里,我们需要获取到服务器上的最新版本号以及客户端的版本号,我们新建一个文件 systemUpdate.js用来实现我们判断版本号的方法,通过 axios请求服务器上的 config.json获取最新版本号。之后将版本号存在 localStorage中,来更新版本号。等下次发版时再取出本地的版本号与服务器上的对比即可。

  import axios from "axios";

const getConfig = () => {
  return new Promise((resolve) => {
    axios
      .get(`/config.json`, {
        params: {
          _t: new Date().getTime(),
        },
      })
      .then((res) => {
        resolve(res.data);
      });
  });
};

export async function isNewVersion() {
  const config = await getConfig();
  let newVersion = config.version;
  let oldVersion = localStorage.getItem('version');
  let isUpdated = oldVersion !== newVersion;
  console.log('新版本号:', newVersion);
  console.log('旧版本号:', oldVersion);
  if (isUpdated) {
    // 如果version不一致,则清除本地基础数据
    localStorage.clear();
    localStorage.setItem("version", newVersion );
    window.location.reload(true);
    // do something ...

  }
  return isUpdated;
}

你可以在对比不一致后做你任何想做的事情。但一定要储存版本号以及刷新确保能获取到最新的资源。

判断时机

有了方法之后,接下来就是判断时机。这里我是在路由切换后进行新旧版本判断,我们来到定义 vue-router的地方通过设置钩子守卫来判断新旧版本。

  import { isNewVersion } from "@/utils/systemUpdate";

router.afterEach(async (to, from, next) => {
  if (to.meta.requireAuth) {
      // do something ...
      isNewVersion();
  }
});

接下来就是在本地跑起你的项目试验一下啦,当版本号不一致时会即刻刷新:

image.png

结尾

创作不易,大家动动小手,点个赞啦~ 有疑问咱们评论区见~

相关 [清理 缓存] 推荐:

关于发版后如何自动清理缓存

- - 掘金 架构
提到发版后如何自动清理缓存,大家都普遍都会想到配置nginx设置不缓存然后在配置打包生成hash值即可. 但实际上据我本人亲测好像是没有用的(反正我试过不行T T),于是乎便产生了这篇文章. 本文基于 vue 2.x 来进行配置. 首先要知道怎么获取到最新版本,以及怎么判断客户端是旧版本. 我们知道,由 vue-cli 生成的项目中带有 public 文件夹,该文件夹下的文件不会被 webpack 处理,于是我们在该目录下新建一个 config.json 来存放我们的版本号:.

缓存算法

- lostsnow - 小彰
没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率. 我是LRU缓存算法,我把最近最少使用的缓存对象给踢走. 我总是需要去了解在什么时候,用了哪个缓存对象.

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.

hibernate缓存,一级缓存,二级缓存,查询缓存

- - CSDN博客推荐文章
1、缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间. 2、ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则直接使用,避免数据库调用的开销. 事务级缓存:当前事务范围内的数据缓存. 应用级缓存:某个应用中的数据缓存. 分布式缓存:多个应用,多个JVM之间共享缓存.

缓存相关——缓存穿透、缓存并发、缓存失效、缓存预热、缓存雪崩、缓存算法

- - 编程语言 - ITeye博客
我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回. 这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了. 要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞.

Hibernate 二级缓存

- - CSDN博客推荐文章
很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了. 我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化. hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了.

App缓存管理

- - ITeye博客
无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户. Android的apk可以说是作为小型应用,其中99%的应用并不是需要实时更新的,而且诟病于蜗牛般的移动网速,与服务器的数据交互是能少则少,这样用户体验才更好,这也是我们有时舍弃webview而采用json传输数据的原因之一.

关于缓存(上)

- - 搜索技术博客-淘宝
商业世界中常说的一句话是“现金为王”. 在技术世界里,与之相近的一个说法是“缓存为王”. 缓存在构建高性能web站点中有着举足轻重的作用, sql优化, 算法优化所带来的效果可能远远不如缓存带来的优化效果. 但是缓存的使用并不是零成本的,首先的一个问题是,任何缓存的增加,都会带来两大问题:. 解决这两个问题需要以下一些方法,首先是去掉缓存.

HTTP缓存算法

- - PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间
HTTP协议缓存的目标是去除许多情况下对于发送请求的需求和去除许多情况下发送完整请求的需求. 以不发送请求或减少请求传输的数据量来优化整个HTTP架构,此目标的实现可以产生如下好处:. 降低对原始服务器的请求量. 减少了传送距离,降低了因为距离而产生的时延. 缓存基本处理过程包括七个步骤. 接收 – 缓存从网络中读取抵达的请求报文.