前言
微前端是什么
一种将独立的前端应用组成一个更大的整体的架构风格
微前端是一种架构,将一个页面切分成若干个『微应用』,各个『微应用』可以独立部署,而且每个『微应用』可以供多个页面引入,达到复用的目的。
微前端有哪些形态
微前端并不是一种新的东西,它只是一种架构风格,在很早的一些 web 实践中,其实已经有它的身影:
- 通过后端模板集成:即通过后端配置路由,将一个 web 应用分割成若干个子应用
- 通过 iframe 集成:使用 iframe 分隔页面的多个部分。
比较常见一些形态:
- 通过 package 集成:将微应用发布成 node 包,供容器应用引入
- 通过
<script>
集成:每个”微应用”都对应一个<script>
标签,并且在加载时导出一个全局变量。然后,容器应用程序确定应该安装哪些微应用,并调用相关函数以告知微应用何时以及在何处进行渲染。 - 通过 Web Component 集成:每个微应用以自定义标签的形式引入。
以上就是微前端的一些应用形式,使用<script>
集成的方式往往是最灵活的,使用频率最高的一种方法。本文就这种方法在项目中的落地展开叙述。
为什么要接入微前端
需求分析
项目中,活动规则
模块,占据页面大量篇幅,其中以静态布局为主,但是每次都要复制大量文案,并且重新编写 html 等繁复的代码,当中其实耗费了大量的人力。
如何解决这个痛点呢?我们使用 『微前端』 + 『组件积木系统』的架构。
架构选择
在<script>
集成的架构中,我们要产出:
容器组件:多个 html 页面容器(html 模板),支持从积木系统注入容器属性。
微应用组件:多个可复用于容器中的微应用(React/Vue 组件),并且支持从积木系统注入自定义属性参数。
积木系统: 一个后台系统,用于存储多个容器组件(站点)数据。
在积木系统中,微前端中的容器组件称为『站点』,更贴近使用者。
实现原理
我们通过简单的代码和注释,直观地解释该架构的原理。
我们将微前端架构中的模板容器
对应到积木系统中的模板
或者 站点
,
而微应用
则对应到积木系统中的组件
而积木系统
,负责对模板
的配置数据 进行 增删改查 和 保存, 并拉通站点
发布功能。
模板容器
模板容器,在积木系统中称为模板(template),如果 一个站点 (site)仅仅包含一个 html 模板,那么模板容器也可以成为 站点
。
模板数据来自积木系统的数据注入(以下只保留核心代码,请重点看注释)
1 |
|
微应用组件
微应用组件,在积木系统中称为 组件(component)
对于每一个微应用,我们不关心微应用的技术栈,但是通常我们的 html 模板能够根据微应用的技术栈调用与之对应的render
方法,将微应用逐一渲染到页面上。
因此,我们需要微应用打包产出component.umd.js
文件,以及样式文件component.css
文件。
以 image 组件为例,我们产出两个文件
1 | <link |
这两个标签在模板编译阶段,将动态插入到如下容器组件的模板片段中
1 | <!-- 微应用CSS文件 --> |
组件渲染
接着模板容器
的渲染阶段
Container.jsx 的核心代码如下
1 | // 获取组件列表并渲染 |
积木系统
积木系统,是一个简单的中后台,它的核心功能是修改站点,储存站点,发布站点。
我们的站点可以是一个模板或者多个模板构成,这里仅讨论单模板站点,所以我们可以把站点
简单理解为前面提到的模板
,
一个模板
包含多个组件
,在积木系统中加载模板
, 渲染到积木系统的预览界面
中,通过控制台
修改站点配置,实时预览站点。
数据录入
微前端应用(模板容器)与积木系统之间通过一套设计好的数据协议互相依存。积木系统通过用户定义的模板配置变量,预设配置,支持录入和修改模板容器
和组件
的配置信息。
我们通过表单注入站点组件
微组件组件的
Props, 而这些
Props`足够我们实现很多功能,例如:
- 传入
api地址
:组件内部完成后端请求等逻辑,渲染到页面,实现一个可以注入不同数据源的,逻辑相同的微应用。 - 传入
富文本片段
:组件获取富文本片段并渲染,实现了一切静态页面,文案内容的可编辑化的一个富文本微应用。
积木系统需要配套一套表单控件,用于录入数据。假如要实现以上两个微应用,只需要配套一个富文本插件和简单的文本框就可以了。
产出
积木系统产出一个 html 文件,这个 html 文件就是上面提到的模板
,只不过积木系统负责将后台保存的站点数据
插入到其中,而这些数据就是用户从积木系统录入的。
这样,就产出了一个独立且可用的 html 文件。
站点发布
在积木系统,根据不同的业务组
,配置对应的webhooksUrl
,当站点修改完毕,点击控制台上的发布
按钮,将站点信息提交到 webhookUrl, webhooks 服务负责接收站点的 html 文档数据,将一个可访问的html模板
文档上传到服务器,至此发布完成。
总结
可见,微前端架构不过如此,本文旨在从一个简单的例子介绍整套流程框架的实现。
在实际使用中肯定会有很多细节问题,包括积木系统的数据库设计,多个模板之间的通讯,多个组件之间的模块打包与资源共享问题, webhooks 服务的搭建等等。
这些配套设施往往影响到积木系统的易用性,可用性等等,但是这不妨碍我们了解微前端的概念,这里仅作简单分享,欢迎指正。