各位老师好,我们这个B2C金融项目最终排除qiankun,核心不是“技术偏好”,而是qiankun的底层架构设计与SSR的核心逻辑完全冲突,且即便强行hack适配,也无法满足金融场景“SSR性能刚需+零容错运行时隔离”的核心诉求。接下来我先拆解SSR的本质,再讲qiankun不支持SSR的底层原理,最后结合我们的金融场景说明为什么完全不可行:
Next.js SSR的核心价值是在Node.js服务端完成页面HTML的完整渲染,直接返回给浏览器,核心逻辑有三个关键点:
window、document、history等浏览器专属全局对象,只有Node.js的global环境;这三点是SSR能实现“首屏快速加载”的核心,也是我们金融项目的硬性刚需——登录页的首屏速度直接影响用户登录转化,后台布局的秒开体验直接影响交易操作的流畅性,放弃SSR会直接损害核心业务指标。
qiankun的架构设计从诞生起就完全基于浏览器客户端环境,其核心沙箱、加载、隔离逻辑均与SSR的Node.js环境、同步渲染、无DOM特性深度冲突,具体拆解为4个维度:
qiankun的沙箱是其实现“微前端隔离”的核心,分为快照沙箱(适配低版本浏览器)和代理沙箱(主流方案),但两者都无法脱离浏览器环境:
Proxy劫持window对象实现JS隔离,核心代码逻辑是const proxyWindow = new Proxy(window, {...})——但Node.js环境中没有window对象,只有global,且global的劫持逻辑与window完全不同,qiankun的沙箱初始化代码在服务端会直接抛出“window is not defined”错误,无法执行;window对象的初始状态、修改后状态,实现沙箱激活/销毁的状态恢复,核心依赖MutationObserver(监听DOM变化)和window的属性遍历——Node.js无MutationObserver,也无window,快照沙箱同样无法初始化。简单说:qiankun的沙箱是“浏览器环境的产物”,而SSR的服务端是Node.js环境,两者的底层运行环境完全不兼容,沙箱无法启动,隔离逻辑从根上失效。
qiankun加载子应用的核心流程是:
主应用客户端挂载 → 监听路由变化 → 异步fetch子应用的JS/CSS资源 → 动态eval执行JS → 挂载子应用到主应用的DOM节点
这个流程有两个核心问题无法适配SSR:
eval,挂载是通过document.getElementById()找到容器后插入DOM——但SSR服务端无document,也无法执行eval(即便执行也无DOM可挂载),子应用的渲染逻辑在服务端完全无法落地。qiankun的“软隔离”(区别于无界的iframe硬隔离)包括样式隔离和JS隔离,两者都依赖客户端真实DOM:
scoped前缀(如[data-qiankun="appName"]),需遍历客户端真实的样式表DOM节点修改;② shadow DOM(浏览器专属特性)。但SSR服务端只有HTML字符串,无真实样式表DOM,无法添加scoped前缀,也不支持shadow DOM,最终会导致子应用样式全局污染(比如营销模块的样式覆盖核心交易模块的按钮样式);window的全局变量实现隔离,但服务端无window,只能劫持global,而global是Node.js的全局环境,所有子应用的全局变量会直接污染global,导致子应用之间、子应用与主应用的变量冲突(比如两个子应用都定义了utils方法,服务端渲染时会互相覆盖)——这对金融项目是致命的,核心交易模块的全局风控方法若被污染,会直接引发资金安全问题。我们的项目是类后台布局,左侧侧边栏的路由需与右侧子应用精准匹配,而qiankun的路由劫持逻辑是:
window.history.pushState/popState事件,拦截路由变化后加载对应子应用;history API,qiankun无法监听路由变化,也无法根据服务端的req.url匹配对应子应用,最终导致“服务端渲染的路由与子应用不匹配”(比如浏览器请求/account,服务端渲染出营销模块的内容),完全破坏类后台的路由逻辑。有同学可能会问“能不能hack适配qiankun+SSR?”,我们前期做过技术验证,结论是适配成本极高,且完全失去SSR和微前端的核心价值:
global)、加载(同步获取子应用资源)、隔离(无DOM下的样式/JS隔离)逻辑,改造量超过80%,相当于重新开发一个微前端框架,且改造后无法保证稳定性,金融项目无法承担这种自研风险;简单说:强行适配qiankun+SSR,要么失去SSR的性能价值,要么失去微前端的隔离价值,要么承担极高的自研风险,三者都是金融项目无法接受的。
无界能成为我们的选择,核心是其底层架构从设计上就兼容SSR,且满足金融场景的隔离刚需:
回到我们的项目:
因此,排除qiankun不是技术偏好,而是其底层架构与我们的核心诉求(SSR性能+金融级隔离)完全冲突,且无可行的适配方案,而Turborepo+无界的组合,既解决了20+人团队的工程化效率问题,又保留了SSR性能和金融级隔离,是唯一适配我们场景的选择。