Next.js服务端渲染介绍
本网站运用Next.js构建,Next.js和Vercel自动为我的网页提供了最佳的渲染策略,没有多余配置即实现了多种渲染的策略。
例如,本站的主页是SSG(静态渲染的网页),一旦构建之后页面上的数据就不在发生变化,“我的博客”则是SSR页面,可以动态的渲染页面。所以可能出现这样的情况–在“我的博客”中更新了新的文章,而主页上“最新博客”这一览上没有更新,这就是因为主页和“我的博客”使用了不同的渲染方式。而这些渲染方式我没有手动配置,由nextjs自动选择。虽然不需要我们手动配置,但是了解每种渲染方式背后的原理还是有必要的。这篇博客博客介绍下常见的几种渲染策略和他们的用途。其中,我会重点介绍和对比CSR和SSR。
缺点很显然,每次点击一个链接网页需要重新加载,并且网页的交互性有限。
第三个缺点是,数据请求的代码也包含在这个客户端的js bundle中,有被黑客提取用于攻破服务器的风险
首先,客户端发送请求后,服务端向客户端发出回应,客户端下载一个巨大的js bundle; 然后浏览器解析这个js bundle,解析完成后,网页上的UI和交互性同时完成。在下载bundle和解析的过程中,会出现较长时间,也就是我们所说的首屏白屏时间。后续的数据请求等都发生在客户端。
这种渲染方式的缺点是需要额外的服务器来进行服务端渲染
浏览器向服务端发送请求后,服务端例如Nextjs会获取到所有所需的数据来运行react生成相应的静态界面,并发送到客户端,这时客户端可以清楚的看到网页内容加载好了,首屏时间较短。之后还会发送一个体积较小的js bundle将其水合到原先的html上。
这时,网页的功能就算完全加载完毕。

现在许多React的第三方库开始区分client component和server component,所以还是有必要了解一下。Server component的数据请求会发生在服务端,这时nextjs的开发者开始搞事了,在nextjs14中推出的use server中直接写sql代码,其安全性存疑,也引来网友嘲讽这些前端开发者过于懒惰,直接省略了API写sql,建议前端开发直通电路板一步到位。。。

这种渲染方式体现在客户端上响应十分迅速,在服务端方面也不需要服务端每次进行大量的渲染工作
这个渲染方式的缺点显而易见,只有在项目构建时才能生成新的内容,所以每次数据更新网站都需要重新部署。
ISR结合了SSG和SSR的优点,同时避免了二者的缺点。客户端可以快速下载渲染好的静态页面,并且保证数据有一定的动态性,同时服务端不需要消耗大量资源为每次请求渲染相应的页面。
缺点是构建和部署有一定门槛,推荐使用nextjs+vercel可以快速进行部署。
提出这一渲染策略的是Astro,在Astro中,还可以在每个island中使用不同的前端框架,一个页面可以是多个框架混用,React, Svelte, Vue等等
在这个渲染策略中,事件(交互性)代码被写进了html,
下图是水合过程的示例,以及和resumable application的渲染时间对比
可以看到不需要水合的渲染对比需要水合的渲染响应速度提升非常多。
而水合相比与一开始客户端渲染所需要完整的js bundle也非常多。
如果直接用与对比目前常见的CSR渲染,resumablity提升巨大
