Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >鱼和熊掌兼得:Next.js 混合渲染

鱼和熊掌兼得:Next.js 混合渲染

作者头像
ayqy贾杰
发布于 2020-12-29 07:31:43
发布于 2020-12-29 07:31:43
3.1K0
举报
文章被收录于专栏:黯羽轻扬黯羽轻扬

关注「前端向后」微信公众号,你将收获一系列「用 ? 原创」的高质量技术文章,主题包括但不限于前端、Node.js以及服务端技术

写在前面

React 生态中,SSR 支持做得最好的可能是 Next.js,但 SSR 并不是Next.js的全部,只是其提供的预渲染支持之一:

  • SSG(Static Site Generation/Static Generation):静态生成,在编译时生成静态 HTML
  • SSR(Server-Side Rendering):服务端渲染,用户请求到来时动态生成 HTML

通过各种方式在 CSR 开始之前预先渲染出页面内容,从而加快首屏性能,同时满足 SEO 的需要,这正是 Next.js 最核心的特性

不仅如此,Next.js 还提供了混用支持,能够将不同渲染模式结合使用,融合互补,例如:

  • ISR(Incremental Static Regeneration):增量静态再生成,运行时定期重新生成静态 HTML
  • SSG 降级 SSR:未命中预先生成的静态 HTML 时,立即进行 SSR
  • SSR 带静态缓存:SSR 完成之后,将结果缓存起来,下次命中静态缓存直接返回(相当于 SSG)
  • SSG 结合 CSR:编译时生成静态部分(页面外框),CSR 填充动态部分(页面内容)
  • SSR 联动 CSR:URL 直接访问走更快的 SSR,SPA 跳转过来走体验更优的 CSR

这些细腻的混合渲染支持让各种渲染模式得以充分发挥其优势,也让 Next.js 增色不少

SSG + SSR

SSG 相当于把 SSR 的渲染过程前移到了编译时,从而优化掉这部分耗时,达到极佳的页面加载性能。但也存在明显的缺陷——只能用来渲染静态内容,使得一个原本很厉害的方案很难有用武之地。那么,有没有办法扩大其适用场景?

有。关键在于如何理解“静态”,静态、动态实际上描述的是内容的变化频率,几乎(永远)不会变,或者变化频率很低的内容,我们称之为静态内容。所以只要想办法应对内容变化,就有可能把 SSG 的适用场景从经常不变的“静态内容”扩大到不经常变的“动态内容”

极限情况下,“不经常变”等价于“不是每一次都变”,也就是说,除了实时/个性化等每时每刻都动态变化的内容,其余场景都可以用 SSG,当然,前提是要保障内容能够按需要的频率更新生效。内容更新其实就是重新 SSG,所以只缺一个更新时机……

另一个不那么显而易见的限制是静态内容的数量,因为渲染工作要在编译时全部完成,如果静态数据有 100 万条,就要编译生成 100 万份 HTML,编一次可能需要好几天……编译成本(无论时间/机器)会随内容数量不断增加,这是 SSG 渲染模式与生俱来的问题,看起来是无解的。除非,编译时不生成全量页面……

而面向用户请求的 SSR 恰好能够提供合适的更新时机,同时作为编译的下游,SSR 有机会拦住漏网之鱼。于是,SSG 与 SSR 一拍即合,SSG 只编译生成小部分热点页面,其余的在运行时通过 SSR 生成。用户请求到来时,根据内容是否需要更新来决定该走 SSR 重新生成还是沿用上次生成的产物:

Instead, you may statically generate a small subset of pages and use fallback: true for the rest. When someone requests a page that’s not generated yet, the user will see the page with a loading indicator. Shortly after, getStaticProps finishes and the page will be rendered with the requested data. From now on, everyone who requests the same page will get the statically pre-rendered page. Inspired by stale-while-revalidate, background regeneration ensures traffic is served uninterruptedly, always from static storage, and the newly built page is pushed only after it’s done generating.

如此这般,SSG 扩大了适用场景(高频变化的内容、编不完的海量内容),SSR 获得了性能优势(静态缓存):

This ensures that users always have a fast experience while preserving fast builds and the benefits of Static Generation.

P.S.关于 SSG 与 SSR 结合的更多信息,见When is fallback: true useful?、Incremental Static Regeneration

SSG + CSR

与 SSR 相比,SSG 成本更低,本地编译生成静态 HTML,托管到 Web 服务器CDN 即可享受到预渲染带来的加载性能提升,没有应用服务器的高额机器成本,也不用担心 SSR 在线服务的可用性和运维工作

借助 SSR 扩大 SSG 的应用场景不得不考虑与之俱来的成本问题,那么,有没有成本更低的办法?

也有,但体验上要有所妥协。既然 SSG 擅长渲染静态内容,不妨对页面内容进行动静分离,将页面上静态的部分交由 SSG 编译生成,其余动态部分仍通过 CSR 来填充

First, immediately show the page without data. Parts of the page can be pre-rendered using Static Generation. You can show loading states for missing data. Then, fetch the data on the client side and display it when ready.

SSG 结合 CSR,既缩短了页面加载的白屏时间,又避免了 SSR 的额外成本。不过,美中不足的是加载体验不如纯 SSG,毕竟(用户可能更关心的)动态内容需要在客户端二次渲染才能呈现出来,不像 SSG 能够一次性呈现完整内容。因此,这种方式带来的更多是体验提升,用户感知上页面载入变快了,算是一种渐进式渲染模式

P.S.关于 SSG 与 CSR 结合的更多信息,见Fetching data on the client side

SSR + CSR

SSG、SSR、CSR 三者两两结合,最耐人寻味的可能是这第三种——SSR 结合 CSR

hydrate不算,SSR 与 CSR 还有结合点么?

当然有。SSR 能够有效缩短页面加载过程中的白屏时间,同时提供页面内容一次性完整呈现的畅快体验,与之相比,CSR 渲染性能依赖客户端环境、数据请求滞后等缺点变得无限大,大到掩盖了 CSR 的高光优势:

  • 无刷新加载内容
  • 可根据用户行为预加载

这些优势在首屏加载过程中确实体现不出来,所以单看页面加载性能的话,SSR 完胜 CSR,二者之中任选一个即可,没有结合的必要。然而,如果将视角提升到用户操作的全流程,我们发现 CSR 与 SSR 能够以非常融洽的方式完美结合:

  • 首屏加载走 SSR:无论用户直接通过 URL 访问的是首页还是二级、三级页,SSR 都能让页面以最快的速度呈现出来
  • 站内跳转走 CSR:之后交互操作中的页面跳转,通过 CSR 无缝加载新内容,甚至能够预测用户行为提前加载目标页的内容

即,首屏加载工作交给更快的 SSR 来做,交互过程中让 CSR 大展身手

When you request this page directly, getServerSideProps runs at the request time, and this page will be pre-rendered with the returned props. When you request this page on client-side page transitions through next/link or next/router, Next.js sends an API request to the server, which runs getServerSideProps. It’ll return JSON that contains the result of running getServerSideProps, and the JSON will be used to render the page. All this work will be handled automatically by Next.js, so you don’t need to do anything extra as long as you have getServerSideProps defined.

Next.js 不仅对这种结合方式提供了内置支持,还能够自动预加载可视区域中的站内链接:

prefetch – Prefetch the page in the background. Defaults to true. Any <Link /> that is in the viewport (initially or through scroll) will be preloaded. Prefetch can be disabled by passing prefetch={false}.

P.S.关于 SSR 结合 CSR 的更多信息,见Only runs on server-side

支持原创

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端向后 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
新一代Web技术栈的演进:SSR/SSG/ISR/DPR都在做什么?
在之前的一篇文章地址里,初步介绍了 Jamstack 这套建站技术栈的背景以及各方面优劣势。
腾讯云开发TCB
2021/04/29
4.2K0
新一代Web技术栈的演进:SSR/SSG/ISR/DPR都在做什么?
十分钟上手 Next.js
以前一直在用 create-react-app 来创建 React 项目,奈何 CRA 实在太难用了,今天花了点时间扫了一下 Next.js 的官网,发现用起来还挺简单的。
写代码的海怪
2022/03/30
1.8K0
十分钟上手 Next.js
Next.js进阶:静态生成、服务器端渲染与SEO优化
Next.js在现代Web开发中处于重要地位,尤其是其对静态生成(Static Generation, SG)、服务器端渲染(Server-Side Rendering, SSR)以及搜索引擎优化(Search Engine Optimization, SEO)的强大支持。在本文中,我将深入探讨这些核心特性的工作原理、应用场景及最佳实践,并通过代码示例演示如何在实际项目中高效利用Next.js实现高性能、高SEO友好的应用。
Jimaks
2024/04/16
1.2K0
React 必学SSR框架——next.js
F首先我们就回顾一下,我们到底是怎么告别了使用 php/jsp 做服务器端渲染,进入前后端分离的客户端渲染时代,又为什么重新回到了服务端渲染。
狂奔滴小马
2021/11/15
7.8K0
React 必学SSR框架——next.js
从 Next.js 看企业级框架的 SSR 支持
面向生产使用的 React 框架(废话)。提供了好些开箱即用的特性,支持静态渲染/服务端渲染混用、支持 TypeScript、支持打包优化、支持按路由预加载等等:
ayqy贾杰
2020/12/14
3.9K0
从 Next.js 看企业级框架的 SSR 支持
基于React的SSG静态站点渲染方案
静态站点生成SSG - Static Site Generation是一种在构建时生成静态HTML等文件资源的方法,其可以完全不需要服务端的运行,通过预先生成静态文件,实现快速的内容加载和高度的安全性。由于其生成的是纯静态资源,便可以利用CDN等方案以更低的成本和更高的效率来构建和发布网站,在博客、知识库、API文档等场景有着广泛应用。
WindRunnerMax
2024/06/05
2350
Next.js 简明教程
最近用Next.js + Editor.js 撸了一个博客系统。开发起来甚是畅滑,如果你喜欢React,又有同构的需求,不妨由此文入手。
小刀c
2022/09/21
3.1K0
Next.js 简明教程
Next.js + TypeScript 搭建一个简易的博客系统
来记录下学习(踩坑)的过程,这篇文章的代码都在https://github.com/Maricaya/nextjs-blog-1啦。
coder_koala
2020/09/17
4K0
一起来学 next.js - getStaticProps、getStaticPaths 篇
之前讲过 next.js 中的 getServerSideProps,今天来讲一讲另一个很类似的 API:getStaticProps,以及和 getStaticProps 紧密相关的 getStaticPaths。
嘿嘿不务正业
2023/05/09
1.5K0
一起来学 next.js - getStaticProps、getStaticPaths 篇
不改一行代码!快速部署 Next.js 博客到 Serverless SSR
近期,腾讯云 Serverless 团队发布了 Serverless SSR 产品,支持将 Next.js,Nuxt.js 等框架的应用快速部署和托管,那么,今天我们就通过一个 Next.js 官方案例一起,来了解下该产品有哪些特性吧! 一、写在前面:Next.js & SSR 是什么关系? Server-Side-Rendering(SSR)泛指服务端渲染的技术,指的是在 Server 端将 HTML 渲染好,再返回给 Client 端。并且 SSR 是在对页面每个请求发出时,都会重新抓取和生成页面(和
腾讯云serverless团队
2020/11/23
4.8K0
混合渲染模式:SSG 与其他技术的结合
现代前端开发中,SSG(Static Site Generation,静态网站生成)是一种前沿的技术理念。它在网站开发、构建与部署中占据着重要地位,尤其是在提高性能、SEO 优化、降低服务器压力等方面展现了显著优势。为了更好地理解 SSG,我们需要探讨其技术背景、核心工作原理,并结合具体案例来剖析其实际应用价值。
编程小妖女
2024/12/28
1270
混合渲染模式:SSG 与其他技术的结合
Next.js静态页面渲染技术(静态生成和服务端渲染):BSR/SSR/SSG
next是一款用JS开发的全栈框架,它是基于express框架基础上开发而成,可以用react写客户端,node.js写服务端。一份代码可在前后端同时运行,这在next中称之为同构!
周陆军博客
2023/05/14
3.9K0
Next.js - SSR / SSG / CSR / ISR / Dynamic Routing
Next.js 提供了多种网页渲染方式,这取决于你的服务应用的场景,包括服务端渲染、客户端渲染、静态生成、增量静态生成等。
轻量级云原生架构实验室
2022/12/01
1.3K0
偷师 Next.js:我学到的 6 个设计技巧
本文作为 Next.js 系列的第三篇(也是最后一篇),记录了我从中发现的设计技巧,包括 API 设计、文档设计、框架设计等,也分享给你
ayqy贾杰
2021/01/12
2.4K0
卷起来,前端建站SSG,SSR,ISR,Hydration, Island...一网打尽
React, Vue, Angular 三足鼎立之后,前端界又开始“卷起来了”,不过战火已经单页渲染蔓延到了服务端渲染建站。
小刀c
2022/09/26
1.9K0
卷起来,前端建站SSG,SSR,ISR,Hydration, Island...一网打尽
图解 SSR 等 6 种前端渲染模式
React、Vue 等现代化前端框架的大旗之下,CSR(Client-Side Rendering)模式深入人心:
ayqy贾杰
2020/06/24
4.3K0
图解 SSR 等 6 种前端渲染模式
next.js 源码解析 - getServerSideProps 篇
老规矩,昨天写了关于 getServerSideProps 的内容,今天趁热写一下 getServerSideProps 相应的源码,看看 next.js getServerSideProps 是怎么实现的,还有什么从文档无法知晓的细节。
嘿嘿不务正业
2023/05/09
1.1K0
next.js 源码解析 - getServerSideProps 篇
Next.js 有哪些主要功能?
Next.js 是由 Vercel 开发的一款开源 React 框架,以其丰富的高级功能和对应用性能的优化备受开发者青睐。
前端小智@大迁世界
2025/02/06
2060
基于 Next.js 的 SSR/SSG 方案了解一下?
本文主要是讲讲如何使用 Next.js 框架实现服务端渲染,将有效提升网页的 SEO 和首屏渲染速度,说不定哪天就用上了,是吧!
小东同学
2022/07/29
5.6K0
基于 Next.js 的 SSR/SSG 方案了解一下?
服务端渲染(SSR)与客户端渲染(CSR)详解
在早期 Web 时代,网页主要是静态 HTML 页面,用户点击链接后会刷新整个页面。随着网络与前端技术的发展,人们开始追求更好的页面性能与用户体验,尤其是在移动端和实时交互场景下,对于页面加载速度的要求不断提升。
创意锦囊
2025/01/15
7790
服务端渲染(SSR)与客户端渲染(CSR)详解
相关推荐
新一代Web技术栈的演进:SSR/SSG/ISR/DPR都在做什么?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档