react lazy加载资源找不到的问题

在 Umi 4 中,默认按页拆包进行优化,实现每个页面只需加载最少的 js 资源,这会产生很多异步 js 分包。通常我们会开启 hash: true 构建,将 js / css 等资源做长期缓存,而 html 不缓存。

然而,在版本发布时,如果有用户在旧的应用 html 上加载新的页面,会导致旧资源 xxx.hash.js 加载不到。比如在整个替换 oss 存储内容的情况下,因为新版本已经发布,旧的 hash 文件不存在了。

下面为大家介绍两种解决方案:

一、加载失败自动重试方案

可以考虑 patch React.lazy 加载方法,遇到加载失败后自动 reload 页面重试。以下是自动重试的示例代码,若阻塞超过 10s,则弹出报错弹窗需用户手动刷新加载:

javascript 复制代码
// src/global.tsx

import { Modal, Result } from 'antd';
import React from 'react';

const originLazy = React.lazy;

React.lazy = (factory) => {
  return originLazy(() => factory().catch(loadError));
};
let hasError = false;
function loadError(): { default: React.ComponentType<unknown> } {
  const time = Number(window.location.hash.match(/#s(\d+)/)?.[1]);
  const now = Date.now();
  const isReloading =!time || time + 10000 < now;
  if (isReloading) {
    window.location.hash = `#s${now}`;
    window.location.reload();
  }

  const module = {
    default: () => {
      if (hasError) {
        return null;
      }
      hasError = true;
      return (
        <Modal
          open
          cancelButtonProps={{
            style: {
              display: 'none',
            },
          }}
          onOk={() => {
            window.location.reload();
          }}
          okText="Reload"
        >
          <Result title="Generic error message" status="error">
            {`Oops, something went wrong.`}
          </Result>
        </Modal>
      );
    },
  };

  return module;
}

参考来源:https://twitter.com/cpojer/status/1730141247900459166。

另外,也可参考 Vite 的 preload error 实现,自行在 loadError 内 dispatch 事件,之后在需要监听的地方处理即可。

二、自动检测新版本是否发布方案

还可参考https://github.com/umijs/umi/issues/10171 中的方案,在后台轮询 html 内容,在 html 中或其他位置维护新的版本标识,发版后将自动提示用户刷新页面。

注:添加版本标识的方案多样,如在 api.onBuildHtmlComplete 构建完成后手动修改 html,或 headScripts 手动添加等:

javascript 复制代码
//.umirc.ts

  headScripts: [
    {
      content: `// version: 1.2.3`
    }
  ],

此外,"version-rocket"这个库也可以参考。单独开了一个工作线程,后台轮询比对版本标识,逻辑相同。

相关推荐
paopaokaka_luck6 小时前
非遗文物数字化系统(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
前端·javascript·vue.js·人工智能·数据分析·echarts
乘风gg7 小时前
AI Coding 提效 2 倍是真的吗?到底怎么衡量效果
前端·ai编程·claude
用户921080262867 小时前
从对象到原型链:理解 this、构造函数和 new
前端
猫不易7 小时前
Webpack 与 Vite:从 Loader / Plugin 到 Rolldown 统一引擎
前端·vite
YHL7 小时前
🎯 Danci —— 用 AI 驱动开发一个全栈英语单词学习平台
前端·后端
平头哥~7 小时前
Day 20 _ 3D 翻卡_perspective 写错人,卡片就穿帮
前端·3d·css3·学习资料
天道kabuto7 小时前
前端每日知识点:React Fiber 与 AI 流式长文本渲染:从调度原理到工程落地
react.js
小聪7087 小时前
elpis-core 前端 Webpack 工程化实践
前端
2601_953988077 小时前
Ricon组态实时监控 - 毫秒级数据可视化
前端·物联网·数学建模·信息可视化·架构·前端框架
V158897262017 小时前
从滴滴模式看机器人租赁:撮合型租赁平台开发源码的调度系统设计思路
linux·前端·机器人