【发布时间】:2022-08-04 20:49:18
【问题描述】:
我想实施一个隔离路由对于每个远程模块 一个Webpack 模块-联合 角应用。
每个远程都有自己的路由模块,但取决于 URL
传递给router.navigate 或routerLink,远程也可以覆盖应该专门负责主机/shell 应用程序的基本URL。
例如。
-
壳暴露于
localhost:4200 -
远程-a暴露于
localhost:4201 -
远程-b暴露于
localhost: 4202 -
远程-a由shell导入并暴露在
localhost:4200/remote-a -
远程-b由外壳导入并暴露在
localhost:4200/remote-b。
我想要的是:
- 每个应用程序路由都应该作为独立和远程工作;
-
remote-a用作远程时不应更改其基本 URLlocalhost:4200/remote-a; -
remote-b用作远程时不应更改其基本 URLlocalhost:4200/remote-b;
我们如何限制每个远程模块路由的行为,使其只能相对于自己的路径执行导航, 不允许它干扰其他遥控器和外壳/主机应用程序?
更新
根据我发现的一些文章
- https://www.angulararchitects.io/aktuelles/multi-framework-and-version-micro-frontends-with-module-federation-your-4-steps-guide/
- https://www.npmjs.com/package/@angular-architects/module-federation-tools?activeTab=readme#sub-routes
似乎更接近的解决方案如下:
如果您的微前端带有自己的路由器,您需要告诉您的外壳微前端将在 URL 中附加更多段。为此,您可以使用同样由@angular-architects/module-federation-tools 提供的startsWith 匹配器:
import { startsWith, WebComponentWrapper, WebComponentWrapperOptions } from \'@angular-architects/module-federation-tools\'; [...] export const APP_ROUTES: Routes = [ [...] { matcher: startsWith(\'angular3\'), component: WebComponentWrapper, data: { [...] } as WebComponentWrapperOptions }, [...] }为了完成这项工作,微前端也需要使用此处使用的路径前缀 angular3。由于路由配置只是一个数据结构,您将找到动态添加它的方法。
您能否进一步解释该解决方案的工作原理以及它是否可以满足我的要求?
-
我认为(目前)还没有真正的机制可以做你想做的事。但是,我想你可以让主机强行控制一些东西。最好不要让遥控器直接控制路由(仅通过对主机的“请求”)。
-
尝试以抽象的方式思考解决方案(我对 Angular 还没有深入的了解):如果每个遥控器都有一种单独的路由器,而不在外壳和其他遥控器之间共享它,是否可能/更容易?像这里github.com/kylecannon/angular-dream-stack 所示的东西?
-
这是一种可能的方法(但仍有一些警告)。 Angular 和 MFE 领域的许多人都在思考如何正确处理这个问题,以及如何将它很好地集成到 Angular 中(尽管这并不是 Angular 的具体问题)。我们选择根本不让遥控器控制路由,而是为主机使用的每个遥控器发送路由配置。这似乎效果很好,但显然不是在每种情况下都理想(例如,当遥控器也需要独立工作时)。
-
也许为每个遥控器提供一个动态的 APP_BASE_HREF 可以解决这个问题。 angular.io/api/common/APP_BASE_HREF
标签: angular webpack-module-federation