Ember应用
- 让我们使用Ember CLI在应用程序文件夹中创建Ember应用程序。
cd apps
ember new web-app --skip-npm --skip-bower --no-welcome --skip-git
cd ../
pnpm install
npm pkg set scripts.app="pnpm --filter web-app"
- 在Dev Server Run
pnpm app start
中启动Ember Web应用程序。
路线设置
更新Ember Router.js以创建2种新路由,与React Ember不同,Ember默认情况下带有路由器。在Ember中存在逻辑的一条普通路线和我们要安装管理员MFE的另一条管理路线。
Router.map(function () {
this.route('dashboard');
this.route('admin', function () {
this.route('item', { path: '*' });
});
});
我们不必模拟React MFE中存在的确切路由结构。取而代之的是,我们可以将应用程序加载到管理路线中,React将负责过渡到子路由并更新浏览器URL。
但是,问题是,当用户输入URL'/admin/groups'主机应用程序时,由于它不是根据的有效途径,因此当用户输入URL'/admin/groups'时。为了避免这种情况,我们创建了一条虚拟的儿童路线,称为item
admin内部具有Glog模式。
Navbar设置
- 让我们创建一个导航组件,以便我们可以从NAV栏中从主机和MFE路线进行导航并验证水疗中心。
touch apps/web-app/app/components/app-nav.hbs
touch apps/web-app/app/components/app-nav.js
app-nav.hbs
<nav>
<LinkTo @route='dashboard'>Dashboard</LinkTo>
<button {{on 'click' this.handleAdminClick}}>Admin</button>
</nav>
app-nav.js
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { service } from '@ember/service';
export default class AppNavComponent extends Component {
@service router;
@action handleAdminClick() {
if (this.router.currentURL.startsWith('/admin')) {
window.postMessage(
{ type: 'navigateToAdminMfeHome' },
window.location.origin
);
}
this.router.transitionTo('/admin');
}
}
注意:
Ember仅知道管理路线,如果用户已导航到React中的admin/groups
页面,即使浏览器URL已由React更新,Ember也不会意识到它。
如果用户单击“管理员”链接,则它不会做任何事情根路由如果用户在任何管理员路线中时单击Admin
Nav链接。
如果它们在其他路由器上,那么正常的过渡本身将起作用。
- 更新application.hbs文件以添加AppNav组件。
{{page-title 'WebApp'}}
<AppNav />
{{outlet}}
来自React消息的听众
- 就像主机应用程序如何发送事件以应对几个案例一样,React也将发送事件以捕获我们需要在应用程序级别上有一个侦听器,所以让我们创建一个。
touch apps/web-app/app/routes/application.js
import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default class ApplicationRoute extends Route {
@service router;
setupController() {
super.setupController(...arguments);
const { router } = this;
window.addEventListener('message', function (event) {
console.log('inside host app listener', event.data);
const { data } = event;
if (!data.type) {
return;
}
if (data.type === 'navigateToHost') {
router.transitionTo(data.payload.route);
}
});
}
}
如果您想从React导航到Ember路线,那么我们需要发送带有路由信息的navigateToHost
的帖子消息,以便Ember可以执行所需的过渡。
路由模板
- 按计划创建2个路由的路由模板,并如下更新内容
touch apps/web-app/app/templates/dashboard.hbs
touch apps/web-app/app/templates/admin.hbs
仪表板
Dashboard page present in ember
<LinkTo @route='admin.item' @model='groups'>Groups</LinkTo>
我们可以创建从Ember创建导航链接,以使用此管理员路由并传递模型Prop。
。Admin.hbs
<div {{admin-mfe-mount}}></div>
{{outlet}}
此文件中存在的此div将充当根div,我们将在其中安装所有管理员及其子路由的React Web组件应用程序。
管理MFE安装修饰符
我们将利用Ember修饰符包将React应用程序附加到Ember中的Div。
因此,让我们安装Ember修饰符包。
pnpm app add -D ember-modifier
创建Admin-Mfe-Mount修饰符,
mkdir apps/web-app/app/modifiers
touch apps/web-app/app/modifiers/admin-mfe-mount.js
import Modifier from 'ember-modifier';
export default class AdminMFEMountModifier extends Modifier {
modify(element) {
import('http://localhost:4173/admin-mfe.js').then((module) => {
module.mountApp({
element,
options: {
basename: '/',
baseURL: 'http://localhost:4173/',
},
});
});
}
}
现在运行Ember服务器并验证管理员MFE已成功渲染在给定元素中。
演示:
优点缺点
在Ember应用程序中使用了React MFE后,让我们讨论使用上述方法将React React React React纳入Ember.js应用程序的利弊。
优点
- 逐步迁移ember代码库
- 易于将应用程序分配给多个MFE,并为每个微货币提供一个专用团队。
- 提供了一个机会,可以摆脱不稳定的旧代码,并慢慢将旧代码转换为最新技术。
- 由于将其作为Web组件渲染,因此Cookie和会话将从主机应用程序中延长,因此无需在MFE中具有专用的身份验证机制,同时仍可以实现IFRAME方法提供的封装。
- 可以将MFE的整个版本和部署周期与主机应用程序分解。
缺点
- 框架在您的生产捆绑包中额外的40 kb(反应运行时)
样品回购
该帖子的代码托管在github here中。
请看一下GitHub存储库,让我知道您的反馈,在评论部分中查询。如果您觉得这里有更多的利弊,请告诉我们。