@module-federation/bridge-react
提供了用于 React 应用的 bridge 工具函数:
createBridgeComponent
:用于导出应用级别模块,适用于生产者包装其作为应用类型导出的模块createRemoteComponent
:用于加载应用级别模块,适用于消费者加载作为应用类型加载的模块请注意:使用 @module-federation/bridge-react
后不能将 react-router-dom
设置成 shared,否则构建工具将会提示异常。这是因为 @module-federation/bridge-react
通过代理 react-router-dom
实现了对路由的控制,以保证应用间路由能够正常协同工作。
在生产者项目中,假设我们需要将应用通过
@module-federation/bridge-react
导出为一个应用类型模块,应用入口为 App.tsx 文件
export-app.tsx
,该文件将作为应用类型模块导出的文件。我们需要使用 createBridgeComponent
来包装应用的根组件。export-app.tsx
作为应用类型模块导出至此,我们完成了应用类型模块的导出。
为什么应用类型模块需要使用 createBridgeComponent
包装?原因主要有三点:
createBridgeComponent
包装的组件将符合应用类型消费方的加载协议,这使得跨框架渲染成为可能basename
。通过 createBridgeComponent
包装的组件将自动注入 basename
,这能保证生产者应用在消费者项目下也能正常工作createBridgeComponent
包装的组件将包裹 ErrorBoundary,以保证在远程加载失败或渲染出错时,能够自动进入兜底逻辑Host
createRemoteComponent
来加载应用类型模块至此,我们完成了应用类型模块的加载。
通过 createRemoteComponent
导出的远程模块将会自动使用 react-bridge 加载协议加载模块,
这使得应用的跨框架渲染成为可能。
此外,createRemoteComponent
会自动处理模块加载、模块销毁、错误处理、loading、路由 等逻辑,
开发者只需要关注如何使用远程组件即可。
通过 createRemoteComponent
导出的远程模块,你可以像使用普通 React 组件一样使用远程组件:传递 className、style、props、ref 等属性均会自动透传到远程组件,
这使得用户在体验上几乎等同于使用本地组件
bridgeInfo
type:
options
loader
() => Promise<Module>
loadRemote('remote1/export-app')
、import('remote1/export-app')
export
string
loading
React.ReactNode
fallback
ComponentType<{ error: any; }>
ReturnType
(props: PropsInfo)=> React.JSX.Element