介绍
qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。
什么是微前端
微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。
微前端架构旨在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用后,随之而来的应用不可维护的问题。
微前端架构的核心思想是:一个应用由多个前端应用组成。每个前端应用都是一个独立的小团队通过独立的开发、测试、部署来进行独立的业务开发。在用户访问过程中,根据用户的访问路径,将不同的前端应用组合成一个完整的应用。
为什么要使用微前端
微前端架构的核心目标是将巨石应用拆分成多个可以自治的小应用,从而达到以下目标:
技术栈无关:主框架不限制接入应用的技术栈,微应用具备完全自主权
独立开发、独立部署:微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新
增量升级:在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略
独立运行时:每个微应用之间状态隔离,运行时状态不共享
微前端应用场景
多个团队:多个团队独立开发
多个项目:多个项目整合
独立开发:独立开发、独立部署
增量升级:渐进式重构
独立运行时:每个微应用之间状态隔离,运行时状态不共享
微前端的缺点
性能问题:每个微应用都有自己的依赖库和框架,这可能导致大量重复的代码和更大的应用大小。此外,多个运行时可能会导致内存和CPU资源的浪费。
增加了复杂性:微前端架构需要一个微服务的基础设施来支持它。你需要实现路由、状态管理、通信机制等微前端所需的功能,这都会增加应用的复杂性。
团队间的沟通成本增加:每个微应用由不同的团队开发和维护,这可能导致沟通和协作的困难。尤其是在跨应用的特性开发和bug修复时,需要很好的团队间的协调和沟通。
技术栈不一致问题 :不同的微应用可能使用不同的技术栈,这可能导致应用的一致性问题。虽然微前端架构允许使用不同的技术栈,但对于用户来说,应用间的切换应该是无缝的。
安全性问题:在微前端架构中,每个微应用都是独立的,因此需要单独处理安全问题,比如防止跨站脚本攻击(XSS)等。
测试的复杂性增加:由于每个微应用都是独立的,因此每个应用都需要进行单独的测试。同时,你还需要进行集成测试来确保所有应用能够正常协同工作。
常见微前端的实现方式
iframe 沙箱:这种方式最为简单。每个微应用都在各自的 iframe 中独立运行。这种方法的优点是隔离性好,微应用之间不会互相影响。但缺点也明显,包括 iframe 的性能问题、微应用之间的通信复杂以及无法共享上下文和组件等。为什么不使用iframe,具体可以查看这里。
Web Components:Web Components 是一种浏览器原生支持的技术,它允许创建可重用的自定义元素,并在其内部封装它们的功能。每个微应用都可以作为一个 web component,从而实现隔离。然而,这种方式的问题在于 web components 的浏览器兼容性。
JavaScript 框架: 这种方式依赖于 JavaScript 框架,比如 Single-SPA、qiankun 等。这些框架提供了微前端的解决方案,可以帮助我们进行微应用的加载、卸载、切换等,同时也提供了一些通信机制。但是这种方式需要引入额外的库和框架,可能会增加项目的复杂性。
qiankun 的特性
技术栈无关:主框架不限制接入应用的技术栈,微应用具备完全自主权
HTML Entry 接入方式:微应用接入方只需要提供一个入口 html,即可接入微前端系统的任意位置
样式隔离:确保微应用之间样式互相不干扰
JS 沙箱:确保微应用之间 全局变量/事件 不冲突
HTML 沙箱:确保微应用之间 DOM 结构不冲突
prefetch 预加载:在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度