Search Docs
本节我们将详细介绍 react 框架的应用作为子应用的接入步骤。v16/17 demo、v18 demo
npm install @garfish/bridge-react --save
更多 bridge 函数参数介绍请参考 这里
// src/index.tsx import { reactBridge } from '@garfish/bridge-react'; import RootComponent from './components/root'; import Error from './components/ErrorBoundary'; export const provider = reactBridge({ // 子应用挂载点,若子应用构建成 js ,则不需要传递该值 el: '#root', // 根组件, bridge 会默认传递 basename、dom、props 等信息到根组件 rootComponent: RootComponent, // 设置应用的 errorBoundary errorBoundary: () => <Error />, });
// src/index.tsx import { reactBridge } from '@garfish/bridge-react-v18'; import RootComponent from './root'; import ErrorBoundary from './ErrorBoundary'; export const provider = reactBridge({ el: '#root', rootComponent: RootComponent, errorBoundary: (e: any) => <ErrorBoundary />, });
// src/component/rootComponent import React from "react"; import { BrowserRouter } from "react-router-dom"; const RootComponent = ({ basename }) => { return ( <BrowserRouter basename={basename}> <Routes> <Route path="/" element={<App />}> <Route path="/home" element={<Home />} /> <Route path="*" element={<PageNotFound />} /> </Route> </Routes> </BrowserRouter> ) }
// webpack.config.js const webpack = require('webpack'); const isDevelopment = process.env.NODE_ENV !== 'production'; module.exports = { output: { // 开发环境设置 true 将会导致热更新失效 clean: isDevelopment ? false : true, filename: '[name].[contenthash].js', chunkFilename: '[name].[contenthash].js', // 需要配置成 umd 规范 libraryTarget: 'umd', // 修改不规范的代码格式,避免逃逸沙箱 globalObject: 'window', // webpack5 使用 chunkLoadingGlobal 代替,或不填保证 package.json name 唯一即可 jsonpFunction: 'garfish-demo-react', // 保证子应用的资源路径变为绝对路径 publicPath: 'http://localhost:8080', }, plugin: [ // 保证错误堆栈信息及 sourcemap 行列信息正确 new webpack.BannerPlugin({ banner: 'Micro front-end', }), ], devServer: { // 保证在开发模式下应用端口不一样 port: '8000', headers: { // 保证子应用的资源支持跨域,在上线后需要保证子应用的资源在主应用的环境中加载不会存在跨域问题(**也需要限制范围注意安全问题**) 'Access-Control-Allow-Origin': '*', }, }, };
【重要】注意:
last but not least, 别忘了添加子应用独立运行逻辑,这能够让你的子应用脱离主应用独立运行,便于后续开发和部署。
// src/index.tsx if (!window.__GARFISH__) { ReactDOM.render( <RootComponent basename={ process.env.NODE_ENV === 'production' ? '/examples/subapp/react18' : '/' } />, document.getElementById("root")); }