标签: micro-frontend

动态创建的模块和组件无权访问父注入器

我们目前有一个问题,我们想动态创建一个模块(moduleFactory.create(this.injector))。但是动态创建的模块的注入器没有来自父注入器的提供者。我们希望在我们的集成/主应用程序(创建子模块的地方)中实现一些核心内容,将其放入根注入器,并希望通过 DI(通过注入器,由主注入器创建)将其放入我们的子模块和组件中应用程序的注入器作为父级)。

我们的实现基于这个例子:https : //stackblitz.com/edit/angular-ifs7sp?file=src%2Fapp%2Flazy-loader.service.ts

const subsystems = await this.fetchSubsystems()

const promises = subsystems
  .map(async (subsystem) => await subsystem.load())

const subsystemModuleFactories = await Promise.all(promisses)

subsystemModuleFactories.map(async (ngModuleOrNgModuleFactory) => {
  let moduleFactory: NgModuleFactory<any>
  if (ngModuleOrNgModuleFactory instanceof NgModuleFactory) {
    moduleFactory = ngModuleOrNgModuleFactory
  } else {
    const compiler = this.injector.get(Compiler)
    moduleFactory = await compiler.compileModuleAsync(ngModuleOrNgModuleFactory)
  }

  const entryComponent = (<any>moduleFactory.moduleType).entry
  const moduleRef = moduleFactory.create(this.injector) // create the module ref with the injector of the main app as parent of the subsystem module …
Run Code Online (Sandbox Code Playgroud)

dependency-injection microservices angular micro-frontend

5
推荐指数
0
解决办法
454
查看次数

Angular 作为 Webpack 外部

我目前正在尝试通过 Webpack 外部对象外部化 Angular 依赖项来缩短构建时间。到目前为止,我已经为 React 和其他小库实现了这一目标。

如果我只是移动 '@angular/compiler' 它也可以工作,但是当外部化 '@angular/core' 和其他人时,我Can't resolve all parameters for ApplicationModule: (?) at at syntaxError (util.ts:100) at CompileMetadataResolver._getDependenciesMetadata (metadata_resolver.ts:957) ...在引导应用程序时收到错误。

我使用的文件是您可以在 unpkg.com 中找到的 8.2.14 UMD 包,我的外部文件是:

[
    /^@example\, 
    /^rxjs$/, 
    /^rxjs\/operators$/, 
    /^@angular\/core$/, 
    /^@angular\/compiler$/, 
    /^@angular\/common$/, 
    /^@angular\/common\/http$/, 
    /^@angular\/forms$/, 
    /^@angular\/platform-browser$/, 
    /^@angular\/platform-browser-dynamic$/, 
    /^@angular\/router$/, 
    /^zone\.js$/,
    /^single-spa$/
]
Run Code Online (Sandbox Code Playgroud)

rxjs 包是在https://cdn.jsdelivr.net/npm/@esm-bundle 中找到的包。

您可以在此 repo 上看到错误:https : //github.com/OriolInvernonLlaneza/test-share-angular

提前致谢!

编辑:多亏了 yurzui 的回答,这个错误得到了解决。但是,我现在收到另一个错误:

Class constructor I cannot be invoked without 'new'
    at new EventEmitter (event_emitter.ts:78)
    at new NgZone (ng_zone.ts:97) …
Run Code Online (Sandbox Code Playgroud)

webpack webpack-externals angular micro-frontend single-spa-angular

5
推荐指数
1
解决办法
1675
查看次数

如何在单一spa中的不同微应用之间共享数据

我了解如何在使用时将自定义道具传递给不同的微应用程序single-spa,但我想知道如何获取 api 调用表单 app1 的输出并在 app2 中使用它。app1 正在使用react-redux,app2 将使用react hooks

import {registerApplication, start} from 'single-spa'


registerApplication(
    'navBar',          // Name of this single-spa application
    () => import('./nav/navbar.app.js').then(module => module.navBar),
    () => true
)

registerApplication(
  'app1',          // Name of this single-spa application
  () => import('./root.app.js'),//loadingFunction, // Our loading function
  () => true, //activityFunction // Our activity function
)

registerApplication(
    'app2',          // Name of this single-spa application
    () => import('./app2/app2.app.js').then(module => module.app2),
    location =>
        location.pathname === '/app2' …
Run Code Online (Sandbox Code Playgroud)

reactjs webpack micro-frontend single-spa

4
推荐指数
1
解决办法
1万
查看次数

如何从网站正确删除或卸载 React App

在我的网站中,我有一个按钮可以在特定的 div 中启动反应应用程序。当我点击它时,我创建一个反应根 div 并在里面渲染反应应用程序。关闭它的正确方法是什么?

   <!--HTML from the website -->
  <body>
    <button id="btn">Launch React App</button>
    
    <script type="module" src="/src/main.tsx"></script>
  </body>
Run Code Online (Sandbox Code Playgroud)
//main.js from the react App
import React from "react";
import ReactDOM from "react-dom/client";
import "./global.scss";
import App from "./App";

const btn = document.getElementById("btn");

btn.onclick = () => {
  const root_div = document.createElement("div");
  root_div.id    = "root";
  document.body.appendChild(root_div);

  const root = ReactDOM.createRoot(root_div);

  root.render(
    <React.StrictMode>
      <App />
    </React.StrictMode>
  );
};
Run Code Online (Sandbox Code Playgroud)

render root unmount reactjs micro-frontend

4
推荐指数
1
解决办法
7325
查看次数

由 Module Federation 和 React-router-dom v6 实现的微前端

我开始使用带有 Module Federation Plugin 的微前端。现在我在应用程序之间构建路由时面临一些问题。我的主机应用程序有路线 3 mfe 应用程序。他们每个人的内部都有自己的路由。Host-app 中的导航正常工作,就像内部导航一样,但是当我在 hostApp/app1/somePage1 上再次单击导航到 hostApp/app1 时,它仍然呈现 hostApp/app1/somePage1。您可以推荐什么架构?我如何控制它?现在我使用react-router-dom V6,但我想构建应用程序,以便明天我可以添加另一个库,例如 Angular-router 或 bla-bla-bla-Router,而无需对主机进行任何更改

export default function HostApp() {
 return (
  <BrowserRouter>
     <div>Hello, I'm the host app!</div>
     <NavLink to='/app1'> <button> app1 </button> </NavLink>
     <NavLink to='/app2'> <button> app1 </button> </NavLink>
     <NavLink to='/app3'> <button> app1 </button> </NavLink>
     <Routes>
       <Route path='/' element={
          <Suspense fallback={'Loading'}><div>home page container</div></Suspense>} />
       <Route path='app1/*' element={ 
          <Suspense fallback={'Loading'}> <MfeApp1/></Suspense>}/>
       <Route path='app2/*' element={ 
          <Suspense fallback={'Loading'}> <MfeApp2/></Suspense>}/>
       <Route path='app3/*' element={ 
          <Suspense fallback={'Loading'}> <MfeApp3/></Suspense>}/>
    </Routes>
  </BrowserRouter>
)}
Run Code Online (Sandbox Code Playgroud)

Mfe应用程序: …

routes react-router-dom micro-frontend webpack-module-federation

4
推荐指数
1
解决办法
2万
查看次数

Angular 模块联合和远程服务

I\xc2\xb4m 将 Angular Web 分解为多个微前端。其中一个微前端负责处理购物车,并且它有一项服务来存储已添加的产品。我的 shell 微前端需要使用该服务在图标中显示汽车中有多少物品、添加新物品等。

\n

我可以在微前端中使用存储在不同微前端中的服务吗?

\n

我\xc2\xb4m 使用本教程,但它只解释了如何路由另一个微前端中的页面。

\n

谢谢。

\n

angular micro-frontend webpack-module-federation

2
推荐指数
1
解决办法
3791
查看次数

微前端之间的反应上下文

太长了;如何在反应微前端之间使用单一上下文?

应用程序分为多个微前端或反应应用程序。其中每个都在不同的端口上运行。容器正在托管其他微前端。每个都是一个单独的反应应用程序,并且它是一个运行时集成。(我使用martinfowler示例来实现微前端)

目前通过 URL 和浏览器存储(localStorage/cookies)将一些数据传递到其他微前端。

我需要使用 React Context 在这些 React 应用程序 (MFE) 之间传递数据。

我已经在容器(ReactApp1)中定义了 ReactContext Provider 并存储了值(比如 color=black)。要在较低级别的微前端 (ReactApp2) 中访问此颜色,我们需要可从任何微前端获取上下文。如何使其可用?

(注意:我不想使用 localStorage 或 cookie 进行全局数据共享)

<Container>
  <LowerLevelMFE1/>
  <LowerLevelMFE2/>
  ...
</Container>
Run Code Online (Sandbox Code Playgroud)

reactjs react-context micro-frontend

2
推荐指数
2
解决办法
7289
查看次数

如何在 Vue 生态系统之外使用 Vue 3 响应式对象

我试图在微前端应用程序中传递这样创建的全局状态。但问题是我必须以某种方式“观察”更改,以便在 React 应用程序中设置 State。

全局状态.js

import { reactive } from 'vue'

const globalState = reactive({
  counter: 0
})

export default globalState
Run Code Online (Sandbox Code Playgroud)

在 Vue 微前端中,我这样做并且工作正常

import { createApp } from 'vue'
import App from './App.vue'

export default (rootEl, globalState) => {
  const app = createApp(App)
  app.config.globalProperties.globalState = globalState
  app.mount(rootEl)
}
Run Code Online (Sandbox Code Playgroud)

然而,在 React 应用程序中,我正确地传递了引用,但是当计数器值发生变化时,我必须以某种方式检测它并调用 setState 才能重新呈现更改。问题是我如何观察 Vue 生态系统之外的反应式对象引用的变化。

reactjs vue.js micro-frontend vuejs3

2
推荐指数
1
解决办法
3419
查看次数

Angular微前端无限刷新

我正在尝试使用 webpack 模块联合构建 Angular Micro 前端。我已将所有自定义 webpack 文件添加到应用程序中。所有应用程序都构建良好。另外,当我尝试从各自的路径访问各个微前端时,它工作正常,但是当我尝试从 shell 应用程序访问各个微前端时,它会遇到无限刷新。我正在关注这篇文章作为参考。

不知道除了本文中提到的之外我还需要做什么。任何帮助都会得到帮助。

angular micro-frontend webpack-module-federation

2
推荐指数
1
解决办法
1804
查看次数

应用程序在 UNMOUNTING 状态下死亡:无法读取未定义的属性“注入器”

我正在使用 Single-Spa-Angular 库构建微前端。我使用“ng add single-spa-angular”创建了三个不同的子应用程序,其中两个应用程序工作正常,但一个应用程序显示以下错误:

Uncaught app2: Application 'app2' died in status UNMOUNTING: Cannot read property 'injector' of undefined
    at http://<HOSTNAME>:4202/main.js:204363:53
Run Code Online (Sandbox Code Playgroud)

Uncaught app2: Application 'app2' died in status SKIP_BECAUSE_BROKEN: In this configuration Angular requires Zone.js
    at new NgZone (http://<HOST>:4202/main.js:68725:19)
    at getNgZone (http://<HOST>:4202/main.js:69414:13)
    at PlatformRef../node_modules/@angular/core/fesm5/core.js.PlatformRef.bootstrapModuleFactory (http://<HOST>:4202/main.js:69312:22)
    at http://<HOST>:4202/main.js:69356:59
Run Code Online (Sandbox Code Playgroud)

谁能帮我吗。

谢谢沙希·布山·维尔玛

single-page-application angularjs-injector angular micro-frontend

1
推荐指数
1
解决办法
6784
查看次数

有什么方法可以显示加载程序,直到微型应用程序加载到单个 spa 项目中

我正在为我当前的项目使用单个 spa 并希望有一个加载程序,直到我的微应用程序被加载并且这些微应用程序之间会有一个切换,在这种情况下我也想显示一个加载程序。有没有办法达到同样的目标?

javascript micro-frontend single-spa-angular single-spa

1
推荐指数
1
解决办法
766
查看次数

如何使用 RxJs 在 single-spa 中共享 UI 状态?

根据 single-spa 官方文档,我们可以使用 RxJs 共享应用程序的 UI 状态。

Observables / Subjects (RxJs) - 一个微前端向一个流发出新值,该流可以被任何其他微前端使用。它从其浏览器模块中将 observable 导出到所有微前端,以便其他人可以导入它。

链接:https : //single-spa.js.org/docs/recommended-setup/#ui-state

链接:https : //single-spa.js.org/docs/faq/#how-can-i-share-application-state-between-applications

我试图在 React 中创建一个示例,其中我使用 single-spa 包裹将我的微应用程序包含在根应用程序中。我试图使用 RxJs 共享 UI 状态。当我在 google 上搜索 single-spa RxJs 时,我什么也没找到。谁能为我提供一个基本示例,我将能够为以下用例共享 UI 状态:

  • 将 UI 状态从根应用程序共享到我的微应用程序。
  • 将 UI 状态从微应用共享到根应用。
  • 在微应用之间共享 UI 状态。

micro-frontend single-spa-angular single-spa

1
推荐指数
1
解决办法
3121
查看次数

Angular、Nx Workspace、Webpack 5 模块联合:您在需要流的地方提供了无效对象

我目前正在开发一个使用 Webpack 5 的模块联合的项目。该项目包含 Angular 12 应用程序:一个应用程序是 shell,另一个应用程序是应加载到 shell 中的远程应用程序。两个应用程序本身都运行得很好,但是将遥控器导入 shell 应用程序时会出现以下错误:

core.js:6479 ERROR TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:27)
    at innerSubscribe (innerSubscribe.js:71)
    at MergeMapSubscriber._innerSub (mergeMap.js:57)
    at MergeMapSubscriber._tryNext (mergeMap.js:51)
    at MergeMapSubscriber._next (mergeMap.js:34)
    at MergeMapSubscriber.next (Subscriber.js:49)
    at Observable._subscribe (subscribeToArray.js:3)
    at Observable._trySubscribe (Observable.js:42)
    at Observable.subscribe (Observable.js:28)
    at MergeMapOperator.call (mergeMap.js:19)
Run Code Online (Sandbox Code Playgroud)

远程应用程序正在向 REST 接口和 GraphQL 接口发出请求。似乎在执行请求并返回可观察值时发生错误。我的猜测是我的依赖项导致了问题。这些是我当前安装的依赖项:

core.js:6479 ERROR TypeError: You provided an invalid object where a stream …
Run Code Online (Sandbox Code Playgroud)

rxjs angular micro-frontend webpack-5 webpack-module-federation

1
推荐指数
1
解决办法
1229
查看次数