• Stars
    star
    109
  • Rank 319,077 (Top 7 %)
  • Language
    TypeScript
  • Created almost 3 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

一个微前端框架教学项目

mini-single-spa

一个微前端教学项目

原理分析

功能

  • 支持不同框架的子应用
  • 支持子应用 HTML 入口
  • 支持沙箱功能,子应用 window 作用域隔离、元素隔离
  • 支持子应用样式隔离
  • 支持各应用之间的数据通信

Examples

所有示例均在 examples 目录下。

运行示例

安装

pnpm install --frozen-lockfile && pnpm install:all

运行开发环境

pnpm dev:all

访问 http://localhost:8000,即可查看多个 spa 子应用的示例。

使用

安装

npm i mini-single-spa
# or
pnpm i mini-single-spa
# or
yarn add mini-single-spa

主应用

在主应用上注册子应用

import { registerApplication, start } from 'mini-single-spa'

registerApplication({
    name: 'vue',
    pageEntry: 'http://localhost:8001',
    activeRule: pathPrefix('/vue'),
    container: $('#subapp-viewport')
})

registerApplication({
    name: 'react',
    pageEntry: 'http://localhost:8002',
    activeRule:pathPrefix('/react'),
    container: $('#subapp-viewport')
})

start()

首先使用 registerApplication() 注册所有的子应用,然后执行 start() 启动。

子应用

子应用必须向外暴露 mount()unmount() 两个函数,并将它们挂在全局的子应用名称 window.__SINGLE_SPA__ 下:

mount: (props: AnyObject) => Promise<any>
unmount: (props: AnyObject) => Promise<any>

window.__SINGLE_SPA__= {
    mount,
    unmount
}

mount() 在子应用每次挂载时启用,unmount() 在子应用每次卸载时使用。

子应用跨域和资源路径

子应用需要开启 cors 和指定生成的资源路径,假如你使用 vue-cli 进行开发,可以这样配置:

module.exports = {
    devServer: {
        port: 8001, // 设置子应用访问端口
        headers: {
            'Access-Control-Allow-Origin': '*' // 解决跨域问题
        }
    },
    publicPath: "//localhost:8001/", // 资源路径前缀
}

全局状态、全局事件

在父子应用上均可以使用 window.spaGlobalState 来设置、监听全局状态:

// 父应用
window.spaGlobalState.set('msg', '父应用在 spa 全局状态上新增了一个 msg 属性')

// 子应用(全局状态、事件不会生成快照和恢复,所以要在 mount() 调用后使用)
window.spaGlobalState.onChange((state, operator, key) => {
    alert(`vue 子应用监听到 spa 全局状态发生了变化: ${JSON.stringify(state)},操作: ${operator},变化的属性: ${key}`)
})

也可以使用全局事件:

// 父应用
window.spaGlobalState.emit('testEvent', '父应用发送了一个全局事件: testEvent')

// 子应用
window.spaGlobalState.on('testEvent', () => alert('vue 子应用监听到父应用发送了一个全局事件: testEvent'))

注意,子应用设置的全局状态、事件会在卸载时清除,并且不会保存快照。所以建议将状态、事件相关操作放在 mount() 函数执行时或之后。

全局状态、事件 API

// 状态相关
set(key: string, value: any): void;
get(key: string): any;
getAll(): AnyObject;
delete(key: string): void;
clear(): void;
onChange(callback: Callback): void;

// 事件相关
on(event: string, callback: Callback): void;
off(event: string, callback: Callback): void;
emit(event: string, ...args: any): void;
once(event: string, callback: Callback): void;

registerApplication(Application)

registerApplication(Application) 接收的参数如下:

interface Application {
    /**
     * app 名称
     */
    name: string
    /**
     * app 匹配规则,值为 true 时加载 app
     * 例如传入 /vue,当 url 的路径变为 /vue 时,激活当前子应用。
     * 如果 activeRule 为函数,则会传入 location 作为参数,activeRule(location) 返回 true 时,激活当前子应用。
     */
    activeRule: Function | string
    /**
     * 父应用传过来的自定义属性
     */
    props: Function | AnyObject
    /**
     * app 挂载的 dom
     */
    container: HTMLElement
    /**
     * app 访问入口,一个 URL 链接
     */
    pageEntry: string
    /**
     * enabled: 是否开启 js 作用域隔离、元素隔离,默认开启
     * css: 是否开启样式隔离,默认关闭
     */
    sandboxConfig: { enabled: boolean, css: boolean }
    /**
     * app 生命周期钩子,加载页面资源前触发,只会触发一次
     */
    beforeBootstrap?: () => void
    /**
     * app 生命周期钩子,页面入口的资源被加载并执行后触发,只会触发一次
     */
    bootstrapped?: () => void
    /**
     * app 生命周期钩子,挂载前触发
     */
    beforeMount?: () => void
    /**
     * app 生命周期钩子,挂载后触发
     */
    mounted?: () => void
    /**
     * app 生命周期钩子,卸载前触发
     */
    beforeUmount?: () => void
    /**
     * app 生命周期钩子,卸载后触发
     */
    unmounted?: () => void
    /**
     * js 代码的 loader,每次获取到 js 代码后会传给 loader() 并将返回值作为新的代码
     */
    loader?: (code: string) => string
}

More Repositories

1

visual-drag-demo

一个低代码(可视化拖拽)教学项目
Vue
5,107
star
2

nand2tetris

计算机系统要素-从零开始构建现代计算机
JavaScript
2,630
star
3

introduction-to-front-end-engineering

一本小书《带你入门前端工程》
1,885
star
4

MIT6.828

实现一个操作系统内核
C
1,796
star
5

Front-end-articles

分享我的编程经验和学习心得,订阅请点 watch
JavaScript
1,523
star
6

Front-end-basic-knowledge

前端知识点、面试题
792
star
7

vue-admin-template

Vue 轻量级后台管理系统基础模板
Vue
763
star
8

vue-form-maker

Vue 表单生成器——动态生成表单组件
JavaScript
259
star
9

monitor-demo

一个前端监控 SDK 教学项目
JavaScript
186
star
10

mini-vue

模仿 Vue1.0 写的迷你版 Vue
JavaScript
177
star
11

true-question

计算机及应用(本科)自考历年真题分享
159
star
12

mini-cli

模仿 Vue CLI 写的迷你版脚手架
JavaScript
124
star
13

node-blog

用 node 搭建个人博客
JavaScript
119
star
14

2017ife-task

2017百度前端技术学院任务
JavaScript
61
star
15

tiny-rendering-engine

从零开始实现一个玩具版浏览器渲染引擎
TypeScript
60
star
16

vue-upload-imgs

vue 图片上传组件(base64 版)
JavaScript
50
star
17

copy-rollup

拷贝自 rollup 初版源码,并对其进行了部分修改
JavaScript
46
star
18

i18n-replace

前端国际化辅助工具——自动替换中文并翻译
JavaScript
44
star
19

2016ife-task

2016百度前端技术学院任务
HTML
39
star
20

vue-ssr-demo

Vue 服务端渲染 demo
JavaScript
29
star
21

front-end-specification

前端规范
27
star
22

front-end-engineering-demo

前端工程化 demo
JavaScript
23
star
23

lowcode-llm-demo

低代码与大语言模型的结合实践 demo
Python
21
star
24

Computer-Networking-Lab

计算机网络-自顶向下-第六版实验
JavaScript
19
star
25

Algorithm

《算法》第 4 版 JavaScript 实现
JavaScript
19
star
26

platform-template-generator

JavaScript
18
star
27

micro-frontend-demo

微前端 DEMO
JavaScript
17
star
28

vite-vue3-eslint-stylelint-demo

vite-vue3-eslint-stylelint-demo 代码自动格式化
JavaScript
13
star
29

leetcode

leetcode
JavaScript
11
star
30

git-hooks-demo

用于演示 git hooks 脚本的 DEMO
JavaScript
10
star
31

table-tree

一个jquery树形表格组件
HTML
10
star
32

2018ife-task

2018前端技术学院任务
HTML
10
star
33

Notes-and-Labs

计算机学习笔记及实践
10
star
34

mini-vuex

和mini-vue配套使用的状态管理模式
JavaScript
10
star
35

markdown-editor-sync-scroll-demo

markdown 编辑器双屏同步滚动
HTML
9
star
36

source-map-demo

对压缩过的代码报错信息进行还原
HTML
9
star
37

vue-mergeable-table

根据数据动态生成可合并行列的表格
Vue
8
star
38

MIT6.830

实现一个数据库
6
star
39

rollup-plugin-import-to-const

将 import 导入变量替换为 const 命名变量 的 rollup 插件
TypeScript
6
star
40

nestjs-demo

multiple nestjs demos
TypeScript
6
star
41

github-actions-aliyun-demo

github-actions-aliyun-demo
HTML
5
star
42

github-actions-demo

自动部署到 github page
Vue
5
star
43

self-learning-english

分享一下自学英语的过程
5
star
44

eslint-config-airbnb-vue3-ts

结合了 airbnb 和 prettier 风格规范的 eslint 配置,适用于 vue3、js、ts 项目
JavaScript
4
star
45

nodejs-learning-notes

nodejs 学习笔记
JavaScript
4
star
46

woai3c.github.io

HTML
3
star
47

npm-proxy-cli

可以方便的通过命令行开启/关闭 npm http/https 代理,不支持 socks5。
JavaScript
3
star
48

toggle-router-abort-request

切换路由,取消请求-demo
JavaScript
2
star
49

type-challenges-answers

answers to type-challenges
2
star
50

webpack-demo

写一个 webpack loader 和 webpack plugin
JavaScript
2
star
51

tan-cli

tan-cli
JavaScript
2
star
52

monorepo-demo

monorepo-demo
JavaScript
1
star
53

apipost-api-generator

根据 apipost 导出的接口数据生成前端接口
TypeScript
1
star