在SPA模式网页版本检测方案

简介: 在SPA模式网页版本检测方案


背景



由于在spa模式的应用中页面的内容变化不再引起整个页面的重新加载,故需要解决在spa模式的应用中网页在使用的过程中服务器已更新的资源不能被及时的获取的问题。


解决思路



  1. 标记版本:
  1. vue.config.js中每次编译生成一个版本号
  2. 使用html-webpack-plugin插件将版本号插入到index.htmlmate标签
  3. webpack编译结束生成附带版本号的version.json文件放置到服务器
  1. 检测版本
  1. 通过document.getElementsByTagName("meta").buildVersion.content获取浏览器已打开网页的版本号
  2. 通过不带缓存的get请求获取服务器存放的新版本号的version.json
  1. 刷新页面: 通过检测版本来提示或自动刷新页面获取最新的服务器资源


标记版本



  1. 配置html-webpack-pluginindex.html插入编译版本号
const HtmlWebpackPlugin = require("html-webpack-plugin");
const buildVersion = Date.now();
console.log("当前编译版本: >>", buildVersion);
module.exports = {
  configureWebpack: (config) => {
    config.plugins.forEach((plugin) => {
      if (plugin instanceof HtmlWebpackPlugin) {
        plugin.options.version = buildVersion;
      }
    });
  },
};


  1. index.html插入mate标签
<meta name="buildVersion" content="<%= htmlWebpackPlugin.options.version %>">


  1. 创建用于生成version.jsonwebpack插件build-version.js
const pluginName = "BuildVersionWebpackPlugin";
const fs = require("fs");
const path = require("path");
/**
 * 编译后生成版本文件
 */
class BuildVersionWebpackPlugin {
  constructor({ output = "./", version = Date.now() }) {
    this.output = output;
    this.version = version;
  }
  apply(compiler) {
    compiler.hooks.done.tap(pluginName, () => {
      console.log("webpack 编译完成,正在生成版本文件!");
      const outputPath = path.resolve(this.output, "./version.json");
      const versionJson = JSON.stringify({
        version: this.version,
      });
      fs.writeFileSync(outputPath, versionJson, {
        encoding: "utf-8",
      });
    });
  }
}
module.exports = BuildVersionWebpackPlugin;


  1. 配置新建的webpack插件
const BuildVersionWebpackPlugin = require("./build-version.js");
const buildVersion = Date.now();
console.log("当前编译版本: >>", buildVersion);
module.exports = {
  configureWebpack: (config) => {
    ...
    config.plugins.push(
      new BuildVersionWebpackPlugin({
        output: "./dist",
        version: buildVersion,
      })
    );
  },
};


检测版本



  1. 获取服务器存放的版本号
async function _serverVersion() {
  return await new Promise((resolve) => {
    fetch("/version.json", {
      headers: {
        "cache-control": "no-cache",
      },
    })
      .then((response) => {
        try {
          response.json().then((json) => {
            resolve(json.version);
          });
        } catch (error) {
          resolve(0);
        }
      })
      .catch(() => {
        resolve(0);
      });
  });
}


  1. 获取浏览器本地页面的版本号
function _currentVersion() {
  return Number(document.getElementsByTagName("meta").buildVersion.content);
}


  1. 版本号比较
async function _inspector() {
  let isConsistent = true;
  const sv = await _serverVersion();
  const cv = _currentVersion();
  console.log(`检测到本地版本${cv}和服务器版本${sv}`);
  console.log("本地&服务器版本是否一致:>>", (isConsistent = sv === cv));
  return isConsistent;
}
export default async function() {
  return await _inspector();
}


刷新页面


  1. 检测更新时机: 推荐在路由切换之后检测,或主要模块进入时检测
  2. 检测函数,具体的刷新逻辑按实际场景考虑
versionCheck() {
  inspector().then((isConsistent) => {
    if (!isConsistent) {
      const isReload = window.confirm(
        "检测到本地版本和服务器版本不一致,点击确定更新页面 "
      );
      if (isReload) {
        window.location.reload();
      }
    }
  });
}



效果图



6.jpg


相关文章
|
XML Web App开发 人工智能
SVG图像——为 PPT 增添视觉趣味/03/O365智能系列(二)
SVG图像——为 PPT 增添视觉趣味/03/O365智能系列(二)
1969 0
SVG图像——为 PPT 增添视觉趣味/03/O365智能系列(二)
|
12月前
|
缓存 负载均衡 安全
Nginx的反向代理具体是如何实现的?
Nginx的反向代理具体是如何实现的?
|
存储 关系型数据库 MySQL
"揭秘!MySQL为何独宠B+树?跳表再牛,也敌不过这性能王者的N重诱惑!"
【8月更文挑战第11天】MySQL作为主流关系型数据库,优选B+树而非跳表作为索引结构,基于其对范围查询的支持、低磁盘I/O开销及事务处理能力。B+树叶节点构成有序链表,利于范围查询;较矮的树形结构减少了磁盘访问次数;支持多版本并发控制,保障事务ACID特性。而跳表在线性扫描范围查询时效率低,难以高效实现事务管理,且额外指针增加空间消耗。示例代码展示了B+树节点分裂过程,突显其内部机制。综上,B+树为MySQL提供了高性能、可靠的数据存储与检索能力。
355 4
|
域名解析 弹性计算 网络协议
如何用阿里云轻量服务器建站(新手全流程)
如何用阿里云轻量服务器建站(新手全流程)阿里云轻量应用服务器怎么使用?阿里云轻量应用服务器使用教程:轻量应用服务器购买、重置密码、远程连接、宝塔面板的Web环境搭建、WordPress网站程序安装到网站上线,阿里云服务器网分享轻量应用服务器从购买、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程
如何用阿里云轻量服务器建站(新手全流程)
|
设计模式 缓存 前端开发
React中样式解决方案有哪些?
本文首发于微信公众号“前端徐徐”,探讨了React开发中的样式管理方法,包括内联样式、常规CSS、CSS-Module、CSS-in-JS及使用CSS框架等五种常见方案,分析了各自的优缺点,帮助开发者根据项目需求选择合适的样式解决方案。
331 0
Python实现PowerPoint演示文稿到图片的批量转换
PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具,被广泛应用于教育、商务汇报及个人项目展示等领域。然而,面对不同的分享场景与接收者需求,有时需要我们将PPT内容以图片形式保存与传播。 这样能够避免软件兼容性的限制,确保信息接收者无需安装特定软件即可查看内容,还便于在网络社交平台、博客、电子邮件中快速分享与嵌入。而用Python代码可以高效地实现PowerPoint演示文稿到图片的批量转换,从而提升工作效率。 本文将介绍如何使用Python实现PowerPoint演示文稿到图片的转换。
|
XML JSON API
LangChain之各个输出解析器的使用
输出解析器负责获取 LLM 的输出并将其转换为更合适的格式。借助LangChain的输出解析器重构程序,使模型能够生成结构化回应,并可以直接解析这些回应。
441 1
|
消息中间件 存储 负载均衡
MetaQ/RocketMQ 原理问题之避免重复消费问题如何解决
MetaQ/RocketMQ 原理问题之避免重复消费问题如何解决
363 1
|
缓存 前端开发 Java
Spring Boot中防止接口重复提交
Spring Boot中防止接口重复提交
1715 0
|
消息中间件 缓存 NoSQL
设计一个高并发场景下的Python Web应用架构。
在高并发Python Web架构中,关键组件包括负载均衡器用于分散请求,应用服务器如Gunicorn与Docker部署多实例,缓存如Redis提升数据访问速度,优化后的数据库(如MySQL或MongoDB),消息队列如RabbitMQ处理异步任务,通过横向扩展增加服务器,监控和日志系统确保稳定性,代码优化减少不必要的操作,CDN加速静态资源,以及自动化部署和弹性伸缩工具适应负载变化。性能测试和优化是保证系统稳定性的关键。
338 4