【发布时间】:2022-01-09 08:04:54
【问题描述】:
如何正确设置 ModuleFederation 和 react-router-dom 以便我可以拥有
-
Router和Hostapp 中定义的路由 - 远程
Header应用有<Link>组件指向Host 中定义的路由?
但是,下面的设置失败,出现以下错误:
index.js:15 Uncaught Error: useHref() may be used only in the context of a <Router> component.
设置:
托管 mfe 应用,localhost:3001
...
import { BrowserRouter } from 'react-router-dom'
const Header = lazy(() => import("header/Header"))
const Host = () => {
return (
<BrowserRouter>
<React.Suspense fallback="Loading Header...">
<Header />
</React.Suspense>
<Switch>
<Route path="/input">
<InputFormView />
</Route>
<Route path="/">
<ListView />
</Route>
</Switch>
</BrowserRouter>)
}
...
宿主的 webpack.config.js
...
plugins: [
new ModuleFederationPlugin({
name: 'host',
remotes: {
header: 'header@http://localhost:3002/remoteEntry.js'
},
exposes: {
},
shared: {
...deps,
react: {
singleton: true,
requiredVersion: deps.react,
},
"react-dom": {
singleton: true,
requiredVersion: deps["react-dom"],
},
"react-router-dom": {
singleton: true,
requiredVersion: deps["react-router-dom"],
}
},
}),
...
标头 mfe 应用程序,localhost:3002
...
import { Link } from 'react-router-dom'
const Header = () => {
return (
<div id="header">
<h1> Header </h1>
<Link to="/input">
<button type="button"> Input form </button>
</Link>
</div>
)
...
Header 的 webpack.config.js
...
new ModuleFederationPlugin({
name: 'header',
filename: 'remoteEntry.js',
exposes: {
'./Header': './src/Components/Header'
},
remotes: {},
shared: {
...deps,
react: {
singleton: true,
requiredVersion: deps.react,
},
"react-dom": {
singleton: true,
requiredVersion: deps["react-dom"],
},
"react-router-dom": {
singleton: true,
requiredVersion: deps["react-router-dom"],
}
},
}),
...
但是,如果我也将 Header 包装在 BrowserRouter 中,则会遇到以下错误:
index.js:15 Uncaught Error: You cannot render a <Router> inside another <Router>. You should never have more than one in your app.
【问题讨论】:
标签: javascript reactjs react-router react-router-dom webpack-module-federation