# NextJs 渲染方式的区别

# SSR(Server-side Rendering)

# 特点

  • 每次请求页面时候生成html;
  • export async function getServerSideProps

# 运行时机

  • 直接请求页面时候,请求的时候运行 getServerSideProps,并以其结果作为组件的props;
  • 在客户端通过 next/link 或者 next/router 跳转时,nextjs向运行 getServerSideProps 的服务器发送请求,运行getServerSideProps。

# 适用场景

每次请求页面都需要最新数据;

TIP

只有header配置cache-control才能被缓存;

res.setHeader( 'Cache-Control', 'public, s-maxage=10, stale-while-revalidate=59', );

# SSG(Static Site Generation)

# 适用于SSG的场景

  • 不需要依赖外部数据的页面;
  • 需要外部数据进行与渲染,内容依赖外部数据(getStaticProps)和路径依赖外部数据(getStaticPaths);

# 特点

  • 可以是,返回 async getStaticProps/getStaticPaths 方法,也可以是纯React组件;
  • 构建时生成静态html,调用getStaticProps/getStaticPaths,并把其结果生成JSON文件;
  • 请求该页面时,传递json数据作为 组件的props,进行与预渲染;

# 适用 getStaticProps 的场景

  • 该数据是页面渲染必须的数据,需要保证用户请求之前,构建时可用;
  • 数据来自 headless CMS ?
  • 页面必须预渲染(SEO)和快速响应,使用 getStaticProps 可在构建时生成 html和json数据,并通过cdn缓存,以提高性能;
  • 数据可以被公开缓存。可以通过中间件重写路径绕过此条件。

# getStaticProps 运行时机

  • 构建时(next build)
  • fallback:true, 运行在后台
  • fallback:blocking,初始渲染之前调用
  • 使用revalidate 时,在后台运行
  • 使用revalidate 时,在后台按需运行

TIP

当与增量静态再生(Incremental Static Regeneration)相结合时,getStaticProps将在后台运行,同时重新验证过时的页面,并将新页面提供给浏览器。

getStaticProps无法访问传入请求(如查询参数或HTTP标头),因为它生成静态HTML。如果您需要访问页面请求,请考虑除了使用getStaticProps之外还使用中间件。

# 适用 getStaticPaths 的场景

前提:如果一个页面是 动态路由 并且使用了 getStaticProps 方法,这时候需要定义个静态生成的路径列表;

  • 页面数据来自headless CMS
  • 页面数据来自数据库
  • 页面数据来自文件系统
  • 数据可以被公开缓存
  • 页面必须预渲染(SEO)和快速响应,使用 getStaticProps 可在构建时生成 html和json数据,并通过cdn缓存,以提高性能。

# getStaticPaths 运行时机

  • 构建时(next build)
  • fallback:true, 运行在后台
  • fallback:blocking,初始渲染之前调用。

# getStaticPaths 可以用在哪

  • 必须和getStaticProps一起使用
  • 不能和getServerSideProps 一起使用
  • 不能在非page文件下使用
  • 不能作为组件的属性

TIP

按需生成,过多的生成将会降低build速度

# ISR(Incremental Static Regeneration)

# 特点

  • getStaticProps 方法返回值中添加 revalidate:number,最多多少秒刷新一下page;
  • revalidate 在服务端使用response.revalidate(path) 来重新验证路由api