面试题答案
一键面试动态路由与静态路由的数据预取策略差异
- 静态路由(Static Routes)
- 使用
getStaticProps
:此方法用于在构建时预取数据。对于静态路由,它会在构建过程中执行,将获取到的数据作为页面props传递。这意味着数据在构建时就确定了,适用于数据变化不频繁的场景。例如一个博客文章列表页面,文章数据更新不频繁,使用getStaticProps
可以在构建时获取文章列表数据并生成静态HTML页面。 - 数据预取时机:在构建阶段,Next.js会调用
getStaticProps
获取数据,并使用这些数据生成静态HTML文件。这些文件会被部署到服务器,每次请求该页面时直接返回静态内容,无需在请求时重新获取数据。
- 使用
- 动态路由(Dynamic Routes)
- 使用
getStaticProps
(带context
参数):当动态路由使用getStaticProps
时,context
参数可用于获取动态路由参数。例如pages/post/[id].js
,context
中会包含params
对象,其中有id
值。数据依然是在构建时获取,但每个动态路由对应的页面(如不同id
的文章页面)会在构建时生成对应的静态页面。不过,如果数据变化频繁,可能需要结合revalidate
选项来定期重新生成静态页面。 - 使用
getServerSideProps
:对于动态路由,若数据变化频繁且需要实时获取最新数据,getServerSideProps
更合适。它在每次请求页面时在服务器端执行,能获取最新数据。比如一个实时股票价格显示页面,每次请求时都需要获取最新股价,就可以使用getServerSideProps
。 - 数据预取时机:使用
getStaticProps
时,数据在构建时预取;使用getServerSideProps
时,数据在每次请求时预取。
- 使用
不同应用场景下的选择
- 数据变化不频繁的场景
- 选择静态路由和
getStaticProps
:如公司介绍页面、产品文档页面等,数据更新频率低。使用静态路由和getStaticProps
可以在构建时生成静态页面,提高性能和SEO友好度。构建时获取的数据直接嵌入HTML,浏览器加载页面速度快,搜索引擎也能更好地抓取内容。
- 选择静态路由和
- 数据变化频繁但对实时性要求不是极高的场景
- 选择动态路由结合
getStaticProps
并设置revalidate
:例如电商产品列表页面,产品信息偶尔更新。使用动态路由可适应不同产品页面需求,getStaticProps
在构建时生成页面,revalidate
设置一个合适的时间间隔(如60秒),在此时间后重新生成静态页面,以保证数据相对新。
- 选择动态路由结合
- 数据实时性要求极高的场景
- 选择动态路由和
getServerSideProps
:像实时聊天消息页面、实时监控数据页面等。动态路由适应不同会话或监控指标页面,getServerSideProps
每次请求都获取最新数据,确保用户看到的是实时信息,但这种方式由于每次请求都在服务器端处理,可能对服务器性能有一定要求。
- 选择动态路由和