Next.js中的一些问题
前言
Generating static pages 渲染两次
RSC 组件,构建阶段都会执行 两次组件渲染, 运行的时候,也会有差异:
next dev
只运行一次next build
运行两次, 第一次是生成 RSC 组件.rsc
,后一次是生成页面.html
, 组件渲染在页面渲染之前触发。page
文件,如果use client
就渲染一次。做了SSG
的事情page
文件,包含RSC
组件, 组件也会被渲染两次。但start
的时候。next start
又分情况了,如果是没有 fetch 的情况,直接使用缓存页面了, 并且在revalidate
之后,重新生成缓存文件。- 要控制页面的失效时间, 应该要小于组件, 不然页面维度一直会被缓存, 只要页面失效了,包含的组件也会被更新
具体一点
当我们使用 RSC 的时候, 构建阶段 Generating static pages
会执行两次。不管是 page
还是 component
, 只要是 RSC
的, 就会执行两次。
在使用的情况, 如果组件有 fetch
请求, 会调用组件的代码两次, 和构建阶段一样。如果没有,则会调用缓存的静态资源,不走 js
代码。直到 revalidate
之后,重新生成缓存文件, 覆盖。
- 所有请求,优先走
html
页面,如果页面含有fetch
, 则立马再调用 RSC 组件渲染 - 静态的 RSC 组件,默认就走缓存了,不会触发组件渲染的 JS 代码, 但当
revalidate
之后,会重新调用组件渲染 JS 代码,覆盖缓存文件
相关 issues:
- Production build call data fetching function twice (server components, app directory) · Issue #44966 · vercel/next.js
- Server components run twice during build and re-validation phase. · vercel/next.js · Discussion #52934
现象:
- 组件中有
fetch
请求外部服务, 默认还是static
的渲染方式 next build
的时候,Generating static pages
对 RSC 组件渲染了两次