Edge 和 Node.js 运行时
在 Next.js 中,运行时 (runtime) 指的是代码执行期间可用的库、API 和通用功能的集合。
在服务端,您的应用代码可以通过两种运行时环境进行渲染:
- Node.js 运行时(默认)可访问所有 Node.js API 及生态系统中兼容的包。
- Edge 运行时基于 Web API 实现。
运行时差异
选择运行时需考虑诸多因素。下表简要展示了主要区别。如需深入分析差异,请查看下方章节。
Node | 无服务 (Serverless) | Edge | |
---|---|---|---|
冷启动 | / | 常规 | 极低 |
HTTP 流式传输 | 支持 | 支持 | 支持 |
IO 操作 | 全部 | 全部 | 仅限 fetch |
可扩展性 | / | 高 | 最高 |
安全性 | 常规 | 高 | 高 |
延迟 | 常规 | 低 | 最低 |
npm 包支持 | 全部 | 全部 | 有限子集 |
静态渲染 | 支持 | 支持 | 不支持 |
动态渲染 | 支持 | 支持 | 支持 |
通过 fetch 实现数据重新验证 | 支持 | 支持 | 支持 |
Edge 运行时
在 Next.js 中,轻量级的 Edge 运行时是 Node.js API 的可用子集。
如果您需要通过小型简单函数实现低延迟的动态个性化内容交付,Edge 运行时是最佳选择。其速度优势源于极简的资源占用,但这也会在许多场景中形成限制。
例如,在 Vercel 上执行的 Edge 运行时代码体积限制为 1 MB 至 4 MB,此限制包含导入的包、字体和文件,具体数值取决于您的部署基础设施。此外,Edge 运行时不支持所有 Node.js API,这意味着某些 npm
包可能无法工作(例如出现 "Module not found: Can't resolve 'fs'" 类错误)。如需使用这些 API 或包,我们推荐使用 Node.js 运行时。
Node.js 运行时
使用 Node.js 运行时可以访问所有 Node.js API 及依赖这些 API 的 npm 包。但其启动速度不及使用 Edge 运行时的路由。
将 Next.js 应用部署到 Node.js 服务器需要自行管理、扩展和配置基础设施。作为替代方案,您可以考虑将应用部署到 Vercel 等无服务平台,这些平台会为您处理这些事务。
无服务 Node.js
无服务模式是需要处理比 Edge 运行时更复杂计算负载的可扩展解决方案。例如在 Vercel 上,无服务函数的总体代码大小限制为50MB,包含导入的包、字体和文件。
相比 Edge 路由的劣势在于,无服务函数可能需要数百毫秒的启动时间才能开始处理请求。根据站点流量情况,这种情况可能频繁发生,因为函数不会经常保持"热"状态。
完整 API 列表请参阅 Node.js 文档 和 Edge 文档。根据部署基础设施的不同,两种运行时也都支持流式传输。