Contact information

xianglong, changsha, hunan province

We are available 24/ 7. Call Now. ccsunnydev@gmail.com
Avatar photo

什么是微前端

微前端是一种用于构建大型前端应用程序的架构模式,旨在解决单体前端应用程序的复杂性和可扩展性问题。微前端的核心思想是将一个大型前端应用拆分为多个独立的、可独立开发、测试和部署的小型前端应用,每个应用都可以有自己的技术栈和开发团队,以及独立的生命周期。

前端实现方式

实现微前端有多种方式,以下是目前一些常见的实现方式:

  1. 基于 Web Components 的微前端:Web Components 是一套标准化的技术,可以让开发者创建可重用的自定义 HTML 组件。基于 Web Components 的微前端架构使用自定义 Web Components 来组织和加载子应用。每个子应用都打包成一个独立的 Web Component,然后通过 JavaScript 动态加载到宿主页面中。
  2. 基于框架集成的微前端:一些主流的前端框架(如 React、Angular 和 Vue.js)提供了特定的解决方案来支持微前端。这些解决方案通过框架的插件或扩展,允许开发者将多个独立的前端应用集成到一个宿主页面中。常见的框架集成方案包括 single-spa、qiankun 和 Luigi 等。
  3. 基于路由的微前端:路由作为微前端应用之间通信和导航的一种机制,可以在不同的子应用之间进行切换和加载。主应用负责控制路由,并根据用户的导航选择加载对应的子应用。常见的路由管理库包括 single-spa 和 single-spa-router。
  4. 服务端集成的微前端:在一些场景下,微前端应用可能需要与后端服务进行紧密集成。这种情况下,可以通过在服务端使用类似微服务架构的方式来实现微前端。每个微前端应用可以由独立的团队开发和部署,通过后端服务和 API 进行交互。

值得注意的是,微前端是一种架构模式,而不是一个具体的技术。因此,无论选择哪种实现方式,都需要考虑以下核心原则:独立性、可扩展性、可组合性和隔离性。

微前端的好处

  1. 多团队扩展性

与传统的单体前端不同,微前端允许多个团队独立地在不同的软件部分上工作。

原始的工作团队被分成几个独立的团队,每个人都可以尽其所能地表达自己,在每个特定的任务上,每个团队都可以做出自己的决策,包括架构、编码风格和测试。

微前端在最终结果方面也很有用。通过让多个团队自由使用他们喜欢的技术,他们会感到不受限制,更有动力编写高质量的代码。

  1. 更快的开发和部署

微前端极大地改善了前端开发过程,因为不再有单个团队处理与单体前端相关的所有通信负载,现在有较小的自治团队,在同时处理不同功能的实现。

构建微前端比构建一个巨大的单体软件要快得多,这是发布新功能的重要一步。因此,实现时间显著提高。

  1. 采用不同的技术栈

每个微前端都可以使用不同的技术栈来实现,因为它们是自治的软件部分,这是一个巨大的优势。

这是因为单体前端的开发团队(具有单一技术栈)可以根据他们在特定技术栈方面的专业知识被分成几个团队。

另一方面,在同一项目中使用多个技术栈有助于聘请新开发人员。

  1. 易于维护的 Web 应用程序

单体应用程序在增长时很难维护。相比之下,微前端架构由小部分组成,非常容易测试和维护。

维护大型单体应用程序对开发人员来说是一项挑战,因为它需要很多时间,但采用微前端方法时,每个团队负责维护他们开发的功能。

此外,每个团队可以自由选择他们喜欢的测试工具和技术。

此外,通过使用小型软件片段,更容易理解每个功能的工作流程,在需要维护时更容易。

  1. 持续更新

通过实施微服务,增加了更新后端功能而不影响代码其他部分的灵活性。然而,单体前端仍然存在。

微前端旨在减少单体前端的大小和重要性,从而提供更大的前端更新灵活性。

这是因为微前端可以将单体前端分解成更小的组件,从而更容易更新每个业务流程,从而生成更多迭代更新的更好客户体验。

  1. 更小、更可管理的代码

由于其本质,微前端具有比单体前端少得多的代码量。这些代码更精确、更易于管理,因此开发人员不太可能因其复杂性而犯错误,并且可以更快地、更轻松地工作。

这在创建需要开发复杂工作流程的应用程序时非常重要。

  1. 功能重复使用

当开发具有共同工作流要求的多个应用程序时,微前端特别有益。通过使用微前端,公司可以利用功能的共同性,在创建新应用程序时节省时间和精力。

例如,如果公司有几个站点需要处理付款功能,则可以在所有应用程序中使用相同的功能,而不是每次从头开始创建。

核心概念

  • 容器(Host Application):主应用是微前端架构中的主要应用程序,它负责加载和协调多个独立的子应用。主应用通常提供共享的基础设施,如路由管理、身份验证和全局状态等,以及控制子应用的加载和通信。
  • 微应用(Micro Application):微应用是独立的前端应用程序,可以单独开发、测试和部署。微应用可以独立运行,也可以嵌入到主应用中作为一个子应用运行。每个微应用通常由自己的代码库、路由、状态管理和 UI 组件组成。
  • 接口(Interface Contract):微前端中使用接口契约来定义主应用和微应用之间的接口和通信规范。接口契约规定了微应用向主应用发送消息的格式、数据的含义以及可能的响应。通过遵循接口契约,主应用和微应用可以进行解耦合的通信。
  • 路由管理(Routing):微前端应用通常使用路由来处理不同子应用之间的导航和页面加载。主应用负责控制微应用之间的路由,并根据用户的导航选择加载对应的微应用。路由管理还有助于实现子应用之间的无刷新加载和前进/后退导航等功能。
  • 全局状态管理(Global State Management):当多个微应用需要共享和管理应用状态时,可采用全局状态管理的方法。这样可以确保不同子应用之间的状态同步和一致性。常用的全局状态管理库包括 Redux、Mobx 和 Vuex 等。
  • 构建和部署(Build & Deployment):在微前端架构中,每个微应用通常都有自己的构建和部署过程。每个微应用可以独立进行开发、构建和部署,这允许不同的团队、技术栈和版本控制。
  • JavaScript 沙箱(JavaScript Sandbox):在微前端中,多个独立的子应用可能同时运行在同一个宿主页面中,它们可能使用不同的 JavaScript 库和框架,甚至可能有不同的全局变量和函数。为了确保子应用之间的代码不会相互干扰,需要使用 JavaScript 沙箱来隔离它们的执行环境。JavaScript 沙箱可以将每个子应用的代码运行在独立的环境中,使用特定的技术,如浏览器的原生 iframe 或者一些第三方库(如 single-spa),来实现沙箱隔离。
  • CSS 隔离(CSS Isolation):在微前端中,不同的子应用可能使用不同的 CSS 类名和样式规则,它们可能有相同的类名,但是含义和样式却不同。为了确保子应用的样式不会相互干扰,需要进行 CSS 隔离。常见的 CSS 隔离方法有以下几种:
    • 命名空间:给每个子应用的样式添加一个唯一的命名空间前缀,以确保每个子应用中的样式都是唯一的,并不会与其他子应用的样式冲突。
    • CSS-in-JS:使用 CSS-in-JS 库,如 styled-components、Emotion 等,将 CSS 样式定义为 JavaScript 对象,并将其与子应用的其他组件绑定。这样可以确保每个组件使用的样式是独立的,不会与其他组件的样式冲突。
    • Shadow DOM:使用浏览器提供的 Shadow DOM 技术,将每个子应用的 DOM 和样式封装在一个 Shadow DOM 中,确保其样式不会对宿主页面或其他子应用产生影响。
  • Web Components(网络组件)是一组标准化的Web技术,可以用于创建可重用和独立的自定义HTML组件。Web Components包括以下几个主要技术:
    • Custom Elements(自定义元素):Custom Elements允许开发者创建自定义HTML元素并定义其行为。通过使用Custom Elements,开发者可以扩展HTML元素,创建具有自定义功能和行为的新元素,并在应用中重复使用。
    • Shadow DOM(影子DOM):Shadow DOM允许创建封装的DOM节点,将其隔离和保护在一个独立的作用域中。使用Shadow DOM,开发者可以为组件创建私有DOM结构,以避免与全局样式和脚本发生冲突,并确保组件的样式和行为不受外部影响。
    • HTML Templates(HTML模板):HTML Templates允许开发者定义可复用的HTML结构,其中包含占位符用于动态填充内容。模板可以在需要时被复制、克隆和插入到文档中,以生成重复使用的组件。

参考资料

  • https://www.aplyca.com/en/blog/micro-frontends-what-are-they-and-when-to-use-them
  • https://www.thoughtworks.com/insights/blog/architecture/micro-frontends-open-a-new-frontend-development-experience

Leave a Reply

Need a successful project?

Lets Work Together

Contact US
  • right image
  • Left Image