自动静态优化
如果页面没有阻塞数据需求,Next.js 会自动确定该页面是静态的(可以预渲染)。此确定是通过页面中不存在 getServerSideProps
和 getInitialProps
来做出的。
此功能允许 Next.js 发出包含**服务器渲染和静态生成页面**的混合应用程序。
静态生成的页面仍然是响应式的:Next.js 将在客户端对您的应用程序进行水化,以使其具有完全的交互性。
此功能的主要优点之一是,优化的页面不需要服务器端计算,并且可以从多个 CDN 位置立即流式传输给最终用户。结果是为您的用户提供超快的加载体验。
工作原理
如果页面中存在 getServerSideProps
或 getInitialProps
,则 Next.js 将切换到按需、按请求渲染页面(表示服务器端渲染)。
如果不是这种情况,Next.js 将通过预渲染页面为静态 HTML 来**自动优化**您的页面。
在预渲染期间,路由器的 query
对象将为空,因为在此阶段我们没有 query
信息可提供。水化后,Next.js 将触发对您的应用程序的更新,以在 query
对象中提供路由参数。
水化触发另一次渲染后 query
将更新的情况是
为了能够区分 query
是否已完全更新并准备就绪,您可以利用 next/router
上的 isReady
字段。
**注意**:使用动态路由添加到使用
getStaticProps
的页面的参数始终可在query
对象内使用。
next build
将为静态优化的页面发出 .html
文件。例如,页面 pages/about.js
的结果将是
终端
.next/server/pages/about.html
如果您向页面添加 getServerSideProps
,它将变为 JavaScript,如下所示
终端
.next/server/pages/about.js
注意事项
- 如果您有一个带有
getInitialProps
的自定义App
,则将在没有静态生成的页面中关闭此优化。 - 如果您有一个带有
getInitialProps
的自定义Document
,请确保在假设页面已服务器端渲染之前检查ctx.req
是否已定义。对于预渲染的页面,ctx.req
将为undefined
。 - 在路由器的
isReady
字段为true
之前,避免在渲染树中使用next/router
上的asPath
值。静态优化的页面仅在客户端而不是服务器上了解asPath
,因此将其用作 prop 可能会导致不匹配错误。active-class-name
示例 演示了一种将asPath
用作 prop 的方法。
这有帮助吗?