在 Next.js 中,getStaticProps、getStaticPaths 和 getServerSideProps是用来处理页面数据获取的三个不同方法。

先来说一下概念:

方法
执行时间
适用场景
优点
缺点
Static Site Generation (SSG) 构建时(Build Time) 适合内容固定或更新不频繁的页面,如博客、产品展示页 非常快的页面加载速度,优秀的 SEO 支持 构建后无法即时更新,更新后需要重新部署
Server-Side Rendering (SSR) 每次请求时(Request Time) 需要即时数据或个性化内容的页面,如电子商务、社交媒体 每次请求都能获取最新数据,适合需要动态内容的页面 速度较慢,会导致初次页面加载较慢,对伺服器负载较高
Incremental Static Regeneration (ISR) 构建后且定时更新(Build Time + Revalidation) 静态页面但需要定期更新的应用,如新闻网站、电子商务产品页 静态页面但可以定时更新内容,具备 SSG 的速度又能保持更新 需要指定重新验证间隔,过于频繁的更新可能会增加复杂性

再来说方法,

它们分别针对不同的场景进行数据加载。让我们逐一解释它们的作用和区别:

方法
执行时间
什么时候使用?
优点
缺点
getStaticProps 构建时 当页面内容不常更新且可在构建时确定 较快的页面加载速度,适合 SEO 构建后无法立即反映数据变更
getStaticPaths 构建时 搭配动态路由的静态页面生成 静态生成动态路径页面,结合 getStaticProps 使用 需要在构建时就知道所有的动态路径
getServerSideProps 每次请求时 当需要实时数据或者页面需要个性化渲染 每次请求都能获取最新数据,适合需要动态内容的页面 较慢的页面加载速度,对服务器负担较大
  • getStaticProps (静态生成)什么时候使用?当您的页面内容在构建时可以确定,不需要每次访问时重新获取数据。适合用于静态页面,如博客文章、产品展示页面,这些页面内容不会频繁变化。特点:在构建时(build time)运行,因此页面会被静态生成。生成的静态页面在每次用户请求时直接提供,不需要额外的服务器端渲染。适合 SEO,因为页面在构建时已经完成渲染。
  • import React from \'react\';

    const Posts = ({ posts }) => (
    <div>
    <h1>Posts</h1>
    <ul>
    {posts.map(post => (
    <li key={post.id}>{post.title}</li>
    ))}
    </ul>
    </div>
    );
    export async function getStaticProps() {
    const res = await fetch(\'https://api.example.com/posts\');
    const posts = await res.json();

    return {
    props: { posts }, // 传递到页面的 props
    };
    }

  • getStaticPaths (动态路由的静态生成)什么时候使用?通常和 getStaticProps 搭配使用,当有动态路径时(如 /blog/[id])需要提前告诉 Next.js 构建哪些动态页面。适用于多个动态路由的静态页面生成,例如多篇博客文章、产品详情页面等。特点:定义应该为哪些动态路径生成静态页面。只生成特定路径的静态页面。范例:
  • import React from \'react\';

    const Post = ({ post }) => (
    <div>
    <h1>{post.title}</h1>
    <p>{post.content}</p>
    </div>
    );
    export async function getStaticPaths() {
    const res = await fetch(\'https://api.example.com/posts\');
    const posts = await res.json();

    const paths = posts.map((post) => ({
    params: { id: post.id.toString() },
    }));

    return { paths, fallback: false };
    }
    export async function getStaticProps({ params }) {
    const res = await fetch(`https://api.example.com/posts/${params.id}`);
    const post = await res.json();

    return { props: { post } };
    }

    在这里,我们为每个 post.id 生成一个对应的静态页面。

  • getServerSideProps (服务器端渲染)什么时候使用?当页面需要每次访问时都进行数据加载,因为数据可能频繁更新。适合用于需要即时数据的页面,如电子商务网站的商品库存页面、用户个人信息页面、社交媒体动态等。特点:在每次请求时运行,而不是在构建时,这意味着页面在服务器上每次请求时都会重新渲染。适合用于需要实时数据的页面,但会带来更高的服务器负担和加载时间。范例:
  • // pages/dashboard.js
    import React from \'react\';

    const Dashboard = ({ data }) => (
    <div>
    <h1>Dashboard</h1>
    <p>{data.info}</p>
    </div>
    );
    export async function getServerSideProps() {
    const res = await fetch(\'https://api.example.com/data\');
    const data = await res.json();

    return {
    props: { data }, // 传递到页面的 props
    };
    }

    概念 vs. 方法

    SSG (Static Site Generation):

    概念:在构建时生成静态页面,适合内容更新不频繁的网站。执行方法:使用 getStaticProps 和 getStaticPaths。getStaticProps 用于在构建时获取数据并生成静态页面。getStaticPaths 用于定义动态路径,以便静态生成这些路径的页面。

    SSR (Server-Side Rendering):

    概念:每次用户请求页面时,伺服器生成页面,适合需要实时数据的应用。执行方法:使用 getServerSideProps。getServerSideProps 用于在每次请求时获取数据并生成页面,确保用户获取的是最新的数据。

    ISR (Incremental Static Regeneration):

    概念:在构建时生成静态页面,并允许根据时间定期更新静态内容。执行方法:使用 getStaticProps,但加上 revalidate 属性。getStaticProps 用于初始生成静态页面,而 revalidate 参数指定了多久后页面会被重新生成,以获取最新数据。

    总结

    SSG、SSR 和 ISR 是三种不同的渲染方法,根据应用需求的不同选择使用。getStaticProps、getStaticPaths 和 getServerSideProps 是 Next.js 提供的函数,用于具体实现这些概念的渲染方法。它们决定了如何获取数据以及何时生成页面。