构建时间发生在您为生产构建应用程序 ( next build
) 时。运行时发生在应用程序在生产环境中运行时 ( next start
)。
getInitialProps
(gIP) 在运行时针对每个页面请求在客户端和服务器上运行。最常见的用例是在请求的页面加载之前检索某种共享数据(例如让客户端和服务器知道用户是否导航到特定页面的会话)。这总是在 getServerSideProps 之前运行。虽然技术上不鼓励使用它,但有时绝对有必要在客户端和服务器上做一些逻辑。
getServerSideProps
(gSSP) 仅在运行时针对每个页面请求在服务器上运行。最常见的用例是在页面加载之前从数据库中检索最新的、特定于页面的数据(例如产品的定价和显示其库存量)。当您希望页面进行搜索引擎优化 (SEO) 时,这一点很重要,搜索引擎将最新的站点数据编入索引(我们不希望我们的产品显示“有货 - 100 件”,当它实际上是一个停产的产品!)。
getStaticProps
(gSProps) 仅在构建时运行(有点)。这对于数据和页面不经常更新的站点来说非常有用。这种方法的优点是页面是静态生成的,因此如果用户请求该页面,他们将下载一个优化的页面,其中已将动态数据烘焙到其中。最常见的用例是博客或某种可能不会经常更改的大型产品购物目录。
getStaticPaths
(gSPaths) 仅在构建时运行(有点)。它非常适合预渲染/blog/:id
需要在构建时使用动态数据的类似路径(如)。当与 gSProps 结合使用时,它会从数据库/平面文件/某种数据结构生成动态页面,然后 Next 可以静态提供这些页面。一个示例用例是一个博客,其中有许多博客文章共享相同的页面布局和类似的页面 URL 结构,但需要在构建应用程序时将内容动态添加到页面中。
为什么gSProps和gSPaths排序的过程中积累的时间跑了?好吧,接下来介绍revalidate
与fallback
允许这两种方法在几秒钟超时后在运行时运行的选项。如果您希望静态地重新生成页面,这很有用,但它应该每 n 秒重新生成一次。优点是页面在导航到时不需要请求动态数据,但缺点是页面最初可能会显示陈旧数据。该页面也不会重新生成,直到用户访问该页面(以触发重新验证),然后同一用户(或其他用户)请求同一页面以查看该页面的最新版本。这会导致用户 A 看到陈旧数据而用户 B 看到准确数据的不可避免的后果。对于某些应用程序来说,这没什么大不了的,对于其他应用程序来说,这是不可接受的。
最后,还有客户端呈现/请求 (CSR),它们是在客户端运行时请求的资产,对 SEO 来说并不重要。最常见的用例是用户特定的仪表板页面,该页面仅与该用户相关,因此不需要被搜索引擎索引。
其他注意事项:gIP 和 gSSP 是渲染阻塞。意思是,在他们的代码解析/返回props之前,页面不会加载。这具有在页面加载之前显示空白页面的不可避免的后果。这也意味着更慢的页面响应时间,其中:页面被请求,gIP/gSSP 运行阻止页面加载的代码,gIP/gSSP 代码解析,然后下载资产,页面在加载 HTML 时开始在客户端上加载 JavaScript进入 DOM,JavaScript 运行完毕,然后页面重新水化,然后变成交互式。