自动静态优化
Next.js 会自动判断页面是否是静态的(是否可以预渲染),如果页面没有阻塞数据获取的要求。此判断依据是页面中是否缺少 getServerSideProps
和 getInitialProps
。
此功能允许 Next.js 生成包含服务器渲染页面和静态生成页面的混合应用程序。
须知:静态生成的页面仍然是响应式的。Next.js 将在客户端 hydration 你的应用程序,使其具有完整的交互性。
此功能的主要优点之一是,优化的页面不需要服务器端计算,并且可以从多个 CDN 位置即时流式传输给最终用户。结果是为你的用户带来超快的加载体验。
工作原理
如果页面中存在 getServerSideProps
或 getInitialProps
,Next.js 将切换为按需渲染页面,每次请求都会渲染(意味着 服务器端渲染)。
如果以上情况不是这样,Next.js 将通过将页面预渲染为静态 HTML 来静态优化你的页面。
在预渲染期间,路由器的 query
对象将为空,因为在此阶段我们没有 query
信息可提供。hydration 后,Next.js 将触发应用程序更新,以在 query
对象中提供路由参数。
在以下情况下,query 将在 hydration 后更新,从而触发另一次渲染:
- 该页面是动态路由。
- 页面 URL 中包含 query 值。
- Rewrites 在你的
next.config.js
中配置,因为这些 rewrite 可能包含参数,这些参数可能需要解析并在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 的方法。
这是否有帮助?