Angular 12.1 SSR热重载失效无报错 请求挂起页面永久加载
问题根因
这是Angular 12.0~12.1版本Universal SSR开发模式下的官方已知Bug,和项目代码、个人配置、设备环境无关。
触发逻辑:保存代码触发热重载时,@nguniversal/builders 内置的ssr-dev-server在重新编译完服务端bundle后,没有正确销毁旧Node渲染进程持有的请求响应句柄、端口监听引用,新编译产物启动后新旧进程句柄冲突,导致当前路由的SSR请求既没有被旧进程返回结果,也没有被新进程接管,最终一直处于pending挂起状态。CSR模式不涉及Node层服务端渲染进程,因此不会触发该问题。
匹配特征
你观察到的所有现象完全对应该Bug的典型表现:
- 新建空白Angular 12项目仅集成Angular Universal依赖即可稳定复现,和业务代码逻辑无关
- 多台Windows设备测试结果一致,和本地误操作、单设备环境异常无关
- 全程无报错输出,控制台始终提示编译成功
- 手动刷新页面后可正常访问,因为刷新时请求会被已经启动完成的新服务进程正常处理
- CSR场景下无任何异常
解决方案
你之前尝试的DOM拦截、引入Domino、重克隆项目等操作均不针对该问题,可以直接回滚,可选解决方式如下:
- 优先方案:将Angular版本升级到12.2.x及以上,该Bug在12.2版本迭代中已被官方修复
- 锁版本临时方案:如果暂时不能升级框架版本,修改
angular.json中SSR开发服务的配置,关闭增量热重载逻辑,每次代码变更后自动重启完整SSR服务即可。找到serve-ssr构建目标的options节点,添加如下配置:
"serve-ssr": { "builder": "@nguniversal/builders:ssr-dev-server", "options": { "browserTarget": "你的项目名:build", "serverTarget": "你的项目名:server", "liveReload": false, "watch": true } }
- 轻量调试方案:日常开发使用CSR模式调试,仅在需要验证SSR逻辑时启动SSR服务,代码变更后手动重启服务即可。
补充说明
该Bug仅在Windows系统下稳定触发,Mac、Linux系统因Node进程端口、句柄释放的底层逻辑差异,触发概率极低。不存在遗漏的必填配置项,不需要额外调整服务端渲染相关的其他配置。
内容的提问来源于stack exchange,提问作者Wahrenheit Sucher
相关产品推荐
相关产品推荐

