「React」React Router v7 framework qiankun window is not defined

前言

官网如是说:创建一个 React 项目,我们推荐从一个框架开始。

我"照本宣科",咔咔一顿操作重构了用户登录、管理中心...一切看起来很顺利,就连 DOM 的 ts + ESLint 校验也尽可能妥善处理了。

鉴于管理中心需要分流的子业务系统比较多,也便于后续团队成员加入,我很自然的想到用微前端架构。

其实在这之前,已经采用 monorepo 架构尝试了一下 ------ 当前人手有限,一个仓库梭哈所有项目,开发效率没得说,但是稍微考虑后面项目体量会随着需求量增加而增加,未来要加入的小伙伴能力梯度等因素,多少觉得不是很保险,比如:项目权限控制、项目稳定性...这也是上面提到的"重构"的来由。

所以借由这个档口,果断迟痛不如早痛,换方案!

多个子业务系统,统一入口,再加上有一个分流入口,很明显这些内容归属于主应用范畴。很快,主应用已就绪。

所谓"万事开头难",第一步我已经换着花样走了两遍了,接下来就是依葫芦画瓢搭建子应用了。

shell 复制代码
npx create-react-router@latest

嗯,一口气出来了2个子应用。

至此,物料已就位,是时候引入微应用相关了。考虑之前公司有项目有用过 qiankun,再对比下其他微前端框架,嗯,适当控制下学习量,此次选了认识但之前没机会深入了解的 qiankun。

过程

综上,截至目前涉及到的技术有 React Router v7(因为是框架,内置 vite 打包构建工具及其他), qiankun.

第一步 :主应用本地启动起来...子应用 A, B 本地跑起来...✌一切顺利。 第二步:主应用安装 qiankun,为注册子应用做准备... ✌一切顺利。

shell 复制代码
pnpm add --save qiankun

第三步:主应用使用 qiankun 提供的 API 开始注册子应用...

tsx 复制代码
import { registerMicroApps, start } from "qiankun";

Ops!!! 主应用报错了 ------ window is not defined.

第一反应,上官网找相关说明、GitHub issue 输入关键信息找同伴、AI 求助、百度拆盲盒...

  1. React Router v7 默认 ssr 渲染,那就关掉呗

    js 复制代码
    // react-router.config.ts
    export default {
      // Config options...
      // Server-side render by default, to enable SPA mode set this to `false`
      ssr: false,
    } satisfies Config;

    无效。

    GitHub 如是说,为了更快的渲染效率,即使 ssr: false,也会先在 Node 服务解析部分内容。

    好巧不巧,import 在内。

  2. 看到有类似情况,应该有可以借鉴的思路吧,进去看看...

    喔,useEffect 缓冲下...可我这里是直接 import 就触发报错了的。

    哈,看题主动态导入有解决,我也来试试

    js 复制代码
    useEffect(() => {
        if(typeof window !== undefined){
          const { registerMicroApps,start } = require('qiankun');
          registerMicroApps([]);
          start();
        }    
    }, []);

    不好,window 是不报 not defined 了,变 require is not defined 了。但是动态导入直觉可行,React Router v7 应该是另外的写法,再试试 💪(总比现在换 Next.js 再来一次重构要快吧...)

尾声

React Router v7 中的动态导入 :通过动态导入的方式延迟加载 qiankun 模块,直到确定是在浏览器环境中运行时再进行导入。这种方式可以避免在服务端渲染阶段就尝试访问 window 对象。例如:

javascript 复制代码
useEffect(() => {
 import('qiankun').then(({ registerMicroApps, start }) => {
   // 在这里注册和启动你的微应用
 });
}, []);

此法亲测可行,记录如此。🖊

当然,应该还有其他可行方案。鄙人着急琢磨主应用与子应用的通信,其他方案就交由有兴趣的小伙伴去探索来分享了。😀

相关推荐
旭久4 小时前
react+antd中做一个外部按钮新增 表格内部本地新增一条数据并且支持编辑删除(无难度上手)
前端·javascript·react.js
windyrain4 小时前
ant design pro 模版简化工具
前端·react.js·ant design
GISer_Jing5 小时前
React-Markdown详解
前端·react.js·前端框架
太阳花ˉ5 小时前
React(九)React Hooks
前端·react.js
旭久7 小时前
react+antd封装一个可回车自定义option的select并且与某些内容相互禁用
前端·javascript·react.js
阿丽塔~7 小时前
React 函数组件间怎么进行通信?
前端·javascript·react.js
前端菜鸟来报道9 小时前
前端react 实现分段进度条
前端·javascript·react.js·进度条
傻球11 小时前
Jotai 使用详解:React 轻量级状态管理库
前端·react.js
市民中心的蟋蟀14 小时前
第四章: 使用订阅来共享模块状态
前端·javascript·react.js
水煮白菜王15 小时前
首屏加载时间优化解决
前端·javascript·react.js