Next.js 中 getInitialProps 和 getStaticProps 的作用是什么?
解析 Next.js 中的 getStaticProps 用于生成静态页面以提升 SEO 和加载速度,而 getInitialProps 在页面加载时获取数据,但已被逐步弃用。
- getStaticProps(构建时数据获取):
getStaticProps
在 Next.js 构建时运行一次,用于生成静态 HTML 页面(SSG)。适用于数据基本不变的应用。- 特点:提升首次加载速度和 SEO(因为页面被缓存),不支持服务器运行时访问 HTTP 上下文。返回数据作为 props 注入页面组件。
- 典型使用:获取产品列表或博客内容,如下所示:
export async function getStaticProps() { const res = await fetch('https://api.example.com/data'); const data = await res.json(); return { props: { data } }; }
- getInitialProps(运行时数据获取,已逐渐弃用):
getInitialProps
在页面首次加载时可能运行于服务器(SSR)或客户端导航。常用于早期 Next.js 版本处理动态数据,如身份验证相关。- 特点:每次请求时重新运行,可访问路由信息和 HTTP 请求上下文,但会禁用自动静态优化影响性能。代码通常置于页面顶部定义函数或使用页面组件附加方法。如:
Page.getInitialProps = async ({ req }) => { // req存在为服务端 const userAgent = req ? req.headers['user-agent'] : navigator.userAgent; return { userAgent }; }
- 关键差异总结:
- 作用时机:
getStaticProps
:构建时运行,适合静态网站生成。getInitialProps
:页面加载时运行(可能服务端或客户端),适合需要动态内容的环境。
- 性能和 SEO:
getStaticProps
更利于优化缓存和加载速度,getInitialProps
易导致页面延迟(每个请求计算资源)。
- 作用时机:
- 当前最佳实践推荐:
Next.js鼓励使用较新的APIgetStaticProps
(用于SSG)、getServerSideProps
(用于SSR)而非易产生性能瓶颈的getInitialProps
,后已在后续发行版被逐步替代。