前端发布缓存导致白屏解决方案

news2025/3/13 7:59:16

解决发布H5后因为本地缓存白屏方案

一、 核心配置优化(前提是访问网站的请求能抵达服务器)

方案一:前端项目设置全局不缓存方案

  • 运行逻辑:在H5服务器配置中增加Cache-Control: no-cache或max-age=0响应头,禁用静态资源缓存‌;
  • 优点:能在服务器出口处最大可能地解决发布项目缓存问题
  • 缺点:用户在不同界面跳转都会重新加载界面信息,影响整个前端加载速度,高并发时容易造成带宽压力

方案二: 首页index.html资源缓存修正,禁制index.html文件缓存

server {
    listen 8080;
	root /var/www/web/;
	location /index.html {
        add_header Cache-Control "no-cache, no-store, must-revalidate, private";
    	add_header Pragma "no-cache";
   		add_header Expires "0";
    	try_files $uri /index.html;
    }
	location / {
        try_files $uri $uri/ /index.html;
    }
}
  • 优点: 单页面应用设置首页模板强制不缓存,用户浏览器不会缓存 index.html 文件,每次都会向服务器拉取新的首页模板,确保用户不会使用历史模板。
  • 缺点: 用户不缓存首页,每次都会拉取,导致每次进入系统都会等待相对较长的时间。

方案三: 首页 index.html 资源添加 ETag和Last-Modified 参数

server {
    listen 8080;
	root /var/www/web/;
	location /index.html {
        etag on;
        if_modified_since exact;
        add_header Cache-Control "public, max-age=0";
        expires modified +1y;
        try_files $uri /index.html;
    }
	location / {
        try_files $uri $uri/ /index.html;
    }
}
  • ETag:是服务器为资源生成的唯一标识符(如哈希值或版本号),内容变化时标识会更新。
  • Last-Modified: 服务器返回资源的最后修改时间戳
  • 运行逻辑:客户端首次请求资源时,服务器返回 ETag 和 Last-Modified。后续请求中,客户端可能同时发送 If-None-Match 和 If-Modified-Since。服务器优先检查 ETag 与 Last-Modified(若存在),直接返回 304,浏览器使用缓存文件;因 ETag 精度更高,若匹配,则会忽略 Last-Modified。
  • 优点:能检测到内容字节级别的变化或者文件系统时间戳的变化,从而让用户端使用新的文件;通过检验文件的方式实施高效缓存策略,可有效利用客户端缓存,提升网站性能并降低服务器压力。
  • 缺点:
    若多服务器间文件属性或文件时间戳不一致,可能导致 ETag/Last-Modified 冲突(如果是一个jenkins编译,将一个编译包放到两个服务器(服务器系统版本一致)中实现负载均衡,可以使用ETag,如果使用k8s等其他工具发布需要注意文件同步,可以使用分布式文件系统或同步工具);
    高并发时每一次请求都会检验请求的ETag会占用相对校对的CPU性能(针对目前在线理赔的并发量,可忽略不计);
    太过于依赖本地缓存,如果请求头校验通过但是本地缓存异常会造成未知异常(目前有人说可能会出现的问题,但是并未在某处真的搜索到相关bug内容);
    可以用:curl -I https://域名 来查看请求头内容

二、 jenkins发布流程优化方案

  • 运行逻辑:每次发布 jenkins 时不删除上一个版本的js文件,直接将新的js放在原有目录下,达到新老版本js共存的目的,当用户使用浏览器缓存的界面读取老版本的js不会因为文件不存在而报错。等待用户浏览器识别到更新后会更新到新版本。

  • 优点
    用户不会因为发布拿不到js文件而白屏,基本可以解决因为发布缓存而白屏的问题。

  • 缺点
    用户使用老版本的js进入系统后,无法使用新功能,如果前后端代码功能不一致会导致用户操作失败;如果用户长时间没有触发更新机制,会导致更新功能在一段时间内用户无法使用;

    随着每次发布,服务器上的js文件会越来越多,当达到一定数量级后会影响服务器对文件的读取速度需要不定时人为处理久远的历史版本(服务器脚本示例,注意不要复制使用,需要根据自己的项目确认删除的数据,数据无价删除许谨慎:保留最近2个版本
    ls -t /path/to/dist/js/app.*.js | tail -n +3 | xargs rm -f
    )。

三、 使用版本号方案

通过后端更新版本号

  • 运行逻辑:后端在系统中开放一个公开接口用于接收并返回当前版本号,前端需要给设备定义一个唯一设备号保存在浏览器;前端每次加载完 index.html 首页模板后,在渲染js之前对后端发起一个版本号对比请求,后端日志保存前端提交请求的版本号与设备号并返回当前系统版本,如果前端本地保存的版本与后端不一致,则前端使用Service Worker缓存控制通过workbox-webpack-plugin清除旧版本文件缓存,然后再刷新界面渲染js。

  • 优点:可以在发布代码之后,通过日志查看是否有用户依旧是老版本发起请求,可以通过参数查询同一设备是否在进入老版本后又重新进入了新版本,同时拥有历史日志可以判断设备号属于哪个用户,并且可以人为在数据库修改版本号来实现控制用户刷新次数。

  • 缺点:开发测试工作量相对较大,每次发布需要人为修改数据库版本号(或者写成接口放在jenkins中自动触发);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

混沌理论与混沌映射——算法改进初始化创新点之一

混沌理论与混沌映射 混沌理论研究混沌系统的动力学,其特征是非线性和对初始条件的极端敏感性。即使在这些条件下的微小变化也可能导致系统结果的显著变化。尽管看起来是随机的,混沌系统可以在不依赖随机性的情况下表现出不规则的行为,因为确…

19874并查集

19874并查集 ⭐️难度:中等 🌟考点:并查集、数据结构 📖 📚 import java.util.*;public class Main {static int N 100010;static int[] a new int[N];static int[] p new int[N];static int n;static int m;st…

Jmeter下载安装配置及使用

1、下载 官网地址:Apache JMeter - Download Apache JMeter 2、配置环境变量 ①找到环境变量,两种方法 法一:我的电脑→右键菜单→属性→高级系统设置→环境变量 法二:直接搜索环境变量 ②新建两个系统变量 1.变量名&#x…

【从零开始学习计算机科学】编译原理(一)编译过程概述

【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…

【算法day8】 Z 字形变换 -O(n)算法思路整理

Z 字形变换,算法思路整理 https://leetcode.cn/problems/zigzag-conversion/description/ 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下…

L3-1 夺宝大赛

输入样例 1: 5 7 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 2 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 7 1 5 7 1 1 1 5 5 3 1 3 5 1 4输出样例 1: 7 6样例 1 说明: 七支队伍到达大本营的时间顺次为:7、不可能、5、3、3、5、6&#xff0c…

Matlab:矩阵运算篇——矩阵

目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…

泛微ecode的页面开发发送请求参数携带集合

1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况,那么这里就有一些如下的注意事项,如以下代码: // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

Javaweb后端全局异常处理器

类名随便定义 这是异常处理的方法exceptionhandler responsebody作用,方法的响应值返回给前端,如果返回的是集合对象,会把集合对象转为json,再给前端响应返回

SpringBoot缓存抽象:@Cacheable与缓存管理器配置

文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层&am…

江科大51单片机笔记【11】AT24C02(I2C总线)

一、存储器 1.介绍 RAM的特点是存储速度特别快,但是掉电会丢失;ROM的特点是存储速度特别慢,但是掉电不会丢失 SRAM是所有存储器最快的,一般用于电脑的CPU高速缓存,容量相对较少,成本较高;DRAM…

外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试

思路&#xff1a;外层旋转后坐标&#xff0c;元素旋转后坐标&#xff0c;计算偏移坐标 <template><div class"outbox"><label>角度: <input v-model.number"rotate" type"number" /></label><br><div c…

Docker容器安装软件(完整版)

文章目录 一、安装Docker1.1 docker 相关的命令1.2 配置镜像加速 二. 安装es2.1 创建网络2.2 拉取镜像2.3 创建挂载点目录2.4 部署单点es&#xff0c;创建es容器2.5 编写elasticsearch.yml2.6 重启es容器2.7 测试Elasticsearch是否安装成功 三. 基于Docker安装Kibana3.1 拉取镜…

「 机器人 」扑翼飞行器通过总气动力控制四自由度运动方法

一、前言 在扑翼飞行中,总气动力(Total Aerodynamic Force)是指扑翼在运动过程中受到的所有空气动力作用的合力。它是由以下两种主要力的合成结果: 1. 升力(Lift, ):垂直于空气流方向的力,用于支持飞行器(或生物)的重量。 2. 阻力(Drag, ):平行于空气流方向的力,…

Axios简单说明,快速上手

Ajax&#xff1a;异步的JavaScript和XML 作用&#xff1a; 数据交换异步交互 Axios&#xff1a;就是对原生Ajax进行封装&#xff0c;简化书写&#xff0c;快速开发 使用逻辑&#xff1a; 首先要安装Axios&#xff0c;可以通过npm在项目中安装&#xff1a; 打开命令行工具…

云服务器安装宝塔面板部署

单机部署(前端vue项目) 服务器安装宝塔面板 连接到服务器 使用 SSH 连接到你的服务器&#xff1a; ssh rootip安装宝塔面板 运行以下命令来安装宝塔面板&#xff1a; yum install -y wget wget -O install.sh http://download.bt.cn/install/install_6.0.sh sh install.sh安…

通义万相 2.1:AIGC 领域的 “王炸” 组合如何颠覆创作生态?

引言 在数字化和人工智能的飞速发展中&#xff0c;AIGC&#xff08;AI生成内容&#xff09;技术已经成为推动创作、设计和内容生成领域创新的核心力量。而当通义万相2.1与蓝耘智算平台强强联手&#xff0c;这一“王炸”组合不仅提升了AIGC的效率&#xff0c;还为创作生态带来了…

elementPlus之日历扩展功能

在这里做个记录&#xff0c;感觉用得还挺多的 功能有如下&#xff1a; 切换月份按钮对应日历视图和中间日期都要变选择日期日历视图要变点击日历视图中的不属于当前选中月份的日期即可触发日历视图变化以及中间日期也要变 代码如下&#xff1a; <template><div clas…

C# NX二次开发:获取模型中所有表达式并且更新某个表达式的值

大家好&#xff0c;今天要讲的是关于NX中表达式的相关UFUN函数。 UF_MODL_ask_exps_of_part (view source) tag_tpart_tagInputTag of the part to be queriedint *number_of_expsOutputNumber of expressions returnedtag_t * *expsOutput to UF_*free*All the expressions i…

Ollama本地部署deepseek-r1蒸馏版

Docker安装Ollama 拉取镜像 docker pull ollama/ollama​ 启动-使用GPU docker run -d --gpusall -p 11434:11434 --name ollama ollama/ollamadocker run : Docker 的核心命令&#xff0c;用于创建并启动一个新的容器。 -d : 后台模式&#xff08;detached mode&#xff09…