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