主题
Next.js 高级架构
Next.js standalone 和自托管如何设计运行时边界?
Standalone 主要缩小部署产物,不会自动提供容器编排、缓存、日志、密钥和高可用治理。
面试官想考什么
output: standalone解决了什么? 考察构建产物。- 静态资源如何部署? 考察
.next/static和 public。 - 自托管如何做健康检查和优雅退出? 考察运行时治理。
- Serverless 与自托管怎么选? 考察成本和运维边界。
一句话回答
text
standalone 生成包含必要运行依赖的精简 Node 部署产物,适合容器化自托管;但仍需独立设计静态资源/CDN、反向代理、日志、健康检查、密钥、扩缩容和缓存一致性。面试回答详解
1. 产物组成
text
next build -> standalone server + static assets + public
-> container/runtime -> proxy/CDN不要只复制 standalone 目录而遗漏 .next/static 或 public。构建环境与运行环境的 Node 版本和 libc 也要兼容。
2. 运行时职责
Node 进程负责渲染、Route Handler 和服务端逻辑;CDN 负责静态资源和适合缓存的公共内容;反向代理负责 TLS、压缩、超时和流式转发。
3. 高可用
实例应无状态,session 放外部存储或签名 cookie,生成任务和缓存不能依赖单进程内存。配置 readiness/liveness、优雅关闭、请求超时和连接池上限。
4. 安全
运行时 secret 通过部署平台注入,不能编译进客户端 bundle。限制内部 debug 路由,正确设置 trust proxy、Host 和 forwarded headers,日志脱敏。
5. 选型边界
- 自托管:控制力强,适合稳定 Node 服务和定制网络。
- Serverless:弹性好,但有时长、连接和冷启动约束。
- Edge:分发近用户,但 Node 依赖和数据库能力受限。
可直接背诵的 30 秒回答
text
standalone 的价值是生成精简的 Node 运行产物,便于容器化,不等于部署平台。自托管还要补上 static/public 资源、CDN、反向代理、健康检查、优雅退出、无状态扩容、连接池、密钥和日志治理。选型时看长任务、Node 依赖、流式、成本和团队运维能力。扩展知识
容器镜像检查
text
Node 版本 -> 原生依赖 -> standalone -> static/public
-> 非 root 用户 -> healthcheck -> graceful shutdown面试官追问链
追问一:standalone 是否适合静态导出?
- 考察点:部署模型。
- 回答方向:两者目标不同;standalone 是 Node 服务产物,static export 是静态文件产物。
追问二:为什么多实例后内存缓存不一致?
- 考察点:无状态架构。
- 回答方向:每个进程有独立内存,需要共享缓存、明确 TTL/失效或接受本地缓存只是优化。
追问三:怎样确认 secret 没进 bundle?
- 考察点:安全验证。
- 回答方向:区分 NEXT_PUBLIC 变量,扫描产物和 source map,构建时禁止服务端 secret 被客户端模块导入。