Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染,又能做单页应用的框架,如果想做单页应用,又想学服务端渲染,使用Remix可以降低学习成本。最近,在学习Remix的过程中,遇到了在SPA模式下与Ant Design整合的问题。
我用Remix官网的命令下载了一个SPA的模板

npx create-remix@latest --template remix-run/remix/templates/spa

我们知道,Remix有一个ErrorBoundary组件,是用来显示错误页的,比如404页面,我在root.tsx导出了这个组件

export function ErrorBoundary(){const navigate=useNavigate()return (<Resultstatus="404"title="404"subTitle="抱歉,你访问的页面不存在。"extra={<Button type="primary" onClick={() => navigate(-1)}>返回</Button>}/>)
}

这里面使用了Ant Design的Result组件,用来显示404错误信息,结果在测试过程中发现页面卡死,CPU温度飙高,浏览器控制台不停报错,而且页面中样式也没加载出来,排版混乱。
后来,我花了几天研究这个问题,发现是root.tsx中的Layout组件搞的鬼。Layout组件是用来定义root.tsx中的布局的,它会把ErrorBoundary组件当作静态内容给放进去,因此无法动态加载Ant Design组件对应的样式,并且出现一大堆报错,导致CPU空转,温度飙高。因此,我注释了这个组件,

// export function Layout({ children }: { children: React.ReactNode }) {
//   return (
//     <html lang="en">
//       <head>
//         <meta charSet="utf-8" />
//         <meta name="viewport" content="width=device-width, initial-scale=1" />
//         <Meta />
//         <Links />
//       </head>
//       <body>
//         {children}
//         <ScrollRestoration />
//         <Scripts />
//       </body>
//     </html>
//   );
// }

后来在Remix官网找到了解决办法。
首先,在app目录下新建index.html

<!DOCTYPE html>
<html lang="en">
<head><!-- <title>My Cool App!</title> --><meta charSet="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
</head><body><div id="app"><!-- Remix SPA --></div>
</body></html>

这里面建议不要有title标签,否则Remix给不同的路由添加的title会失效。然后,修改root.tsx

export default function App() {return (<><html lang="en"><head><meta charSet="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><Meta /><Links /></head><body><Outlet/><ScrollRestoration /><Scripts /></body></html></>);
}export function HydrateFallback() {return (<><ProSkeleton type="list"></ProSkeleton><Scripts/></>)
}

其中,App组件是用来加载路由组件的,里面需要包含Meta 和Links 标签,才能使每个路由导出的Meta和Links生效,保证样式文件能够正常加载,HydrateFallback组件是在路由跳转过程中显示加载状态的页面,如骨架屏。
接着,在app下创建entry.server.tsx

import fs from "node:fs";
import path from "node:path";import type { EntryContext } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";export default function handleRequest(request: Request,responseStatusCode: number,responseHeaders: Headers,remixContext: EntryContext
) {const shellHtml = fs.readFileSync(path.join(process.cwd(), "app/index.html")).toString();const appHtml = renderToString(<RemixServer context={remixContext} url={request.url} />);const html = shellHtml.replace("<!-- Remix SPA -->",appHtml);return new Response(html, {headers: { "Content-Type": "text/html" },status: responseStatusCode,});
}

修改app下的client.entry.tsx

import { RemixBrowser } from "@remix-run/react";
import { startTransition, StrictMode } from "react";
import { hydrateRoot } from "react-dom/client";startTransition(() => {hydrateRoot(document.querySelector("#app") || document,<StrictMode><RemixBrowser/></StrictMode>);
});

这样,就能把路由组件加载到index.html中的

<div id="app"><!-- Remix SPA --></div>

了。
然后,我测试了一下,发现404页面能够正常跳转,没有样式加载错误了。
在这里插入图片描述

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

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

相关文章

自动化立体仓库与堆垛机单元的技术参数

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是一份自动化立体仓库与堆垛机单…

ViT模型

Vision Transformer (ViT) 论文地址&#xff1a;https://arxiv.org/abs/2010.11929 输入到MLP类别分类器中的特征只有类别token 经过N层transformer编码器处理后的特征的维度与输入前相同&#xff0c;均为[197&#xff0c;768]&#xff0c;我们只使用列表切片的方式提取出类…

成都睿明智科技有限公司抖音电商新蓝海领航者

在当今这个短视频与直播电商风起云涌的时代&#xff0c;抖音凭借其庞大的用户基数和高度活跃的社区氛围&#xff0c;已成为众多品牌与商家争相入驻的新蓝海。而在这场电商盛宴中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和深厚的行业洞察力&#xff0c;…

MySQL(日志)

日志 日志分为三种&#xff1a; undo log &#xff08;回滚日志&#xff09;&#xff1a;用于事务回滚和MVCC redo log &#xff08;重做日志&#xff09;&#xff1a;用于故障恢复 binlog &#xff08;归档日志&#xff09;&#xff1a;用于数据备份和主从复制 undo log undo…

【MySQL】字符集与Collation

今天做项目&#xff0c;突然发现&#xff0c;项目中使用的MySQL的库排序规则是 utf8mb4_general_ci&#xff0c;而我自己用的MySQL8默认库规则是utf8mb4_0900_ai_ci&#xff0c;于是想要弄清楚 出处&#xff08;写的非常详细&#xff09;&#xff1a;mysql设置了utf8mb4&#x…

华为HarmonyOS地图服务 12 - 如何在地图指定位置增加气泡?

场景介绍 本章节将向您介绍如何在地图的指定位置添加气泡。 您可以通过气泡在道路上指定位置显示测速、拥堵情况。气泡支持功能: 支持设置四个方向的图标(传入的图标宽高需要相同)。支持设置图标碰撞规则。支持设置当前气泡的候选坐标段,通过计算使气泡在最佳的线段位置上…

C++速通LeetCode中等第16题-环形链表II(快慢指针)

算法思路&#xff08;主要是数学推导&#xff09;&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNo…

KVM环境下制作ubuntu qcow2格式镜像

如果是Ubuntu KVM环境是VMware虚拟机&#xff0c;需要CPU开启虚拟化 1、配置镜像源 wget -O /etc/apt/sources.list https://www.qingtongqing.cc/ubuntu/sources.list2、安装kvm qemu-img libvirt kvm虚拟化所需环境组件 apt -y install qemu-kvm virt-manager libvirt-da…

【JavaEE】——多线程(join阻塞,计算,引用,状态)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;join等待线程结束 1&#xff1a;知识回顾 2&#xff1a;join的功能就是“阻塞等待” …

tcp、udp通信调试工具Socket Tool

tcp、udp通信调试工具Socket Tool ]

【Unity设计模式】Unity MVC/MVP架构介绍,及MVC/MVP框架的简单应用

什么是MVC&#xff1f; MVC自1982年被设计出来&#xff0c;至今都有着很大比重的使用率&#xff0c;特别是目前软件及游戏迭代如此之快的情况下。高效的增删功能&#xff0c;低耦合又小巧灵活的框架MVC&#xff0c;深受广大ProgramDesigner的喜爱。 MVC框架相信大部分程序员&…

医院伤员小程序点餐———未来之窗行业应用跨平台架构

一、读取服务器医院信息 var 未来之窗人工智-商家信息-医院职工 {//2024-09-22 cyber_getMerchant_CardUser_V20240922: function(appikkey,merchant_id,store_id,ecogen_sponsor_appid,openid,frommsg,wlzc_callback) {//2023-7-6 里程碑var wlzcapi"加入url";wx.re…

Rust 运算符快速了解

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 4.1 运 算 符 前面已经学习了变量和常量&#xff0c;本节开始对它们进行操作&am…

深度学习02-pytorch-08-自动微分模块

​​​​​​​ 其实自动微分模块&#xff0c;就是求相当于机器学习中的线性回归损失函数的导数。就是求梯度。 反向传播的目的&#xff1a; 更新参数&#xff0c; 所以会使用到自动微分模块。 神经网络传输的数据都是 float32 类型。 案例1: 代码功能概述&#xff1a; 该…

分页插件、代码生成器

01-分页插件、代码生成器 分页插件使用 首先在pom.xml文件中导入依赖 然后再mybatis-config.xml文件中写入插件 在测试类中写入方法 在mybatis.xml文件中设置plugins标签里的属性helperDialectkeyi自动检查当前数据库用的什么,不用设置也行,默认就设置了 分页插件里面属性详解…

【ranger编译报错】cloudera-manager-api-swaggerjar7.0.3 not found

cloudera-manager-api-swaggerjar7.0.3 not found 快捷导航 在开始解决问题之前&#xff0c;大家可以通过下面的导航快速找到相关资源啦&#xff01;&#x1f4a1;&#x1f447; 快捷导航链接地址备注相关文档-ambaribigtop自定义组件集成https://blog.csdn.net/TTBIGDATA/a…

【在Linux世界中追寻伟大的One Piece】IP分片和组装的具体过程

目录 1 -> IP分片和组装的具体过程 2 -> 分片与组装的过程 2.1 -> 分片 2.2 -> 组装 3 -> 分片与组装的示意图 3.1 -> 分片组装场景 1 -> IP分片和组装的具体过程 16位标识(id)&#xff1a;唯一的标识主机发送的报文。如果IP报文在数据链路层被分片…

利士策分享,华为三折叠手机:重塑未来科技生活的里程碑

利士策分享&#xff0c;华为三折叠手机&#xff1a;重塑未来科技生活的里程碑 在这个日新月异的科技时代&#xff0c;华为再次以惊人的创新力&#xff0c;引领我们迈向智能设备的全新纪元——华为三折叠手机&#xff0c; 不仅是技术的飞跃&#xff0c;更是对未来生活方式的一次…

【保奖思路】2024年华为杯研赛B题完整代码建模过程(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https://qm.qq.com/q/XzdIsvbiM0https://qm.qq.com/q/XzdIsvbiM0请根据附件WLAN网络实测训练集中所提供…

代理IP对于网络爬虫业务的重要性

在现代互联网业务中&#xff0c;网络爬虫已成为企业获取大量数据的重要工具。在这一过程中&#xff0c;代理IP发挥着至关重要的作用&#xff0c;特别是对于高频率的数据抓取任务&#xff0c;代理IP能够有效提升爬虫的成功率和安全性。 1. 绕过IP封禁 网站为了防止过度的爬虫行…