跳到主要内容

Edge 和 Node.js 运行时

在 Next.js 的上下文中,运行时指的是在执行过程中可用于代码的一组库、API 和一般功能。

在服务器上,有两种运行时可以渲染您的应用程序代码的部分:

  1. Node.js 运行时(默认)具有对所有 Node.js API 和生态系统中兼容的包的访问权限。
  2. Edge 运行时基于 Web API。

运行时差异​

在选择运行时时需要考虑许多因素。以下表格快速查看了主要差异。如果您想要更深入地分析差异,请查看下面的各节。

NodeServerlessEdge
Cold Boot/NormalLow
HTTP StreamingYesYesYes
IOAllAllfetch
Scalability/HighHighest
SecurityNormalHighHigh
LatencyNormalLowLowest
npm PackagesAllAllA smaller subset
Static RenderingYesYesNo
Dynamic RenderingYesYesYes
Data Revalidation w/ fetchYesYesYes

Edge 运行时​

在 Next.js 中,轻量级的 Edge 运行时是可用 Node.js API 的一个子集。

Edge 运行时非常适合在低延迟下提供动态、个性化内容的情况,其函数简单且资源利用极小,因此速度快。 但在许多场景下,这可能是有限制的。

例如,在 Vercel 上执行的 Edge Runtime 中的代码不能超过 1 MB 到 4 MB 之间。 这个限制包括导入的包、字体和文件,具体取决于您的部署基础设施。

Node.js 运行时​

使用 Node.js 运行时可以让您访问所有 Node.js API,以及依赖于这些 API 的所有 npm 包。 然而,与使用 Edge 运行时的路由相比,它启动速度不如后者快。

将 Next.js 应用程序部署到 Node.js 服务器将需要管理、扩展和配置基础设施。 或者,您可以考虑将 Next.js 应用程序部署到 Vercel 等无服务器平台,该平台将为您处理这些事务。

无服务器 Node.js​

无服务器是理想的选择,如果您需要一个可处理比 Edge 运行时更复杂的计算负载的可扩展解决方案。 例如,在 Vercel 上使用无服务器函数,您的总代码大小为 50MB,包括导入的包、字体和文件。

与使用 Edge 的路由相比,不足之处在于 Serverless 函数在开始处理请求之前可能需要数百毫秒来启动。 根据您的站点流量,这可能是一个频繁发生的情况,因为这些函数不经常处于“热”状态。

示例​

指定 Next.js 应用程序中个别路由段的运行时的选项。 为此,请声明一个名为 runtime 的变量并导出它。 该变量必须是一个字符串,其值必须是 'nodejs' 或 'edge' 运行时。

以下示例演示了导出运行时的页面路由段,其值为 'edge':

app/page.tsx
export const runtime = 'edge' // 'nodejs'(默认)| 'edge'

您还可以在布局级别上定义运行时,这将使布局下的所有路由在 edge 运行时上运行:

app/layout.tsx
export const runtime = 'edge' // 'nodejs'(默认)| 'edge'

如果未设置段运行时,则将使用默认的 nodejs 运行时。 如果不打算从 Node.js 运行时更改,则不需要使用运行时选项。

请参阅 Node.js 文档 和 Edge 文档 获取可用 API 的完整列表。 这两个运行时还可以根据您的部署基础设施支持流式 处理。