Single Spa
single-spa 概述
-
single-spa 是一个实现微前端架构的框架。
-
在 single-spa 框架中有三种类型的微前端应用:
-
single-spa-[application / parcel]
微前端架构中的微应用,可以使用 vue、react、angular 等框架- single-spa-application 是和路由相关联的,比如说当访问/a 路由的时候要访问A 微应用,访问 /b 路由的时候要访问 B 微应用
- single-spa-parcel 是和 single-spa-application 相关联的一种类型,两者使用方式都是一样的,区别是 single-spa-parcel 不跟路由相关联,主要用于跨应用共享UI组件
-
single-spa root config
创建微前端容器应用-
微前端架构中的容器应用
-
通过容器应用来加载和管理微应用
-
-
utility modules
公共模块应用,非渲染组件,用于跨应用共享 javascript 逻辑的微应用
-
❤ 这三种微应用都是独立的应用,均可单独的开发、构建和发布
快速开始-demo
准备工作
安装 single-spa 脚手架工具: npm install create-single-spa@2.0.3 -g
查看版本 npm info create-single-spa
创建容器应用
-
创建微前端容器应用:
create-single-spa
-
应用文件夹填写 container
-
应用选择 single-spa root config
-
组织名称填写 study
组织名称可以理解为团队名称,微前端架构允许多团队共同开发应用,组织名称可以标识应用由哪个团队开发。 应用名称的命名规则为 @组织名称/应用名称 ,比如 @study/todos
-
-
启动应用:
npm start
-
访问应用:
localhost:9000
📢 1. 在容器应用中默认注册了一个微应用
2. 在整个微前端项目中只有一个模板文件
-
默认代码解析
-
root-config.js
// workspace/container/src/study-root-config.js
import { registerApplication, start } from "single-spa"
/**
* 注册微前端应用
* 1. name: 字符串类型, 微前端应用名称 "@组织名称/应用名称"
* 2. app: 函数类型, 返回 Promise, 通过 systemjs 引用打包好的微前端应用模块代码 (umd)
* 3. activeWhen: 路由匹配时激活应用
*/
registerApplication({
name: "@single-spa/welcome",
app: () => System.import( "https://unpkg.com/single-spa-welcome/dist/single-spa-welcome.js" ),
activeWhen: ["/"]
})
// start 方法必须在 single spa 的配置文件中调用
// 在调用 start 之前, 应用会被加载, 但不会初始化, 挂载或卸载.
// 启动微应用
start({
// 是否可以通过 history.pushState() 和 history.replaceState() 更改触发 single-spa 路由
// true 不允许 false 允许
urlRerouteOnly: true
}) -
index.ejs
<!-- 导入微前端容器应用 -->
<script>
// 加载模块
System.import("@study/root-config")
</script>
<!--
import-map-overrides 可以覆盖导入映射
当前项目中用于配合 single-spa Inspector 调试工具使用.
可以手动覆盖项目中的 JavaScript 模块加载地址, 用于调试.
-->
<import-map-overrides-full
show-when-local-storage="devtools"
dev-libs
></import-map-overrides-full><!-- 模块加载器 -->
<script src="https://cdn.jsdelivr.net/npm/systemjs@6.8.0/dist/system.min.js"></script>
<!-- systemjs 用来解析 AMD 模块的插件 -->
<script src="https://cdn.jsdelivr.net/npm/systemjs@6.8.0/dist/extras/amd.min.js" ></script>
<!-- 用于覆盖通过 import-map 设置的 JavaScript 模块下载地址 -->
<script src="https://cdn.jsdelivr.net/npm/import-map- overrides@2.2.0/dist/import-map-overrides.js"></script>
<!-- 用于支持 Angular 应用 -->
<script src="https://cdn.jsdelivr.net/npm/zone.js@0.10.3/dist/zone.min.js"> </script><!-- single-spa 预加载 -->
<link
rel="preload"
href="https://cdn.jsdelivr.net/npm/single-spa@5.8.3/lib/system/single- spa.min.js"
as="script"
/><!-- JavaScript 模块下载地址 此处可放置微前端项目中的公共模块 -->
<script type="systemjs-importmap">
{
"imports": {
"single-spa": "https://cdn.jsdelivr.net/npm/single- spa@5.8.3/lib/system/single-spa.min.js"
}
}
</script>📢 single-spa 框架可以支持angular.js 到 11,目前对最新的 Anugular 11 支持还不是太好,所以目前不推荐在 single-spa 中加载 最新的 angular 应用,但是可以做兼容
-