前端微前端吐槽:别再让你的应用变成拼接怪物!
前端微前端吐槽别再让你的应用变成拼接怪物毒舌时刻前端微前端就像拼接玩具——拼得好能变成变形金刚拼得不好就会变成四不像。Single-SPA、Qiankun、Module Federation... 一堆微前端框架让你挑花了眼结果你的应用要么加载慢得要命要么通信困难还有那些没有微前端的你是想让你的应用变成巨石应用吗我就想不明白了为什么微前端要这么复杂你看看现在的项目要么集成困难要么部署麻烦还有那些过度使用微前端的你是想把简单的应用搞得复杂化吗别跟我提什么技术先进先把你的微前端架构搞对再说。还有那些忽视微前端的觉得微前端没用结果应用越来越大维护越来越难最后只能推倒重来。为什么你需要这个代码隔离好的微前端能实现代码隔离减少团队间的冲突。独立部署微前端能实现独立部署提高开发和部署效率。技术栈无关微前端能支持不同的技术栈让团队选择适合的技术。可扩展性微前端能让应用更容易扩展适应业务需求的变化。面试必备面试官最喜欢问微前端的问题掌握这些能让你面试更有底气。装X神器跟同事聊起来你能说上几句微前端的技巧瞬间提升逼格。反面教材// 1. 过度使用微前端 // 小型应用也使用微前端 // 项目结构 /* /apps /header package.json src/ /footer package.json src/ /home package.json src/ /about package.json src/ */ // 问题小型应用使用微前端会增加复杂性得不偿失 // 2. 通信方式混乱 // 使用多种通信方式 // 方式1localStorage localStorage.setItem(user, JSON.stringify(user)); // 方式2window对象 window.sharedState { user }; // 方式3自定义事件 window.dispatchEvent(new CustomEvent(userChanged, { detail: user })); // 问题通信方式混乱难以维护 // 3. 样式冲突 // 没有样式隔离 // app1.css .button { background: blue; color: white; } // app2.css .button { background: red; color: black; } // 问题样式冲突导致UI混乱 // 4. 性能问题 // 多个应用同时加载 // 主应用加载多个子应用 const apps [ { name: app1, entry: //localhost:3001, container: #app1, activeRule: /app1 }, { name: app2, entry: //localhost:3002, container: #app2, activeRule: /app2 }, { name: app3, entry: //localhost:3003, container: #app3, activeRule: /app3 } ]; // 问题多个应用同时加载性能差 // 5. 部署复杂 // 部署流程复杂 // 需要部署多个应用配置多个域名 // 问题部署复杂运维成本高问题过度使用微前端增加复杂性通信方式混乱难以维护样式冲突导致UI混乱性能问题加载慢部署复杂运维成本高正确的做法前端微前端指南// 1. 合理使用微前端 // 大型应用才使用微前端 // 项目结构 /* /apps /marketing package.json src/ /ecommerce package.json src/ /admin package.json src/ */ // 2. 统一通信方式 // 使用状态管理库 // 主应用 import { createStore } from redux; const store createStore(reducer); // 子应用 import { createStore } from redux; const store createStore(reducer); // 通信 window.__GLOBAL_STORE__.dispatch({ type: USER_CHANGED, payload: user }); // 3. 样式隔离 // 使用CSS Modules // Button.module.css .button { background: blue; color: white; } // 使用CSS-in-JS import styled from styled-components; const Button styled.button background: blue; color: white; ; // 4. 性能优化 // 懒加载子应用 const apps [ { name: app1, entry: //localhost:3001, container: #app1, activeRule: /app1, props: { lazy: true } } ]; // 5. 简化部署 // 使用统一的部署策略 // CI/CD配置 name: Deploy on: [push] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - uses: actions/setup-nodev3 with: node-version: 18 - run: npm install - run: npm run build - run: npm run deploy // 6. 使用Module Federation // webpack.config.js const { ModuleFederationPlugin } require(webpack).container; module.exports { plugins: [ new ModuleFederationPlugin({ name: host, remotes: { app1: app1http://localhost:3001/remoteEntry.js, app2: app2http://localhost:3002/remoteEntry.js }, shared: { react: { singleton: true, requiredVersion: ^18.0.0 }, react-dom: { singleton: true, requiredVersion: ^18.0.0 } } }) ] }; // 7. 使用Qiankun // 主应用 import { registerMicroApps, start } from qiankun; registerMicroApps([ { name: app1, entry: //localhost:3001, container: #app1, activeRule: /app1 }, { name: app2, entry: //localhost:3002, container: #app2, activeRule: /app2 } ]); start(); // 子应用 // main.js import { createApp } from vue; import App from ./App.vue; let instance null; export async function bootstrap() { console.log(app1 bootstraped); } export async function mount(props) { instance createApp(App); instance.mount(props.container.querySelector(#app)); } export async function unmount() { instance.unmount(); instance null; } // 8. 统一路由 // 使用react-router或vue-router // 主应用路由 import { BrowserRouter, Routes, Route } from react-router-dom; function App() { return ( BrowserRouter Routes Route path/ element{Home /} / Route path/app1/* element{App1 /} / Route path/app2/* element{App2 /} / /Routes /BrowserRouter ); } // 9. 错误处理 // 全局错误处理 window.addEventListener(error, (event) { console.error(Micro-frontend error:, event.error); }); // 10. 监控和日志 // 使用监控工具 import * as Sentry from sentry/browser; Sentry.init({ dsn: your-dsn, integrations: [new Sentry.BrowserTracing()], tracesSampleRate: 1.0 });微前端工具和资源微前端框架Single-SPA最早的微前端框架Qiankun阿里开源的微前端框架Module FederationWebpack 5的内置功能Piral基于React的微前端框架Bit组件共享平台微前端资源Micro Frontends微前端官方网站Single-SPA文档Single-SPA的官方文档Qiankun文档Qiankun的官方文档Webpack Module Federation文档Module Federation的官方文档最佳实践合理使用微前端统一通信方式样式隔离性能优化简化部署统一路由错误处理监控和日志毒舌点评前端微前端就像拼图——拼得好能拼成一幅美丽的图画拼得不好就会变成一堆碎片。但很多开发者就是爱跟风不管应用大小都使用微前端结果增加了不必要的复杂性。我就想问一句你是想做一个模块化的应用还是想做一个拼接怪物如果你的应用很小使用微前端只会增加复杂性得不偿失。还有那些通信方式混乱的你是想让你的应用变成通信大杂烩吗还有那些样式冲突的你是想让你的UI变成调色板吗还有那些性能问题的你是想让你的应用加载慢得像蜗牛吗还有那些部署复杂的你是想让你的运维人员抓狂吗作为一名前端手艺人我想对所有开发者说别再滥用微前端了好的微前端能提高开发效率过度的微前端只会适得其反。记住微前端是为了解决大型应用的问题而不是为了炫技。你应该根据应用的规模和需求来决定是否使用微前端。最后我想说微前端是一把双刃剑用对了能让你的应用更模块化用错了会让你的应用变得更复杂。所以从今天开始合理使用微前端吧让你的应用更模块化让开发更高效。