「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 }) => {
   // 在这里注册和启动你的微应用
 });
}, []);

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

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

相关推荐
Aphasia3114 小时前
React useState 的懒初始化机制
react.js
whuhewei10 小时前
React搜索框组件
前端·javascript·react.js
红尘散仙1 天前
一套 Rust 核心,跑通 Tauri + React Native
react native·react.js·rust
贫民窟的勇敢爷们1 天前
React跨平台能力,打破前端开发的平台边界
前端·react.js·前端框架
朝阳391 天前
React【面试】
前端·react.js·面试
漓漾li1 天前
每日面试题(2026-05-15)- 前端
前端·vue.js·react.js
用户600071819101 天前
【翻译】在 React Router 中理清对话框
react.js
光影少年1 天前
react的 useState 原理、批量更新机制
前端·react.js·掘金·金石计划
Swift社区1 天前
Flutter / React / ArkUI:在鸿蒙 PC 上怎么选?
flutter·react.js·harmonyos
学习论之费曼学习法1 天前
ReAct框架深度解析:让Agent会思考再行动
前端·react.js·前端框架