react h5 发版白屏问题解决方案

2023-10-28 23:45

本文主要是介绍react h5 发版白屏问题解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:h5应用每次发布之后会有部分用户白屏
React v5

1. 优化路由加载时间 app.jsx
render() {if(this.state.loading) {return <PendingPage />}return (<Router><Suspense fallback={<PendingPage />}>{this.state.showPage ?<Switch>{routes.map((route, i) => (<RouteWithSubRoutes key={i} {...route} />))}</Switch>: <PendingPage />}</Suspense></Router>);}
2. 自刷新模式build_version-react路由
const path = require("path");
const fs = require("fs");// 将当前时间戳写入json文件
let json_obj = { build_version: new Date().getTime().toString(),status:200,success:true };
fs.writeFile(path.resolve(__dirname, "./public/json/build_version.json"),JSON.stringify(json_obj),function(err) {if (err) {return console.error(err);}console.log("打包字符串写入文件:public/json/build_version.json,成功!");}
);
// "build": "node create_build_version_json.js && react-app-rewired build",
// 写入package.json 打包先执行次node.js

增加react路由守卫,在每次切换页面去请求生成的时间戳

// FrontendAuth.js
import React, { Component } from "react";
import { Route, Redirect } from "react-router-dom";
import axios from "axios";class FrontendAuth extends Component {constructor(props) {super(props);}render() {const { routerConfig, location } = this.props;const { pathname } = location;axios.get("/json/build_version.json?v=" + new Date().getTime().toString()).then(res=>{let newBuildStr = res.data.build_version;let oldBuildStr = localStorage.getItem("build_version") || "";if (oldBuildStr !== newBuildStr) {localStorage.setItem("build_version", newBuildStr);window.location.reload();}})const targetRouterConfig = routerConfig.find((item) => item.path === pathname);if (targetRouterConfig) {const { component } = targetRouterConfig;return <Route exact path={pathname} component={component} />;}}
}export default FrontendAuth;
// app.jsx
render() {return (<Router><Suspense fallback={<PendingPage />}><Switch><FrontendAuth routerConfig={routerMap} /></Switch></Suspense></Router>);
}
// router/routerMap.js-路由集合
const Index= React.lazy(() => import('../pages/index/index.jsx'));
export default [{path: '/index',component: Index,}
]
3. webpack打包 生成的js版本号_v=hash值(config-overrides.js)
config.output.filename = 'static/js/[name].[contenthash].js?_v=[contenthash]'
config.output.chunkFilename = 'static/js/[name].[contenthash].chunk.js?_v=[contenthash]'
// 某些浏览器可能会忽略.js?v=xxxx
4. ng配置不缓存html(已存在)
#对html文件限制缓存        
location ~ .*\.(html)$ {            add_header Cache-Control no-store;add_header Pragma no-cache;        
}
5. 前端html header(index.html)(已存在)
<metahttp-equiv="cache-control"content="no-cache,no-store, must-revalidate"
/>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache" content="no-cache" />
6. 灰度发布 / 服务器增加一台灰度服务器,运维控制流量切换服务器,着步切换

注: 目前灰度方案由前端cookie控制,但是必须要先全量发布之后才能走灰度,灰度方案不支持。
根据自己的情况。

7. 新增js报错监控,如果检测到js报错,跳转空页面。手动点击登录。(app.jsx)
componentDidCatch(error, info) {if (String(error).includes('Loading chunk')) {// 解决灰度切换js缺失的问题window.location.reload();} else {// 容错机制-会导致所有的报错回到此页面-再考虑一下!// window.location.replace('/404')}}

这篇关于react h5 发版白屏问题解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296780

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja