美文网首页
基于single-spa,single-spa-vue的微前端落

基于single-spa,single-spa-vue的微前端落

作者: Carols | 来源:发表于2021-06-07 17:12 被阅读0次

1.什么是微前端
    在说什么是微前端的之前我们先来思考一下什么是微服务,微服务是一种为了降低服务端耦合的架构方式(为了解决庞大的一整块后端服务带来的变更与扩展方面的限制)

微服务是面向服务架构(SOA)的一种变体,把应用程序设计成一系列松耦合的细粒度服务,并通过轻量级的通信协议组织起来具体地,将应用构建成一组小型服务。这些服务都能够独立部署、独立扩展,每个服务都具有稳固的模块边界,甚至允许使用不同的编程语言来编写不同服务,也可以由不同的团队来管理

那么引用微服务的架构思想,顾名思义微前端就是将多个前端应用分解成一些更小、更简单的能够独立开发、测试、部署的小块,而在用户看来仍然是内聚的单个产品

2.微前端有什么特点

2.1:降低代码耦合,易于维护

2.2:各子应用独立发布部署

2.3:提升代码可复用性

2.4:更容易进行单元测试

2.5:减少团队之间依赖

3.微前端的实现方案

3.1 iframe

优点:1.近乎完美的代码隔离机制

           2.学习成本几乎为0

缺点:1.iframe内部独立文档流,modal组件样式巨丑

            2.iframe阻塞外层框架渲染

            3.浏览器后退按钮失效

            4.与框架共享http连接数

            5.浏览器url需要做额外处理

3.2 Nginx

实现:通过配置ngin拦截指定的url返回对应的html模板

优点:1.实现简单

           2.技术栈独立

缺点:1.需要额外的Nginx配置

           2.与服务端耦合

3.3single-spa

优点:1.纯前端解决方案

           2.可以使用多种技术栈

           3.完善的生态

           4.丝滑的通信

缺点:1.上手成本高

           2.需要改造现有应用

           3.样式隔离需要单独处理

在这里我们主要讨论第三种实现方案

4.具体实现

4.1 基于single-spa,single-spa-vue,探索主应用为vue,子应用为vue的实现方案

先来看看我们的项目结构

图1

base为主应用,app1为子应用

接下来我们先来看看主应用

图2

在基础的vue项目中多出来了一个sing-spa-conf.js的文件,没错,这个文件就是我们注册子应用的文件,这个文件主要做了一下几件事:

1.配置子应用信息(子应用必须有独立的应用名)

2.匹配子应用的baseUrl, 加载对应的js文件(通过打包生成的manifest.json,去获取子应用的js列表),动态插入到页面

3.注册子应用

完整代码如图:

图3

到这里,我们应用的配置工作就完成了,然后我们需要给子应用一个容器,在App.vue文件中添加如下代码:

图4

其中id为microApp的div为子应用的容器,上面的router-view是主应用的路由容器(主应用也会有自己的路由)

到此主应用我们就搞完了(其实还没完。。。)

接下来我们继续,来看看子应用的改造,先来看看子应用的目录结构:

图5

咦,好像和一般的应用看起来也没啥区别(这你就看的不透了),我们一起来看看内里乾坤。首先来看看我们的项目入口文件main.js

图6

这里主要做了两件事,一个是将子应用的bootstrap,mount, unmount生命周期函数导出,导出的目的提供给主应用去动态的加载和卸载子应用。另外一件事是判断在非嵌入主应用环境独立运行。

入口文件处理完了之后,再接下来我们还得修改一下打包策略,入下图

图7

使用stats-webpack-plugin插件(打包时生成对应的资源清单)

修改打包输出类型(这个要是看不懂的话,请点击https://v4.webpack.docschina.org/configuration/output/#output-library恶补)

将css设置为采用<style>标签的引入方式

到此子项目的改造就算完成了。

到这里,仿佛一切都很顺利(激动中。。。),启动项目打开页面,额,显示是显示了,可是这样式怎么冲突了,回顾一下,我们将子项目的样式全部设置为使用<style>的方式引入的,然后子项目和主项目处在一个文档流中,这好像是有问题呀,那该怎么解决呢(苦思冥想)。

最后我们采用postcss-selector-namespace这个postcss的plugin,这个插件是干什么的呢,它可以将我们项目内定义的样式集中统一处理,这里我们看一下是怎么处理的,在postcss.config.js内我们这么处理

图8

我们在这里给所有的css添加统一的前缀来实现样式的隔离。(tips: 在样式前面添加:root可以避免统一处理,这会很有用。)

到此,我们所有的改造就完成了。下一篇我们将深入了解single-spa框架,来看看它是如何实现的。

相关文章

网友评论

      本文标题:基于single-spa,single-spa-vue的微前端落

      本文链接:https://www.haomeiwen.com/subject/jsavsltx.html