共计 1056 个字符,预计需要花费 3 分钟才能阅读完成。
在 Next.js 的 SSR(服务端渲染)模式下,运行速度同时取决于服务器和用户浏览器,但两者在页面加载的不同阶段承担着不同的职责,其性能瓶颈也各不相同。
具体而言,SSR 的渲染过程可以拆分为以下几个关键环节,它们分别受不同端的影响:
1. 服务器端:决定首字节时间(TTFB)与内容生成速度
在 SSR 模式下,服务器承担了“重头戏”。当用户发起请求时,服务器需要执行 React 渲染、发起数据获取(如查询数据库或调用 API),并将结果序列化为完整的 HTML 发送给浏览器。
服务器性能瓶颈:如果服务器算力不足、数据库查询慢,或者并发请求量过大,都会导致 Node.js 的事件循环成为瓶颈,显著增加首字节时间(TTFB)。
数据获取效率:服务器通常与后端 API 或数据库处于内网环境,网络延迟低,这有助于加快数据获取和 HTML 拼装的速度。
隐性成本:如果传递的 Props 数据量过大,服务器进行序列化(Serialization)的开销也会拖慢响应速度。
2. 网络传输:决定 HTML 到达客户端的时间
服务器生成 HTML 后,需要通过公网传输到用户的浏览器。这段网络的带宽和延迟直接影响用户看到页面内容的时间。
3. 用户浏览器端:决定可交互时间(TTI)与视觉呈现
浏览器接收到服务器返回的 HTML 后,SSR 并没有完全结束,浏览器需要完成以下工作:
解析 HTML(极快):浏览器原生解析 HTML 的速度非常快,这使得 SSR 的首次内容绘制(FCP)远快于客户端渲染(CSR),用户能迅速看到页面内容。
下载并执行 JS(较慢):浏览器需要下载页面所需的 JavaScript 代码,并由 JS 引擎(如 V8)进行解析、编译和执行。如果 JS 包体积过大,这一步会非常耗时。
水合(Hydration):这是 SSR 特有的步骤。浏览器需要在已有的静态 HTML 上绑定事件监听器(如 onClick),使其变为可交互状态。如果页面 DOM 结构复杂或 JS 执行阻塞,可交互时间(TTI)可能会变长。
总结
服务器决定了用户“多快能看到页面的内容”(TTFB 和 FCP)。
用户浏览器决定了用户“多快能真正与页面进行交互”(TTI)。
在实际工程中,为了缓解服务器压力并提升浏览器端的体验,Next.js 提供了多种优化策略。例如,对于不常变动的内容可以使用 SSG(静态生成)或 ISR(增量静态再生),将渲染压力从服务器转移到构建时或 CDN 边缘节点;对于复杂页面,可以利用流式 SSR(Streaming SSR)结合 Suspense,让服务器先发送页面骨架,数据就绪后再流式推送,从而避免浏览器长时间白屏等待。