Next.js“构建时间”究竟何时发生?

IT技术 reactjs next.js
2021-04-22 23:37:56

我正在阅读 Next.js 获取文档的数据部分,我想到了一个问题。

Next.js 可以使用getStaticProps, getStaticPaths,getInitialProps获取数据getServerSideProps,对吗?

但正如我引用的那样,有些发生在构建时:

getStaticProps(静态生成):在构建时获取数据

这个构建时间是什么时候发生的?

是我们跑步的时候npm run build吗?(构建生产版本)

或者当用户访问我们的 Next.js 应用程序时?(在每个请求上)

1个回答

构建时间发生在您为生产构建应用程序 ( next build) 时。运行时发生在应用程序在生产环境中运行时 ( next start)。

getInitialProps(gIP) 在运行时针对每个页面请求在客户端和服务器上运行。最常见的用例是在请求的页面加载之前检索某种共享数据(例如让客户端和服务器知道用户是否导航到特定页面的会话)。这总是在 getServerSideProps 之前运行。虽然技术上不鼓励使用它,但有时绝对有必要在客户端和服务器上做一些逻辑。

getServerSideProps(gSSP) 仅在运行时针对每个页面请求在服务器上运行。最常见的用例是在页面加载之前从数据库中检索最新的、特定于页面的数据(例如产品的定价和显示其库存量)。当您希望页面进行搜索引擎优化 (SEO) 时,这一点很重要,搜索引擎将最新的站点数据编入索引(我们不希望我们的产品显示“有货 - 100 件”,当它实际上是一个停产的产品!)。

getStaticProps(gSProps) 仅在构建时运行(有点)。这对于数据和页面不经常更新的站点来说非常有用。这种方法的优点是页面是静态生成的,因此如果用户请求该页面,他们将下载一个优化的页面,其中已将动态数据烘焙到其中。最常见的用例是博客或某种可能不会经常更改的大型产品购物目录。

getStaticPaths(gSPaths) 仅在构建时运行(有点)。它非常适合预渲染/blog/:id需要在构建时使用动态数据的类似路径(如)。当与 gSProps 结合使用时,它会从数据库/平面文件/某种数据结构生成动态页面,然后 Next 可以静态提供这些页面。一个示例用例是一个博客,其中有许多博客文章共享相同的页面布局和类似的页面 URL 结构,但需要在构建应用程序时将内容动态添加到页面中。

为什么gSProps和gSPaths排序的过程中积累的时间跑了?好吧,接下来介绍revalidatefallback允许这两种方法在几秒钟超时后在运行时运行的选项。如果您希望静态地重新生成页面,这很有用,但它应该每 n 秒重新生成一次。优点是页面在导航到时不需要请求动态数据,但缺点是页面最初可能会显示陈旧数据。该页面也不会重新生成,直到用户访问该页面(以触发重新验证),然后同一用户(或其他用户)请求同一页面以查看该页面的最新版本。这会导致用户 A 看到陈旧数据而用户 B 看到准确数据的不可避免的后果。对于某些应用程序来说,这没什么大不了的,对于其他应用程序来说,这是不可接受的。

最后,还有客户端呈现/请求 (CSR),它们是在客户端运行时请求的资产,对 SEO 来说并不重要。最常见的用例是用户特定的仪表板页面,该页面仅与该用户相关,因此不需要被搜索引擎索引。

其他注意事项:gIP 和 gSSP 是渲染阻塞。意思是,在他们的代码解析/返回props之前,页面不会加载。这具有在页面加载之前显示空白页面的不可避免的后果。这也意味着更慢的页面响应时间,其中:页面被请求,gIP/gSSP 运行阻止页面加载的代码,gIP/gSSP 代码解析,然后下载资产,页面在加载 HTML 时开始在客户端上加载 JavaScript进入 DOM,JavaScript 运行完毕,然后页面重新水化,然后变成交互式。

@MattCarlotta 我感到困惑的是,当 api/database 没有数据(通常是第一次部署时的情况)时,您将在第一次构建时使用数据库中的哪些数据,因为数据是从前端部署时添加的
2021-05-29 23:37:56
是和否。如果您将 gSPaths 和 gsProps 与revalidatethen no一起使用,则无需手动重建。否则,是的。gSPaths 的主要目的是在构建期间解析来自 API 的未知路径如果没有 gSProps,就无法在运行时从 API 检索新数据当一起使用时,它们会在运行时逐步构建静态页面将来,他们能够实现用户不需要为了重新验证而获取页面的功能;相反,当 API 中的数据发生变化时,页面将被重建。
2021-05-30 23:37:56
感谢这份完整的指南!还有一个问题。因此,例如,如果我有一个博客并检索所有带有 gSPaths(例如 1、2、3)的帖子 ID,并且我创建了一个带有 Id 4 的新帖子,我必须创建一个新的生产版本来更新博客那个新帖子?
2021-06-07 23:37:56
如果您使用revalidatewithfallback则没有;否则,是的,那么你就必须重建。
2021-06-09 23:37:56
哇,NextJS 太强大了。感谢您帮助我更多地了解这个框架!
2021-06-16 23:37:56