需要注意的是,OpenNext 实际上并不部署应用程序。它只是将所有内容打包供您的基础设施即代码(IAC)工具进行部署。
以下是部署 Next.js 应用程序的不同方案对比表:
功能特性 | OpenNext | Vercel | AWS Amplify | Docker 独立部署 |
---|---|---|---|---|
函数拆分 | 支持 | 支持 | 不支持 | 不支持 |
多部署目标 ¹ | 支持 | 支持 ² | 不支持 | 不支持 |
无服务器架构 | 支持 | 支持 | 支持 | 不支持 ³ |
预热函数 | 支持 | 不支持 | 不支持 | 无需 |
外部中间件 | 支持 ⁴ | 支持 | 不支持 | 不支持 |
边缘运行时支持 | 部分支持 ⁵ | 支持 | 内置 ⁶ | 内置 ⁶ |
增量静态再生(ISR) | 支持 | 支持 | 支持 | 支持 ⁷ |
按需重新验证 | 支持 ⁸ | 支持 | 不支持 | 支持 ⁸ |
自定义服务器 | 支持 ⁹ | 不支持 | 不支持 | 支持 |
- 多部署目标指可以将应用程序的不同部分部署到不同目标,例如部分部署到 ECS,部分部署到 Lambda 等
- Vercel 仅支持无服务器 Node 环境(基于 AWS Lambda)和边缘运行时(基于 Cloudflare Workers)
- 可以使用 AWS Lambda Web 适配器将 Docker 化的 Next.js 应用部署到 AWS Lambda,但 ISR 等功能可能无法按预期工作
- OpenNext 支持外部中间件,但默认未启用
- OpenNext 在 Node 环境中支持边缘运行时,但每个路由需要单独部署。OpenNext 在 Cloudflare Workers 中支持边缘运行时,但仅限于应用路由的 API 路由
- 内置指边缘运行时被嵌入到打包文件中,它会在生产环境中模拟一个虚拟的边缘运行时
- 如果应用前有 CDN,ISR 可能会出现不一致的情况。Next 总是将 cache-control 头设置为
s-maxage=REVALIDATION_TIME, stale-while-revalidate
,这意味着您的数据(json 或 rsc)和 HTML 可能不同步 - 需要手动使 CDN 缓存失效。对于 OpenNext,这里有一个 CloudFront 的示例
- OpenNext 支持自定义服务器,但默认未启用。即使在无服务器环境中也可以使用自定义服务器