简单来说,前端微服务就是把后端那套微服务思想搬到浏览器里。传统单体前端应用把所有功能打包成一个巨无霸,而微前端则将应用拆分成若干独立子应用,每个子应用能独立开发、测试、部署,最后在运行时组合成完整产品。比如电商网站的商品列表、购物车、用户中心可以分别由不同团队用不同技术栈开发,用统一容器整合。
为什么非要拆?首先是技术栈解耦。老项目用jQuery,新业务想上Vue3?在单体应用里基本得重写,而微前端允许新旧模块共存。其次能提升团队自治性,A组专攻支付流程,B组负责商品展示,各自用擅长的工具链迭代,发版不用互相等待。最重要的是,这种架构能匹配业务中台的快速演进需求,比如某条业务线要独立运营,直接抽离子应用即可落地。
落地微前端有几个核心思路。最常见的是路由分发式,通过NGINX或网关根据URL路径指向不同子应用,适合业务模块界限清晰的场景。更灵活的是组合式架构,使用像Single-SPA这类框架作为基座,动态加载子应用。国内流行的qiankun基于Single-SPA封装,提供了沙箱隔离和资源预加载能力。还有Web Components原生方案,用Custom Element封装组件,不过生态工具尚不成熟。
实际实施时得注意几个坑。样式隔离不能光靠CSS Modules,建议结合Shadow DOM或运行时样式前缀改写。JS沙箱必须做,避免子应用全局变量污染,qiankun的proxy隔离机制就不错。公共依赖处理更要谨慎,把React、Vue这些库提到外部CDN,通过externals方式引用,否则多个子应用重复加载会导致包体积爆炸。
数据通信是另一个关键点。推荐采用状态下沉模式,主应用维护全局状态,通过自定义事件或状态管理库与子应用交互。比如用户登录信息由主应用通过props注入子应用,子应用间的通信则通过发布订阅模式,避免直接耦合。记得定义好通信协议,不然后期维护会变成"找不同"游戏。
部署环节也要对应调整。每个子应用应有独立CI/CD流水线,生成带版本号的静态资源。主应用通过配置中心动态拉取最新子应用地址,蓝绿发布时只需更新配置表。别忘了监控整合,将各子应用的性能指标、错误日志统一上报到监控平台。
这种架构当然不是银弹。如果业务简单、团队规模小,强拆微服务反而增加复杂度。链路追踪变得更困难,用户的一次操作可能跨越多个子应用,需要实现全链路ID透传。SEO优化也得额外处理,毕竟服务端渲染多个独立应用比单体应用复杂得多。
现在团队用qiankun重构了老项目,虽然前期花了三周搭建基座,但后续需求迭代速度明显提升。有个趣事:有个子应用团队偷偷把构建工具从Webpack换成Vite,其他团队完全没感知------这大概就是微前端的魅力所在。未来如果Web 5.0真来了,这种架构或许能让我们更从容地应对技术变革。