next.js之getStaticProps getStaticPaths使用技巧解析

 更新时间:2023年06月19日 09:09:17   作者:嘿嘿不务正业  
这篇文章主要为大家介绍了next.js之getStaticProps getStaticPaths使用技巧解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

之前讲过 next.js 中的 getServerSideProps,今天来讲一讲另一个很类似的 APIgetStaticProps,以及和 getStaticProps 紧密相关的 getStaticPaths

getStaticProps 主要用于构建时落地一些静态数据,但不同于 getServerSidePropsgetStaticProps 默认情况下只会在构建时执行一次,之后的每次请求都会使用构建时的数据。在 ISRSSG 等场景下还有不同的表现。

而 getStaticPaths 则用于配合 getServerSideProps 实现动态路由的构建,next.js 会在构建时根据 getStaticPaths 的返回值来生成对应的静态页面。

使用

先看下 getStaticProps 如何使用,其实和 getServerSideProps 用法差不多:

export default function GetStaticProps({ content }: { content: string }) {
    return (
        <div>
            <header>getStaticProps</header>
            <main>{content}</main>
        </div>
    );
}
export const getStaticProps = async () => {
    const content = 'Hello World';
    console.log('call getStaticProps');
    return {
        props: {
            content
        }
    };
};

只需要在 page 中导出 getStaticProps 函数,然后在函数中返回 props 即可。在 page 渲染组件中就可以直接通过 props 即可获得数据。

调用时机

再来看下 getStaticProps 的调用时机,这里和 getServerSideProps 存在很大差异:

  • 当执行 next build 时
  • 当 getStaticPaths 返回 fallback 不为 false 时
  • 当使用了 revalidate 时

上面给出的例子是 getStaticProps 最简单的一个例子,只有在执行 next build 时才会调用 getStaticProps,之后的每次请求都会使用构建时的数据。

构建时 next.js 会将其构建为 html,并且还会构建一份 json 文件,存储 getStaticProps 的返回值,在访问时初次进入页面为该页面时会直接使用 html 内容,而非初次进入则会去请求该 json 文件获取数据进行渲染。

json 文件中的数据如下:

{ "pageProps": { "content": "Hello World" }, "__N_SSG": true }

可以看到和之前讲到的 getServerSideProps 的返回值是基本一致的,只是将 __N_SSP 参数变更为 __N_SSG,用以区分两个数据的类型。

开发时的 getStaticProps

需要注意的是,在开发时也就是 next dev 时,getStaticProps 会在每次页面访问时被请求,也就是和 getServerSideProps 行为基本一致,刚上手时很容易对这里感到困惑。

使用 getStaticPaths

getStaticPaths 主要用于动态路由中的静态页面构建,简单说就是将一个动态路由通过 getStaticPaths 转换为多个静态页面。

下面看下一个简单的例子:

pages/get-static-paths/[id].tsx

function GetStaticPaths({ post }: { post: string }) {
    return (
        <div>
            <h1>Post: {post}</h1>
        </div>
    );
}
export async function getStaticPaths() {
    const paths = new Array(10).fill(0).map((_, i) => ({
        params: { id: i + 1 + '' }
    }));
    console.log('paths', paths);
    return { paths, fallback: true };
}
export async function getStaticProps({ params }: { params: { id: string } }) {
    console.log('params', params);
    return { props: { post: `post ${params.id}` } };
}
export default GetStaticPaths;

此处是一个简单的动态路由,通过 getStaticPaths 我们可以定义该动态路由的匹配的路由值,通过 paths[number] 中的 params 参数和动态路由中的参数进行匹配。以下是 next.js 将其转换为静态页面的步骤中 getStaticPaths 和 getStaticProps 相关的部分。

  • 调用 next build 命令,next.js 会进行页面数据的收集,检测到动态路由时会尝试调用 getStaticPaths 并获取其返回值。
  • 将返回值中的 paths 进行遍历,依次取出和动态路由进行匹配,匹配后进行静态页面的生成步骤。
  • 将 path 中的 params 传入 getStaticProps 中,执行 getStaticProps 获取返回值。
  • 通过返回值生成相应的 html 和 json 文件

所以上述代码我们在 next build 时将会生成 10 个静态页面 [1-10].html 和 10 个 JSON 文件 [1-10].json,生成的文件可以到 .next/server/pages/ 下查看。

fallback

此外上面的 DEMO 中可以看到 fallback 参数,fallback 其实有三个可选值:truefalse 和 blocking,主要是用于控制访问动态路由时该地址未落地成静态页面时的处理。

false 时基本就只有上述行为,当访问不存在的页面时会返回 404 页面,比如上面访问到 /get-static-paths/11 时会返回 404。

而 fallback 为 true 时会有一些不同,当访问不存在的页面时不会返回 404,而是会返回动态路由页面,并且使用页面参数去请求 getStaticProps 数据,然后生成静态页面和 JSON 文件并将 JSON 文件返回动态渲染到页面中。而二次访问该页面时由于已经有了静态页面,就和其他已存在页面行为一致了。可以理解为一种 lazy build

fallback 为 blocking 时行为和 true 基本一致,但不同的是当访问不存在的页面时会等待 getStaticProps 执行完成后再返回页面,不需要进行二次数据请求。所以初次访问表现不一致,一个为异步一个为同步。

注意点

这里还有一个比较需要关注的问题是 getStaticPaths 中的 params 中的参数需要为字符串,否则将会导致无法匹配,猜测为 next.js 中进行了类型判断或 map 操作,这个在后续源码分析中细看。

此外和 getStaticProps 一样,在开发环境下 getStaticPaths 也会在每次访问时被调用。

和 getServerSideProps

需要注意 getStaticProps 和 getServerSideProps 无法混用,在 next.js 的定位中,getStaticProps 主要用于 SSG 场景,而 getServerSideProps 主要用于 SSR 场景,在同一页面中使用时将会提示:You can not use getStaticProps or getStaticPaths with getServerSideProps. To use SSG, please remove getServerSideProps

当然,个人觉得从设计上进行混用也没啥问题,getStaticProps 落地静态数据、getServerSideProps 落地动态数据,然后动态覆盖静态即可,next.js 这么设计可能是为了遵循单一职能原则。

总结

最后来聊一聊什么场景下我们应该使用 getStaticProps,其实官方使用文档里有列出推荐的使用场景,我这边说下自己的想法:如果页面中的数据是通过发布行为来进行更新的,那么就可以使用 getStaticProps。当然,要注意数据的安全性等问题。如果遇到页面中既有动态数据又有静态数据,那还是老老实实使用 getServerSideProps 吧。

当然,有同学可能发现上面只讲了两种 getStaticProps 的场景,而 revalidate 的场景没讲到,由于 revalidate 和 ISR 相关,这个后面再说(下次一定,逃~)。

以上就是next.js之getStaticProps getStaticPaths使用技巧解析的详细内容,更多关于next.js getStaticProps getStaticPaths的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript中的宏任务和微任务执行顺序

    JavaScript中的宏任务和微任务执行顺序

    在 JavaScript 中,宏任务和微任务是指在执行代码的过程中的两种不同的任务类型,这篇文章主要介绍了JavaScript中的宏任务和微任务执行顺序,需要的朋友可以参考下
    2022-12-12
  • layui 实现表格某一列显示图标

    layui 实现表格某一列显示图标

    今天小编就为大家分享一篇layui 实现表格某一列显示图标的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • javascript 拖放效果实现代码

    javascript 拖放效果实现代码

    JavaScript擅长于修改页面中的DOM元素,但是我们使用JavaScript通常只是实现一些简单功能,例如实现图片的翻转,网页中的标签页,等等。这篇文章将向你展示如何在页面中,对创建的元素实现拖放。
    2010-01-01
  • 详细讨论JavaScript中的求值策略

    详细讨论JavaScript中的求值策略

    这篇文章主要介绍了详细讨论JavaScript中的求值策略,对求值策略感兴趣的同学,可以参考下
    2021-04-04
  • 如何使用Javascript获取距今n天前的日期

    如何使用Javascript获取距今n天前的日期

    本篇文章是对使用Javascript获取距今n天前日期的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • JS+DIV实现的卷帘效果示例

    JS+DIV实现的卷帘效果示例

    这篇文章主要介绍了JS+DIV实现的卷帘效果,结合具体实例形式对比分析了javascript响应鼠标事件动态操作页面元素属性实现展开与折叠效果的相关操作技巧,需要的朋友可以参考下
    2017-03-03
  • javascript实现tabs选项卡切换效果(自写原生js)

    javascript实现tabs选项卡切换效果(自写原生js)

    常用的页面效果有弹出层效果,无缝滚动效果,选项卡切换效果,接下来与大家分享一款自己用原生javascript写的选项卡切换效果,感兴趣的朋友可以参考下哈
    2013-03-03
  • 非常不错的[JS]Cookie精通之路

    非常不错的[JS]Cookie精通之路

    Cookies,有些人喜欢它们,有些人憎恨它们。但是,很少有人真正知道如何使用它们。现在你可以成为少数人中的成员-可以自傲的 Cookie 大师。
    2008-06-06
  • js实现签到日历

    js实现签到日历

    这篇文章主要为大家详细介绍了js实现签到日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • js 创建对象的多种方式与优缺点小结

    js 创建对象的多种方式与优缺点小结

    这篇文章主要介绍了js 创建对象的多种方式与优缺点,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下
    2021-03-03

最新评论