后台回复“电子书” “资料” 领取一份干货,数百技术电子书等你 开发者技术前线 ,汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。
今日头条 App 页面秒开方案详解
天猫搜索前端架构演进之路
最全的 Vue 性能优化指南,经典收藏
来了!ES 2018 新特性全面解读
The following article is from 爱奇艺技术产品团队 Author 爱奇艺号
点击上方“开发者技术前线”,选择“星标”
18:50 在看 真爱
前言
近来,微前端的概念非常火爆,那么什么是微前端架构?微前端架构是一种架构风格类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。由此带来的变化是,这些前端应用可以独立运行、独立开发、独立部署。微前端所具备的便于引入新框架,代码简洁、易维护等特点使其应用愈发广泛。
爱奇艺号前端工程基于Vue的框架已经使用了3年之余,这一版本虽有不错的可扩展性,但随着接入的业务越来越多,项目复杂度和代码行数增长,现有框架需要将框架与业务更加的解耦以方便其他团队进行维护,同时也需要模块的独立部署、发布等提高迭代效率。基于种种原因,爱奇艺号技术团队基于Vue定制开发了微前端框架,此文从偏向实践的方面来简要介绍这套框架的实现原理。
容器应用
首先需要一个容器应用,这个容器应用需要有最基本的代码架构,比如Vue、主路由、Vuex及其他基础的通用代码,但需要将这些通用代码中任何业务相关的部分剥离。简单来说,容器应用是一个基于Vue的框架,其作用是将其他分散的各个微前端模块通过页面路由攒在一起,再组成一个个的页面。
- app.js
- hosts配置
- 路由
- 微前端模块渲染
- 通用模块注册为懒加载组件
微前端模块
1、一个遵循框架规范的业务自己定义的路由。这能给业务最大的自由度:上线新页面而无需部署容器应用;
2、每个需要独立出来的模块的entry文件。Webpack打包时会将每一个entry生成一个js文件以便单独调用,因为每个entry js代码都包含初始化框架的逻辑,所以理论上每个entry代码都可以独立运行;
3、因为每次部署后所有js代码的hash都会变化,所以微前端模块需要能够生成一个manifest文件列表,包括上面的路由文件以及全部独立的模块js文件的url列表。容器应用会实时通过这个manifest文件获取最新的js代码。
下面我们来详细介绍微前端模块的组成:
微前端模块的webpack相比主容器,有下面几点不同:
· 忽略一些第三方包。尽管模块在package.json中也引用了Vue等第三方包,但在webpack打包时无法将其包括进来,这主要是以下两点原因:其一,这会导致js大小以几十几百倍增加;其二,Vue等框架代码完全可以使用主容器已经引用了的三方包。所以我们利用webpack的external配置忽略了一些不希望被打包过程包括的代码:
· 多个entry。因为一个微前端模块可能会包括很多个可单独引用的子模块,每一个子模块都单独有一个Vue初始化等功能的js文件(类似主容器的app.js)。在打包过程中,我们加入了扫描全部jobs文件夹下js文件的功能,每一个js文件都代表了一个微前端模块下的子模块。
· 部署路径:因为每一个微前端模块都需要与其他微前端模块部署到不同的服务器位置,所以在webpack打包部署时需要单独配置。开发环境下可以直接使用localhost加不同的端口port,线上环境可根据实际情况进行配置。
· manifest:我们通过webpack-manifest-plugin来在打包时自动生成一个列表文件。这样每次访问到微前端模块时都能通过这个文件获取到最新上线的js代码文件。
一个微前端模块可能代表了一个业务,而每个业务可能会频繁变化路由配置,所以如果路由分配能由业务微前端模块自行配置,不同团队则能更方便的进行更改而不需要重新上线容器应用。上文已经介绍了主容器如何获取并使用微前端中的路由配置,这里详细介绍模块中如何配置自己的路由。
在jobs/routes.js中,我们绑定一个全局函数用来让主容器获取到我们自己配置的路由信息,类似下面的代码jobs/route.js:
可见,子模块的路由完全遵循Vue的路由规范(或遵循自身使用的框架的规范),这样可以让容器应用毫不费力地直接添加引用。容器应用加载完成js文件后,可以直接调用window.mp.home_routes()获来取已定义好的ROUTES配置。
每一个子模块都需要一个单独的entry文件,这类似于主容器的jobs/app.js,能用于初始化子模块代码、绑定全局渲染函数等。entry文件与正常的初始化Vue方式一样,只是需要将初始化逻辑包裹在一个全局函数中,以便主容器能在加载此模块js完毕后,方便的进行渲染调用。例如:
根据以上代码,渲染出来的Vue模块会被放到指定的#${containerId}中,这个ID由主容器在渲染时动态传入,以便将模块插入到指定的页面位置。
- 子模块代码开发
子模块代码开发与正常的Vue开发并无不同,可以轻松迁移老代码,只需要注意一些通用代码的引用并通过上文提到的懒加载模式引入。
后记
· 更小,更紧密且更易维护的代码库。
· 组织更具扩展能力,团队可更加独立自治。
未来,我们会继续完善前端框架,使其性能更加优秀,进一步提升爱奇艺号前端代码的开发效率,实现不同应用之间页面级别的自由组合,从而可生成个性化控制台。
实现微前端有很多技术方法(点击阅读全文),不同的企业有不同的对策;从服务端转换到 iframe 和 JavaScript 元框架和 Web 组件等都是可选的微前端方案。
后台回复“电子书” “资料” 领取一份干货,数百技术电子书等你 开发者技术前线 ,汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。