手把手教你写一个简易的微前端框架​

简介: 7月更文挑战第6天

功能
• 支持不同框架的子应用
• 支持子应用 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
unmount: (props: AnyObject) => Promise

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

}

相关文章
|
2月前
|
JavaScript 前端开发 开发者
Vue.js 框架大揭秘:响应式系统、组件化与路由管理,震撼你的前端世界!
【8月更文挑战第27天】Vue.js是一款备受欢迎的前端JavaScript框架,以简洁、灵活和高效著称。本文将从三个方面深入探讨Vue.js:响应式系统、组件化及路由管理。响应式系统为Vue.js的核心特性,能自动追踪数据变动并更新视图。例如,通过简单示例代码展示其响应式特性:`{{ message }}`,当`message`值改变,页面随之自动更新。此外,Vue.js支持组件化设计,允许将复杂界面拆分为独立且可复用的组件,提高代码可维护性和扩展性。如创建一个包含标题与内容的简单组件,并在其他页面中重复利用。
60 3
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
115 4
|
2月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
104 1
|
2天前
|
存储 前端开发 JavaScript
前端技术深度探索:从基础到现代框架的实践之旅
前端技术深度探索:从基础到现代框架的实践之旅
13 2
|
14天前
|
前端开发 JavaScript API
React、Vue.js 和 Angular前端三大框架对比与选择
前端框架是用于构建用户界面的工具和库,它提供组件化结构、数据绑定、路由管理和状态管理等功能,帮助开发者高效地创建和维护 web 应用的前端部分。常见的前端框架如 React、Vue.js 和 Angular,能够提高开发效率并促进团队协作。
28 4
|
21天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
2天前
|
前端开发 JavaScript 编译器
前端技术探索:从基础到现代框架的跃迁
前端技术探索:从基础到现代框架的跃迁
5 0
|
1月前
|
Web App开发 前端开发 JavaScript
Web前端项目的跨平台桌面客户端打包方案之——CEF框架
Chromium Embedded Framework (CEF) 是一个基于 Google Chromium 项目的开源 Web 浏览器控件,旨在为第三方应用提供嵌入式浏览器支持。CEF 隔离了底层 Chromium 和 Blink 的复杂性,提供了稳定的产品级 API。它支持 Windows、Linux 和 Mac 平台,不仅限于 C/C++ 接口,还支持多种语言。CEF 功能强大,性能优异,广泛应用于桌面端开发,如 QQ、微信、网易云音乐等。CEF 开源且采用 BSD 授权,商业友好,装机量已超 1 亿。此外,GitHub 项目 CefDetector 可帮助检测电脑中使用 CEF
120 3
|
2月前
|
搜索推荐 前端开发 数据可视化
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
本文介绍了一个基于Python协同过滤算法的旅游景点推荐系统,该系统采用Django框架、MySQL数据库、Bootstrap前端和echarts数据可视化技术,旨在为用户提供个性化的旅游推荐服务,提升用户体验和旅游市场增长。
156 9
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
|
2月前
|
搜索推荐 前端开发 算法
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
117 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库