Skip to content

Next.js 高级架构

Next.js standalone 和自托管如何设计运行时边界?

Standalone 主要缩小部署产物,不会自动提供容器编排、缓存、日志、密钥和高可用治理。

适合阶段:资深前端 / DevOps 面核心能力:Standalone · Node · Container

面试官想考什么

  • 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/staticpublic。构建环境与运行环境的 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 被客户端模块导入。

推荐阅读

基于 MIT 协议开源