几个常见的微前端入门问题

1,308 阅读2分钟

这是我参与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
  • 还可以通过 webpackexternals 属性,决定哪些模块不打包。

systemjs

微前端需要将微应用打包成模块,但是因为浏览器不支持模块化,因此需要引入 systemjs 实现浏览器模块化。 在开发阶段可以使用 ES模块化规范,使用 webpack 将 ES模块化规范 转换成 systemjs 支持的模块。