|
在微前端、多模块系统或模块联邦架构中,常见的一个问题是:
子项目是 Vite + React + React Router 构建的组件库,主项目是 Next.js,如何处理 Link 路由跳转?
如果子项目中大量使用了 React Router 的 <Link> 组件,部署到 Next.js 主项目中时就会报错:
那该怎么办?本文将讲清楚:如何将 <Link> 抽象为“注入式组件”,实现路由系统解耦,达到“UI 组件独立 + 路由行为由主项目控制”的目的。
❌ 错误做法:子项目自行包裹 <BrowserRouter>
许多开发者尝试在子项目中包裹:
这样虽然可以让 <Link> 不报错,但在主项目(尤其是 SSR 的 Next.js)中引入后会产生:
✅ 正确做法:将 <Link> 抽象为“注入式组件”
🎯 核心理念
子项目不再直接使用 <Link>,而是通过 props.linkComponent 或 Context 注入方式,将导航行为交由主项目决定。
🔧 Step by Step:组件注入式解耦方案
✅ 第一步:定义 linkComponent props
✅ 第二步:子项目组件中使用注入的 linkComponent
✅ 第三步:在主项目中注入具体实现
🟦 在 React Router 项目中:
🚀 Bonus:抽象整个 Routing Context(进阶)
如果子项目中还用到了 useNavigate() 等跳转逻辑,我们可以统一抽象为:
然后子项目中统一使用:
✅ 总结
| 方案 | 是否推荐 | 说明 |
| 子项目包 BrowserRouter |
❌ |
会和 Next.js 路由系统冲突 |
| 主项目包 MemoryRouter |
⚠️ |
勉强可行,但无地址栏联动 |
| 抽象 linkComponent 注入 |
✅ |
通用、安全、强扩展性 |
| 使用 RoutingContext 管理跳转 |
✅✅ |
推荐:支持 Link 和 push() 双能力 |
🧠 适用场景
🧩 最终收益
来源:https://www.cnblogs.com/sabertobih/p/19005687 |