当前位置: 首页 > article >正文

前端微前端架构:别再把所有功能都放在一个应用里了

前端微前端架构别再把所有功能都放在一个应用里了各位前端同行咱们今天聊聊前端微前端架构。别告诉我你还在把所有功能都放在一个应用里那感觉就像在一个房间里放了所有家具。为什么你需要微前端架构最近看到一个项目单页应用体积达到 10MB构建时间达到 10 分钟我差点当场去世。我就想问你是在开发应用还是在开发操作系统微前端的优势模块化将大型应用拆分为小型、独立的微应用每个微应用负责特定的功能。独立开发不同团队可以独立开发和部署微应用提高开发效率。独立部署每个微应用可以独立部署减少了部署风险。技术栈灵活不同微应用可以使用不同的技术栈适应不同团队的技术偏好。可扩展性可以轻松添加新的微应用而不影响现有功能。性能优化只加载当前需要的微应用减少了初始加载时间。反面教材// 反面教材单体应用 import React from react; import ReactDOM from react-dom; import Home from ./pages/Home; import About from ./pages/About; import Contact from ./pages/Contact; import Dashboard from ./pages/Dashboard; import Admin from ./pages/Admin; import Settings from ./pages/Settings; // 此处省略100个页面 function App() { return ( div Routes Route path/ element{Home /} / Route path/about element{About /} / Route path/contact element{Contact /} / Route path/dashboard element{Dashboard /} / Route path/admin element{Admin /} / Route path/settings element{Settings /} / // 此处省略100个路由 /Routes /div ); } ReactDOM.render(App /, document.getElementById(root));毒舌点评这代码我看了都替你的项目着急。单体应用这么大你是想让你的构建过程变成马拉松吗前端微前端架构的正确姿势1. 使用 Module Federation// 正确姿势使用 Module Federation // 主机应用 webpack.config.js const { ModuleFederationPlugin } require(webpack).container; module.exports { plugins: [ new ModuleFederationPlugin({ name: host, remotes: { home: homehttp://localhost:3001/remoteEntry.js, about: abouthttp://localhost:3002/remoteEntry.js, dashboard: dashboardhttp://localhost:3003/remoteEntry.js, }, shared: { react: { singleton: true, requiredVersion: ^18.0.0, }, react-dom: { singleton: true, requiredVersion: ^18.0.0, }, react-router-dom: { singleton: true, requiredVersion: ^6.0.0, }, }, }), ], }; // 微应用 webpack.config.js const { ModuleFederationPlugin } require(webpack).container; module.exports { plugins: [ new ModuleFederationPlugin({ name: home, filename: remoteEntry.js, exposes: { ./App: ./src/App, }, shared: { react: { singleton: true, requiredVersion: ^18.0.0, }, react-dom: { singleton: true, requiredVersion: ^18.0.0, }, }, }), ], }; // 主机应用中使用微应用 import React, { lazy, Suspense } from react; const HomeApp lazy(() import(home/App)); const AboutApp lazy(() import(about/App)); const DashboardApp lazy(() import(dashboard/App)); function App() { return ( div Suspense fallback{divLoading.../div} Routes Route path/ element{HomeApp /} / Route path/about element{AboutApp /} / Route path/dashboard element{DashboardApp /} / /Routes /Suspense /div ); }2. 使用 Single-SPA// 正确姿势使用 Single-SPA // root-config.js import { registerApplication, start } from single-spa; import { constructRoutes, constructApplications, constructLayoutEngine } from single-spa-layout; // 加载路由配置 const routes constructRoutes(document.querySelector(#single-spa-layout)); const applications constructApplications({ routes, loadApp({ name }) { return System.import(name); }, }); const layoutEngine constructLayoutEngine({ routes, applications, }); // 注册应用 applications.forEach(registerApplication); // 启动应用 layoutEngine.activate(); start(); // 微应用入口 // app1.js import React from react; import ReactDOM from react-dom; import singleSpaReact from single-spa-react; import App from ./App; const lifecycles singleSpaReact({ React, ReactDOM, rootComponent: App, errorBoundary(err, info, props) { return divAn error occurred/div; }, }); export const { bootstrap, mount, unmount } lifecycles;3. 使用 qiankun// 正确姿势使用 qiankun // 主应用 main.js import { registerMicroApps, start } from qiankun; // 注册微应用 registerMicroApps([ { name: home, entry: http://localhost:3001, container: #subapp-container, activeRule: /, props: { token: your-token, userInfo: { name: user } } }, { name: about, entry: http://localhost:3002, container: #subapp-container, activeRule: /about, }, { name: dashboard, entry: http://localhost:3003, container: #subapp-container, activeRule: /dashboard, }, ]); // 启动 qiankun start({ sandbox: { strictStyleIsolation: true, }, prefetch: true, }); // 微应用 main.js import { createApp } from vue; import App from ./App.vue; import router from ./router; let instance null; function render(props) { const { container } props; instance createApp(App); instance.use(router); instance.mount(container ? container.querySelector(#app) : #app); } if (!window.__POWERED_BY_QIANKUN__) { render({}); } export async function bootstrap() { console.log(vue app bootstraped); } export async function mount(props) { console.log(props from main app, props); render(props); } export async function unmount() { instance.unmount(); instance null; }4. 微前端通信// 正确姿势微前端通信 // 使用 EventBus class EventBus { constructor() { this.events {}; } on(event, callback) { if (!this.events[event]) { this.events[event] []; } this.events[event].push(callback); } emit(event, data) { if (this.events[event]) { this.events[event].forEach(callback callback(data)); } } off(event, callback) { if (this.events[event]) { this.events[event] this.events[event].filter(cb cb ! callback); } } } // 全局 EventBus window.eventBus new EventBus(); // 微应用 A 发送事件 window.eventBus.emit(userLoggedIn, { user: John }); // 微应用 B 监听事件 window.eventBus.on(userLoggedIn, (data) { console.log(User logged in:, data.user); }); // 使用共享状态 // 共享状态管理 class SharedState { constructor() { this.state {}; this.listeners []; } set(key, value) { this.state[key] value; this.notify(); } get(key) { return this.state[key]; } subscribe(listener) { this.listeners.push(listener); return () { this.listeners this.listeners.filter(l l ! listener); }; } notify() { this.listeners.forEach(listener listener(this.state)); } } // 全局共享状态 window.sharedState new SharedState(); // 订阅状态变化 const unsubscribe window.sharedState.subscribe((state) { console.log(State changed:, state); }); // 更新状态 window.sharedState.set(user, { name: John, age: 30 });毒舌点评早这么做你的应用早模块化了。别告诉我你不知道微前端架构那你还是趁早去写静态页面吧。实战技巧前端微前端架构指南1. 微前端框架选择框架特点适用场景Module Federationwebpack 5 内置无需额外依赖同技术栈、需要共享依赖的场景Single-SPA成熟的微前端框架支持多种技术栈多技术栈、复杂应用场景qiankun基于 Single-SPA中文支持好国内项目、需要完善文档的场景Frint基于 React支持状态管理React 技术栈项目Piral基于 React插件化架构插件化应用场景2. 微前端架构设计应用拆分策略按业务域拆分用户、订单、商品等按功能拆分首页、详情页、管理后台等按技术栈拆分React 应用、Vue 应用等共享依赖管理共享第三方库React、Vue、lodash 等共享工具函数日期处理、网络请求等共享组件按钮、表单、弹窗等路由管理主应用管理全局路由微应用管理内部路由使用路由守卫控制权限状态管理微应用内部状态使用 Redux、Vuex 等全局共享状态使用 EventBus、状态管理库等跨应用通信使用自定义事件、共享存储等部署策略独立部署每个微应用独立部署统一部署所有微应用一起部署CI/CD自动化部署流程3. 最佳实践保持微应用小而专注每个微应用负责特定的功能合理共享依赖避免重复加载第三方库统一设计系统确保微应用之间的视觉一致性完善的错误处理微应用故障不影响主应用性能优化按需加载微应用预加载常用微应用缓存微应用资源监控和日志统一的监控和日志系统安全措施隔离微应用的 DOM 和 CSS防止微应用之间的恶意攻击保护敏感数据4. 常见问题及解决方案样式冲突使用 CSS Modules 或 styled-components使用 qiankun 的样式隔离功能为微应用添加命名空间依赖冲突使用 Module Federation 共享依赖统一第三方库版本使用 webpack 的 externals 配置性能问题按需加载微应用预加载常用微应用优化微应用的打包体积通信问题使用 EventBus 进行事件通信使用共享状态管理库使用 URL 参数传递数据部署问题统一的部署流程版本管理和回滚机制环境配置管理前端微前端架构不是可选的是未来的趋势。别再把所有功能都放在一个应用里了——模块化一下你的应用会更易于维护。微前端架构就像一个大型购物中心每个店铺都是一个独立的微应用顾客可以自由穿梭于不同的店铺而整个购物中心保持统一的管理和体验。

相关文章:

前端微前端架构:别再把所有功能都放在一个应用里了

前端微前端架构:别再把所有功能都放在一个应用里了 各位前端同行,咱们今天聊聊前端微前端架构。别告诉我你还在把所有功能都放在一个应用里,那感觉就像在一个房间里放了所有家具。 为什么你需要微前端架构 最近看到一个项目,单页应…...

从音频生成到DNA分析:手把手带你用S4和Hyena搞定Transformer不擅长的那些长序列任务

从音频生成到DNA分析:手把手带你用S4和Hyena搞定Transformer不擅长的那些长序列任务 当我们需要处理长达数小时的音频波形、百万碱基对的DNA序列或整本小说级别的文本时,传统Transformer架构很快就会遇到计算瓶颈。本文将带您探索两种突破性的序列建模方…...

面向对象编程入门(下篇):继承、封装与多态

在上篇中,我们学会了如何定义类和创建对象,将现实世界的事物用代码表示。今天,我们将深入面向对象编程的三大核心特性:继承、封装和多态。这些特性将让你的代码更加灵活、可扩展和易维护。一、继承:代码复用的“家族传…...

依托AI改写功能的五个实用技巧,论文重复率由30%快速降至合规

嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...

cutlass代码架构分析

CUTLASS 代码架构分析 本文档基于 cutlass代码进行梳理,快速理解 CUTLASS 4.x 的模块边界与调用链路。 1. 总体架构 CUTLASS 本质上是一个 header-only 的 CUDA C++ 模板库,外围配套了可选构建目标: include/:核心库(cutlass + cute) tools/:库实例化、性能测试与通用…...

从 0 开始讲透 C++ Lambda(对标 Java)

在写 C 多线程或 STL 时&#xff0c;经常会看到这样的代码&#xff1a;std::thread t([]{ std::cout << "Hello C Thread\n"; });很多人第一反应&#xff1a;这 [] 是什么&#xff1f;为什么和 Java 不一样&#xff1f;一、先给结论&#xff08;先建立整体认知…...

云容笔谈·东方红颜影像生成系统与ComfyUI工作流集成:可视化节点式创作

云容笔谈东方红颜影像生成系统与ComfyUI工作流集成&#xff1a;可视化节点式创作 如果你是一位数字艺术家或者技术美术&#xff0c;可能常常面临这样的困境&#xff1a;你有一个绝佳的创意&#xff0c;比如想生成一幅融合了东方古典美学与现代光影的“红颜”肖像&#xff0c;但…...

nli-distilroberta-base实际项目:高校招生简章关键条款与考生疑问逻辑关系库构建

nli-distilroberta-base实际项目&#xff1a;高校招生简章关键条款与考生疑问逻辑关系库构建 1. 项目背景与需求 高校招生简章通常包含大量专业条款和政策说明&#xff0c;每年都会收到大量考生关于条款理解的咨询。传统的人工解答方式存在几个痛点&#xff1a; 效率低下&am…...

解决Redis测试环境搭建难题的try.redis工具:零配置交互式终端功能全解析

解决Redis测试环境搭建难题的try.redis工具&#xff1a;零配置交互式终端功能全解析 【免费下载链接】try.redis A demonstration of the Redis database. 项目地址: https://gitcode.com/gh_mirrors/tr/try.redis 在日常开发中&#xff0c;开发者常常面临Redis测试环境…...

一只菜鸟学深度学习的日记:填充 步幅 下采样

陕访惹玫在前两篇文章《最小二乘问题详解10&#xff1a;PnP问题求解》和《最小二乘问题详解11&#xff1a;基于李代数的PnP优化》中&#xff0c;我们分别通过常规思想与李代数思想&#xff0c;深入探讨了计算机视觉中 SFM&#xff08;Structure from Motion&#xff09;系统的核…...

Clawdbot网关配置教程:实现Qwen3-VL:30B与飞书的无缝对接

Clawdbot网关配置教程&#xff1a;实现Qwen3-VL:30B与飞书的无缝对接 1. 准备工作与环境概述 在开始配置前&#xff0c;请确保已完成以下准备工作&#xff1a; 已在CSDN星图AI云平台完成Qwen3-VL:30B的私有化部署&#xff08;参考上篇教程&#xff09;拥有飞书开放平台的企业…...

Qwen3.5-4B-Claude-Opus实际作品:正则表达式语法树构建与匹配逻辑推演

Qwen3.5-4B-Claude-Opus实际作品&#xff1a;正则表达式语法树构建与匹配逻辑推演 1. 模型能力概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个专注于逻辑推理和结构化分析的轻量级AI模型。作为Qwen3.5-4B的蒸馏版本&#xff0c;它在处理代码解释、算法分析…...

8_Harness驾驭工程实践:企业级落地与OpenAI案例解析

8_Harness驾驭工程实践&#xff1a;企业级落地与OpenAI案例解析 关键字&#xff1a; 企业级落地、OpenAI、Ryan Lopopolo、Codex、Harness Engineering、Citi Bank、Ancestry、Ulta Beauty、Agent-First开发、部署策略、自托管、成本优化、迁移路径、最佳实践、0行手写代码、百…...

【调试心法】别用 printf 谋杀你的系统了!打破“测不准”魔咒,用 C++ 与 DMA 构筑微秒级零开销异步观测者

摘要&#xff1a;在硬实时控制系统中&#xff0c;最可怕的 Bug 往往是薛定谔的 Bug——当你试图用 printf 去观察它时&#xff0c;观察行为本身产生的巨大延迟&#xff0c;就足以改变系统的物理运行轨迹。本文将无情揭露同步串口打印的耗时真相&#xff0c;批判阻塞式调试对高频…...

Qwen3-0.6B-FP8代理能力展示:调用计算器、查天气、解析PDF的Chainlit实录

Qwen3-0.6B-FP8代理能力展示&#xff1a;调用计算器、查天气、解析PDF的Chainlit实录 1. 引言&#xff1a;当小模型遇上大智慧 你可能听过很多关于大语言模型的讨论&#xff0c;动辄几十亿、上百亿参数&#xff0c;感觉它们无所不能。但今天我想和你聊聊一个不太一样的模型—…...

7_Harness驾驭工程安全与成本层:DevSecOps与云成本优化

7_Harness驾驭工程安全与成本层&#xff1a;DevSecOps与云成本优化 关键字&#xff1a; DevSecOps、安全测试编排、STO、SAST、DAST、SCA、OPA策略、策略即代码、Rego、软件供应链安全、SBOM、依赖追溯、云成本管理、CCM、FinOps、资源浪费识别、预算告警、RBAC、审计日志、单位…...

PX4飞控系统深度解析:从模块化架构到自主飞行核心技术揭秘

PX4飞控系统深度解析&#xff1a;从模块化架构到自主飞行核心技术揭秘 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 你是否曾好奇&#xff0c;一个开源飞控系统如何支撑从微型无人机到工业级无人…...

华为光猫配置解密工具技术架构解析与实现机制

华为光猫配置解密工具技术架构解析与实现机制 【免费下载链接】HuaWei-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/hu/HuaWei-Optical-Network-Terminal-Decoder 在网络设备运维领域&#xff0c;华为光猫配置文件的安全加密机制为设备…...

UE5 Widget Blueprint实战:5分钟搞定动态血量条与得分系统(附完整蓝图代码)

UE5 Widget Blueprint实战&#xff1a;5分钟搞定动态血量条与得分系统&#xff08;附完整蓝图代码&#xff09; 在独立游戏开发中&#xff0c;UI系统往往是决定玩家体验的关键因素之一。想象一下&#xff1a;当玩家在激烈的战斗中无法快速获取角色状态&#xff0c;或是完成成就…...

OpenClaw定时任务管理:ollama-QwQ-32B实现智能提醒系统

OpenClaw定时任务管理&#xff1a;ollama-QwQ-32B实现智能提醒系统 1. 为什么需要智能提醒系统 作为一个长期被各种截止日期折磨的技术从业者&#xff0c;我一直在寻找一个能够真正理解我需求的提醒工具。传统的日历应用虽然能设置固定时间的提醒&#xff0c;但缺乏灵活性——…...

VRM-Addon-for-Blender:虚拟角色创作全流程指南

VRM-Addon-for-Blender&#xff1a;虚拟角色创作全流程指南 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 or later 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender VRM-Addon-for-Blender是一款…...

scanf_s使用避坑指南:如何正确应对C6064警告(含C6054连带问题处理)

scanf_s安全使用全指南&#xff1a;彻底解决C6064与C6054警告 在Windows平台进行C/C开发时&#xff0c;使用scanf_s函数处理用户输入是常见场景。但许多开发者都会遇到两个令人困惑的警告——C6064和C6054。这些警告看似简单&#xff0c;实则暗藏玄机。本文将带你深入理解这两个…...

Phi-4-Reasoning-VisionGPU算力:双卡4090推理吞吐达12 token/s实测

Phi-4-Reasoning-VisionGPU算力&#xff1a;双卡4090推理吞吐达12 token/s实测 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具。该工具专为双卡RTX 4090环境优化&#xff0c;通过精心设计的架构和优化策略&a…...

学术PDF处理神器:OpenClaw+GLM-4.7-Flash自动提取关键结论

学术PDF处理神器&#xff1a;OpenClawGLM-4.7-Flash自动提取关键结论 1. 为什么需要自动化文献处理&#xff1f; 作为一名经常需要阅读大量学术文献的研究者&#xff0c;我发现自己花费在整理文献上的时间甚至超过了实际阅读时间。每次下载几十篇PDF后&#xff0c;手动提取目…...

UPF实战:如何用set_isolation命令优化电源域隔离策略(附常见配置误区解析)

UPF实战&#xff1a;如何用set_isolation命令优化电源域隔离策略&#xff08;附常见配置误区解析&#xff09; 在复杂的SoC设计中&#xff0c;电源管理已成为芯片性能与可靠性的关键瓶颈。当工程师面对多电压域设计时&#xff0c;电源域隔离策略的优劣直接影响着芯片的静态功耗…...

利用通义千问模型辅助C语言学习:从基础语法到指针难题解析

利用通义千问模型辅助C语言学习&#xff1a;从基础语法到指针难题解析 学C语言&#xff0c;是不是经常卡在某个概念上&#xff0c;比如那个让人又爱又恨的“指针”&#xff1f;或者写了一段代码&#xff0c;运行结果和预想的完全不一样&#xff0c;却死活找不到原因&#xff1…...

用TurtleBot3实测:Navigation2局部代价地图的滚动窗口为何必须用odom坐标系?

TurtleBot3实测&#xff1a;为什么Navigation2局部代价地图必须绑定odom坐标系&#xff1f; 当你在Gazebo中第一次看到TurtleBot3的导航表现时&#xff0c;可能会对局部代价地图&#xff08;Local Costmap&#xff09;的坐标系选择产生疑问。为什么这个实时更新的避障地图要绑定…...

Lingbot-Depth-Pretrain-VitL-14处理复杂光照与反射场景效果展示

Lingbot-Depth-Pretrain-VitL-14处理复杂光照与反射场景效果展示 深度估计技术&#xff0c;简单来说就是让计算机像人眼一样&#xff0c;判断出画面中每个物体离我们有多远。这项技术在自动驾驶、机器人导航、增强现实等领域都扮演着关键角色。然而&#xff0c;当场景中出现一…...

避开Webots 2021b+的材质下载坑:保姆级配置2021a旧版本(附Ubuntu/PyCharm环境)

避开Webots 2021b的材质下载坑&#xff1a;保姆级配置2021a旧版本&#xff08;附Ubuntu/PyCharm环境&#xff09; 如果你最近尝试安装Webots最新版本时&#xff0c;遇到了材质无法下载的报错&#xff0c;这篇文章就是为你准备的。作为一个长期使用Webots进行机器人仿真的开发者…...

别再手动重启了!CRMEB定时任务修改后,这两种生效方式你选对了吗?

CRMEB定时任务深度解析&#xff1a;两种触发模式的选择与实战优化 在电商系统运维中&#xff0c;定时任务如同隐形的齿轮&#xff0c;默默推动着优惠券发放、订单状态更新、数据报表生成等关键业务流程。CRMEB作为基于ThinkPHP6的成熟电商解决方案&#xff0c;其定时任务模块设…...