这是我参与12月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
微应用是怎么拆分和组合的?
- 微应用是由多个子应用和一个容器应用组成的,子应用之间相互独立,通过模块化的方式被容器应用启动和运行。通过容器应用进行启动和运行,可以有效避免模块之间在运行时发生的冲突;
- 各个子应用直接可以独立运行、编译,不限制子应用的依赖库类型;当某个子应用发生变更需要发版时,可独立发布,容器应用也可以独立发布。
如何避免子应用之间的代码冲突?
构建沙盒,例如使用 new Function ,使得子应用之间的变量都运行在函数作用域中,避免相互干扰。
微前端路由怎么实现?
微前端的路由是在容器应用中实现的,路由发生变化的时候,容器应用可拦截路由的变化,根据路由匹配相应的子应用,启用相应的子应用。
例如:
注册:
register([
{
name: 'sub-A',
entry: "http://localhost:1000",
container: "sub-A",
matchRouter: "/sub-A"
},
{
name: 'sub-B',
entry: "http://localhost:2000",
container: "sub-A",
matchRouter: "/sub-A"
}
])
使用:
// 去往子应用A
window.history.pushState('sub-A', '/sub-A');
// 去往子应用B
window.history.pushState('sub-B', '/sub-B');
微应用之间如何共享数据?
通过发布订阅模式进行共享,例如可以使用 RxJs 。
微应用如何在多个模块中共享组件?
- 将组件封装成动态组件,在 window 下暴露一个调用该模块动态组件的方法;
- 可以用 import-map 引用网络模块,但需要借助 systemjs ;
- 还可以通过 webpack 的 externals 属性,决定哪些模块不打包。
systemjs
微前端需要将微应用打包成模块,但是因为浏览器不支持模块化,因此需要引入 systemjs 实现浏览器模块化。 在开发阶段可以使用 ES模块化规范,使用 webpack 将 ES模块化规范 转换成 systemjs 支持的模块。