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

简介: 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

}

相关文章
|
19天前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
51 9
|
2月前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
13天前
|
前端开发 JavaScript API
前端界的秘密武器:掌握这些框架,让你轻松秒杀99%的同行!
前端开发日新月异,掌握几个明星框架如React、Vue.js和Angular,不仅能让工作更得心应手,还能轻松超越同行。React以高效的虚拟DOM和组件化著称;Vue.js简洁易懂,灵活性高;Angular提供全面的解决方案,适合大型应用。此外,轻量级的Svelte也值得关注,其编译时处理设计提升了应用性能。掌握这些框架,结合深刻理解和灵活运用,助你在前端领域脱颖而出。
28 9
|
2月前
|
JavaScript 前端开发 API
Vue.js:现代前端开发的强大框架
【10月更文挑战第11天】Vue.js:现代前端开发的强大框架
69 41
|
2月前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
106 7
|
2月前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
2月前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
|
2月前
|
前端开发 JavaScript 开发者
qiankun(乾坤)微前端框架简介
qiankun(乾坤)微前端框架简介
149 1
|
2月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
2月前
|
存储 前端开发 JavaScript
前端技术深度探索:从基础到现代框架的实践之旅
前端技术深度探索:从基础到现代框架的实践之旅
36 2
下一篇
无影云桌面