简体   繁体   English

如何使用带有模块联合和 NX 的通用 shell 创建基于不同技术的微前端?

[英]How to create micro frontends based on different technologies using a common shell with module federation and NX?

I'm trying to create micro frontends with React and Angular (the remotes) that are used within a shell application based on React (the host/shell) using Webpacks Module Federation .我正在尝试使用 React 和 Angular(遥控器)创建微前端,这些微前端在基于 React(主机/外壳)的 shell 应用程序中使用Webpacks Module Federation

Therefore I used this official documentation provided by NX --> Advanced Angular Micro Frontends with Dynamic Module Federation因此我使用了NX提供的官方文档 --> Advanced Angular Micro Frontends with Dynamic Module Federation

Here is what I did:这是我所做的:

1. npx create-nx-workspace pace-microfrontends
2. npm install @nrwl/react --save-dev
3. npm install @nrwl/angular --save-dev
4. npx nx g @nrwl/react:host shell
5. npx nx g @nrwl/angular:remote angular-microfrontend --host=shell
6. npx nx g @nrwl/react:remote react-microfrontend --host=shell

So I created a fresh NX workspace, added the missing dependencies, generated the shell/host application based on React and added two micro frontends (one based on React, one based on Angular) that should be hosted within the shell.因此,我创建了一个新的 NX 工作区,添加了缺失的依赖项,生成了基于 React 的 shell/主机应用程序,并添加了两个应该托管在 shell 中的微前端(一个基于 React,一个基于 Angular)。

After that it was needed to add the missing routing to the Angular micro frontend within the shell, because it was not generated by NX like for the React micro frontend, like this:之后需要将缺少的路由添加到 shell 中的 Angular 微前端,因为它不像 React 微前端那样由 NX 生成,如下所示:

apps/shell/src/app/app.tsx应用程序/shell/src/app/app.tsx

import * as React from 'react';
import NxWelcome from './nx-welcome';
import { Link, Route, Routes } from 'react-router-dom';

const ReactMicrofrontend = React.lazy(
  () => import('react-microfrontend/Module')
);

const AngularMicrofrontend = React.lazy(
  () => import('angular-microfrontend/Module')
);

export function App() {
  return (
    <React.Suspense fallback={null}>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/react-microfrontend">ReactMicrofrontend</Link>
        </li>
        <li>
          <Link to="/angular-microfrontend">AngularMicrofrontend</Link>
        </li>
      </ul>
      <Routes>
        <Route path="/" element={<NxWelcome title="shell" />} />
        <Route path="/react-microfrontend" element={<ReactMicrofrontend />} />
        <Route
          path="/angular-microfrontend"
          element={<AngularMicrofrontend />}
        />
      </Routes>
    </React.Suspense>
  );
}

export default App;

Since the module federation configuration was not right as well (it couldn't find the remoteEntry.js file), I also had to change it from this:由于模块联合配置也不正确(找不到remoteEntry.js文件),我也不得不将其更改为:

apps/shell/module-federation.config.js应用程序/shell/module-federation.config.js

// @ts-check

/**
 * @type {import('@nrwl/devkit').ModuleFederationConfig}
 **/
const moduleFederationConfig = {
  name: 'shell',
  remotes: [react-microfrontend'],
};

module.exports = moduleFederationConfig;

..to this: ..对此:

apps/shell/module-federation.config.js应用程序/shell/module-federation.config.js

// @ts-check

/**
 * @type {import('@nrwl/devkit').ModuleFederationConfig}
 **/
const moduleFederationConfig = {
  name: 'shell',
  remotes: [
    ['angular-microfrontend', 'http://localhost:4201/remoteEntry.mjs'],
    ['react-microfrontend', 'http://localhost:4202/remoteEntry.js'],
  ],
};

module.exports = moduleFederationConfig;

After these adjustments it was possible to start the shell application with npm start .在这些调整之后,可以使用npm start shell 应用程序。

The routing for Home and ReactMicrofrontend works fine but as soon as I click on AngularMicrofrontend I get the following errors: HomeReactMicrofrontend的路由工作正常,但只要我点击AngularMicrofrontend ,我就会收到以下错误:

react_devtools_backend.js:4012 Warning: lazy: Expected the result of a dynamic import() call. react_devtools_backend.js:4012 警告:懒惰:预期是动态 import() 调用的结果。 Instead received: [object Module]而是收到:[对象模块]

Your code should look like: const MyComponent = lazy(() => import('./MyComponent')) at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) at Routes (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) at Suspense at App at Router (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204:15) at BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react.development.js:183 lazyInitializer @ react.development.js:1400 resolveLazy @ react-dom.development.js:14907 reconcileSingleElement @ react-dom.development.js:15718 reconcileChildFibers @ react-dom.development.js:15808 reconcileChildren @ react-dom.development.js:19174 updateContextProvider @ react-dom.development.js:21154 beginWork @ react-dom.development.js:21649 beginWork$1 @ react-dom.devel您的代码应如下所示:RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) 处的 const MyComponent = lazy(() => import('./MyComponent'))路由(http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5)在路由器应用程序的悬念(http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204 :15) 在 BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @react_devtools_backend.js:4012 printWarning @react.development.js:209 error @react.development。 js:183 lazyInitializer @react.development.js:1400 resolveLazy @react-dom.development.js:14907 reconcileSingleElement @react-dom.development.js:15718 reconcileChildFibers @react-dom.development.js:15808 reconcileChildren @react-dom .development.js:19174 updateContextProvider @react-dom.development.js:21154 beginWork @react-dom.development.js:21649 beginWork$1 @react-dom.devel opment.js:27426 performUnitOfWork @ react-dom.development.js:26557 workLoopConcurrent @ react-dom.development.js:26543 renderRootConcurrent @ react-dom.development.js:26505 performConcurrentWorkOnRoot @ react-dom.development.js:25738 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. opment.js:27426 performUnitOfWork @react-dom.development.js:26557 workLoopConcurrent @react-dom.development.js:26543 renderRootConcurrent @react-dom.development.js:26505 performConcurrentWorkOnRoot @react-dom.development.js:25738 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development.js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react_devtools_backend.js:4012 Warning: lazy: Expected the result of a dynamic import() call. @task.js:61 run @task.js:35 listener @task.js:46 react_devtools_backend.js:4012 警告:惰性:预期动态 import() 调用的结果。 Instead received: [object Module]而是收到:[对象模块]

Your code should look like: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) at Routes (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) at Suspense at App at Router (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204:15) at BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react.development.js:183 lazyInitializer @ react.development.js:1400 mountLazyComponent @ react-dom.development.js:19944 beginWork @ react-dom.development.js:21593 beginWork$1 @ react-dom.development.js:27426 performUnitOfWork @ react-dom.development.js:26557 workLoopConcurrent @ react-dom.development.js:26543 renderRootConcurrent @ react-dom.development.js:26505 performConcurrentWorkOnRoot 你的代码应该是这样的: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5 ) 路由 (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) :5204:15) 在 BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react。 development.js:183 lazyInitializer @ react.development.js:1400 mountLazyComponent @ react-dom.development.js:19944 beginWork @ react-dom.development.js:21593 beginWork$1 @ react-dom.development.js:27426 performUnitOfWork @ react-dom.development.js:26557 workLoopConcurrent @react-dom.development.js:26543 renderRootConcurrent @react-dom.development.js:26505 performConcurrentWorkOnRoot @ react-dom.development.js:25738 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. @react-dom.development.js:25738 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development.js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react_devtools_backend.js:4012 Warning: lazy: Expected the result of a dynamic import() call. @task.js:61 run @task.js:35 listener @task.js:46 react_devtools_backend.js:4012 警告:惰性:预期动态 import() 调用的结果。 Instead received: [object Module]而是收到:[对象模块]

Your code should look like: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) at Routes (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) at Suspense at App at Router (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204:15) at BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react.development.js:183 lazyInitializer @ react.development.js:1400 mountLazyComponent @ react-dom.development.js:19944 beginWork @ react-dom.development.js:21593 callCallback @ react-dom.development.js:4164 invokeGuardedCallbackDev @ react-dom.development.js:4213 invokeGuardedCallback @ react-dom.development.js:4277 beginWork$1 @ react-dom.development.js:27451 performUnitOfWork @ react-dom你的代码应该是这样的: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5 ) 路由 (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) :5204:15) 在 BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react。 development.js:183 lazyInitializer @react.development.js:1400 mountLazyComponent @react-dom.development.js:19944 beginWork @react-dom.development.js:21593 callCallback @react-dom.development.js:4164 invokeGuardedCallbackDev @react -dom.development.js:4213 invokeGuardedCallback @react-dom.development.js:4277 beginWork$1 @react-dom.development.js:27451 performUnitOfWork @react-dom .development.js:26557 workLoopConcurrent @ react-dom.development.js:26543 renderRootConcurrent @ react-dom.development.js:26505 performConcurrentWorkOnRoot @ react-dom.development.js:25738 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. .development.js:26557 workLoopConcurrent @ react-dom.development.js:26543 renderRootConcurrent @ react-dom.development.js:26505 performConcurrentWorkOnRoot @ react-dom.development.js:25738 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react-dom.development.js:20013 Uncaught Error: Element type is invalid. @task.js:61 run @task.js:35 listener @task.js:46 react-dom.development.js:20013 未捕获错误:元素类型无效。 Received a promise that resolves to: undefined.收到解决为:未定义的承诺。 Lazy element type must resolve to a class or function.惰性元素类型必须解析为类或函数。 at mountLazyComponent (react-dom.development.js:20013:1) at beginWork (react-dom.development.js:21593:1) at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1) at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1) at invokeGuardedCallback (react-dom.development.js:4277:1) at beginWork$1 (react-dom.development.js:27451:1) at performUnitOfWork (react-dom.development.js:26557:1) at workLoopConcurrent (react-dom.development.js:26543:1) at renderRootConcurrent (react-dom.development.js:26505:1) at performConcurrentWorkOnRoot (react-dom.development.js:25738:1) mountLazyComponent @ react-dom.development.js:20013 beginWork @ react-dom.development.js:21593 callCallback @ react-dom.development.js:4164 invokeGuardedCallbackDev @ react-dom.development.js:4213 invokeGuardedCallback @ react-dom.development.js:4277 beginWork$1 @ react-dom.development.js:27451 performUnitOfWork @ react-dom.development.js:26557 workLoopConcurrent @ react-dom.development.js:26543 renderRootC在 mountLazyComponent (react-dom.development.js:20013:1) 在 beginWork (react-dom.development.js:21593:1) 在 HTMLUnknownElement.callCallback (react-dom.development.js:4164:1) 在对象。在 performUnitOfWork(反应- dom.development.js:26557:1) 在 workLoopConcurrent (react-dom.development.js:26543:1) 在 renderRootConcurrent (react-dom.development.js:26505:1) 在 performConcurrentWorkOnRoot (react-dom.development.js :25738:1) mountLazyComponent @react-dom.development.js:20013 beginWork @react-dom.development.js:21593 callCallback @react-dom.development.js:4164 invokeGuardedCallbackDev @react-dom.development.js:4213 invokeGuardedCallback @react-dom.development.js:4277 beginWork$1 @react-dom.development.js:27451 performUnitOfWork @react-dom.development.js:26557 workLoopConcurrent @react-dom.development.js:26543 renderRootC oncurrent @ react-dom.development.js:26505 performConcurrentWorkOnRoot @ react-dom.development.js:25738 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. oncurrent @ react-dom.development.js:26505 performConcurrentWorkOnRoot @react-dom.development.js:25738 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development.js:533 队列. @ task.js:61 run @ task.js:35 listener @ task.js:46 react_devtools_backend.js:4012 Warning: lazy: Expected the result of a dynamic import() call. @task.js:61 run @task.js:35 listener @task.js:46 react_devtools_backend.js:4012 警告:惰性:预期动态 import() 调用的结果。 Instead received: [object Module]而是收到:[对象模块]

Your code should look like: const MyComponent = lazy(() => import('./MyComponent')) at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) at Routes (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) at Suspense at App at Router (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204:15) at BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react.development.js:183 lazyInitializer @ react.development.js:1400 resolveLazy @ react-dom.development.js:14907 reconcileSingleElement @ react-dom.development.js:15718 reconcileChildFibers @ react-dom.development.js:15808 reconcileChildren @ react-dom.development.js:19174 updateContextProvider @ react-dom.development.js:21154 beginWork @ react-dom.development.js:21649 beginWork$1 @ react-dom.devel您的代码应如下所示:RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) 处的 const MyComponent = lazy(() => import('./MyComponent'))路由(http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5)在路由器应用程序的悬念(http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204 :15) 在 BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @react_devtools_backend.js:4012 printWarning @react.development.js:209 error @react.development。 js:183 lazyInitializer @react.development.js:1400 resolveLazy @react-dom.development.js:14907 reconcileSingleElement @react-dom.development.js:15718 reconcileChildFibers @react-dom.development.js:15808 reconcileChildren @react-dom .development.js:19174 updateContextProvider @react-dom.development.js:21154 beginWork @react-dom.development.js:21649 beginWork$1 @react-dom.devel opment.js:27426 performUnitOfWork @ react-dom.development.js:26557 workLoopSync @ react-dom.development.js:26466 renderRootSync @ react-dom.development.js:26434 recoverFromConcurrentError @ react-dom.development.js:25850 performConcurrentWorkOnRoot @ react-dom.development.js:25750 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. opment.js:27426 performUnitOfWork @react-dom.development.js:26557 workLoopSync @react-dom.development.js:26466 renderRootSync @react-dom.development.js:26434 recoverFromConcurrentError @react-dom.development.js:25850 performConcurrentWorkOnRoot @react-dom.development.js:25750 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development.js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react_devtools_backend.js:4012 Warning: lazy: Expected the result of a dynamic import() call. @task.js:61 run @task.js:35 listener @task.js:46 react_devtools_backend.js:4012 警告:惰性:预期动态 import() 调用的结果。 Instead received: [object Module]而是收到:[对象模块]

Your code should look like: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) at Routes (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) at Suspense at App at Router (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204:15) at BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react.development.js:183 lazyInitializer @ react.development.js:1400 mountLazyComponent @ react-dom.development.js:19944 beginWork @ react-dom.development.js:21593 beginWork$1 @ react-dom.development.js:27426 performUnitOfWork @ react-dom.development.js:26557 workLoopSync @ react-dom.development.js:26466 renderRootSync @ react-dom.development.js:26434 recoverFromConcurrentError @ react-dom.d你的代码应该是这样的: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5 ) 路由 (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) :5204:15) 在 BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react。 development.js:183 lazyInitializer @ react.development.js:1400 mountLazyComponent @ react-dom.development.js:19944 beginWork @ react-dom.development.js:21593 beginWork$1 @ react-dom.development.js:27426 performUnitOfWork @ react-dom.development.js:26557 workLoopSync @react-dom.development.js:26466 renderRootSync @react-dom.development.js:26434 recoverFromConcurrentError @react-dom.d evelopment.js:25850 performConcurrentWorkOnRoot @ react-dom.development.js:25750 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. evelopment.js:25850 performConcurrentWorkOnRoot @react-dom.development.js:25750 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development.js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react_devtools_backend.js:4012 Warning: lazy: Expected the result of a dynamic import() call. @task.js:61 run @task.js:35 listener @task.js:46 react_devtools_backend.js:4012 警告:惰性:预期动态 import() 调用的结果。 Instead received: [object Module]而是收到:[对象模块]

Your code should look like: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) at Routes (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) at Suspense at App at Router (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204:15) at BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react.development.js:183 lazyInitializer @ react.development.js:1400 mountLazyComponent @ react-dom.development.js:19944 beginWork @ react-dom.development.js:21593 callCallback @ react-dom.development.js:4164 invokeGuardedCallbackDev @ react-dom.development.js:4213 invokeGuardedCallback @ react-dom.development.js:4277 beginWork$1 @ react-dom.development.js:27451 performUnitOfWork @ react-dom你的代码应该是这样的: const MyComponent = lazy(() => import('./MyComponent')) at Lazy at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5 ) 路由 (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) :5204:15) 在 BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5) overrideMethod @ react_devtools_backend.js:4012 printWarning @ react.development.js:209 error @ react。 development.js:183 lazyInitializer @react.development.js:1400 mountLazyComponent @react-dom.development.js:19944 beginWork @react-dom.development.js:21593 callCallback @react-dom.development.js:4164 invokeGuardedCallbackDev @react -dom.development.js:4213 invokeGuardedCallback @react-dom.development.js:4277 beginWork$1 @react-dom.development.js:27451 performUnitOfWork @react-dom .development.js:26557 workLoopSync @ react-dom.development.js:26466 renderRootSync @ react-dom.development.js:26434 recoverFromConcurrentError @ react-dom.development.js:25850 performConcurrentWorkOnRoot @ react-dom.development.js:25750 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. .development.js:26557 workLoopSync @react-dom.development.js:26466 renderRootSync @react-dom.development.js:26434 recoverFromConcurrentError @react-dom.development.js:25850 performConcurrentWorkOnRoot @react-dom.development.js:25750 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development.js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react-dom.development.js:20013 Uncaught Error: Element type is invalid. @task.js:61 run @task.js:35 listener @task.js:46 react-dom.development.js:20013 未捕获错误:元素类型无效。 Received a promise that resolves to: undefined.收到解决为:未定义的承诺。 Lazy element type must resolve to a class or function.惰性元素类型必须解析为类或函数。 at mountLazyComponent (react-dom.development.js:20013:1) at beginWork (react-dom.development.js:21593:1) at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1) at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1) at invokeGuardedCallback (react-dom.development.js:4277:1) at beginWork$1 (react-dom.development.js:27451:1) at performUnitOfWork (react-dom.development.js:26557:1) at workLoopSync (react-dom.development.js:26466:1) at renderRootSync (react-dom.development.js:26434:1) at recoverFromConcurrentError (react-dom.development.js:25850:1) mountLazyComponent @ react-dom.development.js:20013 beginWork @ react-dom.development.js:21593 callCallback @ react-dom.development.js:4164 invokeGuardedCallbackDev @ react-dom.development.js:4213 invokeGuardedCallback @ react-dom.development.js:4277 beginWork$1 @ react-dom.development.js:27451 performUnitOfWork @ react-dom.development.js:26557 workLoopSync @ react-dom.development.js:26466 renderRootSync @ react-dom.dev在 mountLazyComponent (react-dom.development.js:20013:1) 在 beginWork (react-dom.development.js:21593:1) 在 HTMLUnknownElement.callCallback (react-dom.development.js:4164:1) 在对象。在 performUnitOfWork(反应- dom.development.js:26557:1) 在 workLoopSync (react-dom.development.js:26466:1) 在 renderRootSync (react-dom.development.js:26434:1) 在 recoverFromConcurrentError (react-dom.development.js :25850:1) mountLazyComponent @react-dom.development.js:20013 beginWork @react-dom.development.js:21593 callCallback @react-dom.development.js:4164 invokeGuardedCallbackDev @react-dom.development.js:4213 invokeGuardedCallback @react-dom.development.js:4277 beginWork$1 @react-dom.development.js:27451 performUnitOfWork @react-dom.development.js:26557 workLoopSync @react-dom.development.js:26466 renderRootSync @react-dom。开发elopment.js:26434 recoverFromConcurrentError @ react-dom.development.js:25850 performConcurrentWorkOnRoot @ react-dom.development.js:25750 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. elopment.js:26434 recoverFromConcurrentError @react-dom.development.js:25850 performConcurrentWorkOnRoot @react-dom.development.js:25750 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development .js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react_devtools_backend.js:4012 The above error occurred in the <Route.Provider> component: @task.js:61 run @task.js:35 listener @task.js:46 react_devtools_backend.js:4012 <Route.Provider> 组件出现以上错误:

 at RenderedRoute (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:4840:5) at Routes (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5272:5) at Suspense at App at Router (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:5204:15) at BrowserRouter (http://localhost:4200/vendors-node_modules_react-router-dom_dist_index_js.js:3464:5)

Consider adding an error boundary to your tree to customize error handling behavior.考虑向树中添加错误边界以自定义错误处理行为。 Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.访问https://reactjs.org/link/error-boundaries以了解有关错误边界的更多信息。 overrideMethod @ react_devtools_backend.js:4012 logCapturedError @ react-dom.development.js:18687 update.callback @ react-dom.development.js:18720 callCallback @ react-dom.development.js:13923 commitUpdateQueue @ react-dom.development.js:13944 commitLayoutEffectOnFiber @ react-dom.development.js:23391 commitLayoutMountEffects_complete @ react-dom.development.js:24688 commitLayoutEffects_begin @ react-dom.development.js:24674 commitLayoutEffects @ react-dom.development.js:24612 commitRootImpl @ react-dom.development.js:26823 commitRoot @ react-dom.development.js:26682 finishConcurrentRender @ react-dom.development.js:25892 performConcurrentWorkOnRoot @ react-dom.development.js:25809 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 queue. overrideMethod @react_devtools_backend.js:4012 logCapturedError @react-dom.development.js:18687 update.callback @react-dom.development.js:18720 callCallback @react-dom.development.js:13923 commitUpdateQueue @react-dom.development。 js:13944 commitLayoutEffectOnFiber @react-dom.development.js:23391 commitLayoutMountEffects_complete @react-dom.development.js:24688 commitLayoutEffects_begin @react-dom.development.js:24674 commitLayoutEffects @react-dom.development.js:24612 commitRootImpl @react -dom.development.js:26823 commitRoot @react-dom.development.js:26682 finishConcurrentRender @react-dom.development.js:25892 performConcurrentWorkOnRoot @react-dom.development.js:25809 workLoop @scheduler.development.js:266 flushWork @scheduler.development.js:239 performWorkUntilDeadline @scheduler.development.js:533 队列。 @ task.js:61 run @ task.js:35 listener @ task.js:46 react-dom.development.js:26923 Uncaught TypeError: Cannot read properties of undefined (reading 'displayName') at getDisplayName (react_devtools_backend.js:261:19) at getDisplayNameForFiber (react_devtools_backend.js:6381:55) at Object.markComponentErrored (react_devtools_backend.js:5615:29) at markComponentErrored (react-dom.development.js:5053:1) at handleError (react-dom.development.js:26307:1) at renderRootSync (react-dom.development.js:26437:1) at recoverFromConcurrentError (react-dom.development.js:25850:1) at performConcurrentWorkOnRoot (react-dom.development.js:25750:1) at workLoop (scheduler.development.js:266:1) at flushWork (scheduler.development.js:239:1) @task.js:61 run @task.js:35 listener @task.js:46 react-dom.development.js:26923 Uncaught TypeError: 无法在 getDisplayName (react_devtools_backend.js: 261:19) 在 getDisplayNameForFiber (react_devtools_backend.js:6381:55) 在 Object.markComponentErrored (react_devtools_backend.js:5615:29) 在 markComponentErrored (react-dom.development.js:5053:1) 在 handleError (react-dom. development.js:26307:1) 在 renderRootSync (react-dom.development.js:26437:1) 在 recoverFromConcurrentError (react-dom.development.js:25850:1) 在 performConcurrentWorkOnRoot (react-dom.development.js:25750) :1) 在 workLoop (scheduler.development.js:266:1) 在 flushWork (scheduler.development.js:239:1)

What am I doing wrong or what's missing here?我做错了什么或这里缺少什么? Is there an example how to use this documentation to combine React and Angular?是否有如何使用本文档结合 React 和 Angular 的示例? If you do the same steps with only React or only Angular it works fine..如果您仅使用 React 或仅使用 Angular 执行相同的步骤,则效果很好。

Hope someone can help..希望有人能帮忙..

Angular Micro Frontend:角度微前端: 在此处输入图像描述

Shell Application:外壳应用: 在此处输入图像描述

React Micro Frontend反应微前端在此处输入图像描述

I do not exactly know what is wrong on your configuration, but to use different technologies together with module-federation please take a look here:我不完全知道你的配置有什么问题,但是要将不同的技术与模块联合结合使用,请看这里:

https://www.angulararchitects.io/aktuelles/multi-framework-and-version-micro-frontends-with-module-federation-your-4-steps-guide/ https://www.angulararchitects.io/aktuelles/multi-framework-and-version-micro-frontends-with-module-federation-your-4-steps-guide/

There is a very good example how to combine different technologies together.有一个很好的例子,说明如何将不同的技术结合在一起。 I hope that helps.我希望这有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM