一起来学 next.js - getStaticProps、getStaticPaths 篇

news2024/11/16 21:56:19

之前讲过 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 将其转换为静态页面的步骤中 getStaticPathsgetStaticProps 相关的部分。

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

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

fallback

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

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

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

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

注意点

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

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

和 getServerSideProps

需要注意 getStaticPropsgetServerSideProps 无法混用,在 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 的场景没讲到,由于 revalidateISR 相关,这个后面再说(下次一定,逃~)。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划背包问题

背包问题的分类 拿到背包问题,最重要的是会归类到哪一种背包问题中,常见的考题里主要是01背包和完全背包,leetcode上连多重背包的题目都没有。实际完全背包问题就是01背包的一种。 对一和零这道题,很多人容易把m看成一个背包,n看成另一个背包,从而当做多重背包。然而这…

ChatGPT创业潮来了,我既兴奋又焦虑

最近一段时间&#xff0c;ChatGPT从AI领域破圈&#xff0c;成了互联网领域的新风口。创业者和投资人也兴奋起来了。 创业的方向已经很明了。做中国版对标ChatGPT的大模型&#xff0c;是显而易见的一条路。目前百度的“文心一言”已经呼之欲出&#xff0c;原美团联合创始人王慧…

超店有数分享:2023还有哪些tiktok数据值得关注?

目前&#xff0c;tiktok是全球增长最迅猛的社交媒体软件之一。很多商家瞄准了tiktok的变现转化潜力&#xff0c;纷纷入局tiktok电商赛道。在入局这个赛道之前&#xff0c;我们需要了解一些tiktok的相关数据&#xff0c;这样才能更好的了解大局&#xff0c;及时调整自己的业务情…

Swagger2基本使用

这里写目录标题废话篇前言什么是openAPISwagger简介Springfox使用篇swagger的基本使用废话篇 前言 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变成重中之重。接口文档固然重要&#xff0c;但是由于项目周期等原因后端人员经常出现无法及时…

P21.为什么需要父子shell

脚本的不同执行方式是否会开启子shell 父Shell概念 &#xff08;1&#xff09;pstree查看父进程 如下命令安装pstree yum install -y psmiscsshd--sshd--bash--pstree 第一个sshd为操作系统自己启动的监听sshd服务的程序第二个sshd是shell连接过来启动的shell每次调用bash…

echarts scatter地图上渲染圆点

目录 实现效果实现步骤相关文件实现效果 如上图所示,我们经常遇到一些需求,在地图上根据数据的大小,再画一些直径不一的实心圆。 首先,我们得先把地图画好,再来画这些跟数据有关联的圆形。 为了方便scatter建立坐标系,我们采用geo来自定义绘制地图,而不是使用百度地图或…

前端面试题 —— 计算机网络(二)

目录 一、POST和PUT请求的区别 二、GET方法URL长度限制的原因 三、页面有多张图片&#xff0c;HTTP是怎样的加载表现&#xff1f; 四、HTTP2的头部压缩算法是怎样的&#xff1f; 五、说一下HTTP 3.0 六、HTTP协议的性能怎么样&#xff1f; 七、数字证书是什么&#xff1f…

DC-3 靶场学习

文章目录环境配置&#xff1a;信息搜集&#xff1a;漏洞利用&#xff1a;获取FLAG&#xff1a;环境配置&#xff1a; 还是让DC-3的靶场和kali处于同于网段即可。 DC-3靶场还需要修改一下CD/DVD设置&#xff08;如下&#xff09;。 信息搜集&#xff1a; 首先还是要获取靶机的…

市场上有很多低代码开发平台,不懂编程的人可以用哪些?

市场上有很多低代码开发平台&#xff0c;不懂编程的人可以用哪些&#xff1f;这个问题一看就是外行问的啦&#xff0c;低代码平台主打的就是一个“全民开发”&#xff0c;而且现在很多低代码平台都发展为零代码了&#xff0c;不懂编程也完全可以使用&#xff01; 所谓低代码开…

一三九、vim使用介绍

键盘图 模式切换 移动光标 命令说明shift 6()至本行第一个非空字符shift 4($)至本行末尾w至下一个单词、标点开头W至下一个单词开头b至上一个单词、标点开头B至上一个单词开头ctrl b上翻一页ctrl f下翻一页ctrl d向下翻半页 此比较有用ctrl u向上翻半页 此比较有用gg文件开…

优思学院|DMAIC从入门到精通,轻松学会六西格玛的基本原理!

如果要用一个词汇总结六西格玛品质改进方法&#xff0c;那一定是DMAIC。这个简称列出了六西格玛过程改进中的步骤&#xff0c;提供了完成六西格玛项目的方法概述&#xff0c;就是&#xff1a;定义&#xff08;Define&#xff09;、测量&#xff08;Measure&#xff09;、分析&a…

Rust语言的基本介绍

rust缘起和目标 rust的英文是锈菌&#xff0c;是一种真菌&#xff0c;这种真菌的生命力非常顽强&#xff0c;其 在生命周期内可以产生多达5种孢子类型&#xff0c;这5种生命形态还可以相互转 化。“Rust”也有“铁锈”的意思&#xff0c;暗合“裸金属”之意&#xff0c;代表了R…

网络安全入门(黑客)学习路线-2023最新版

如何成为一名黑客&#xff0c;很多朋友在学习安全方面都会半路转行&#xff0c;作者菌就自个整理了一下知识内容和体系&#xff0c;肝了一个月后&#xff0c;整理出来最适合零基础学习的网络安全学习路线&#xff0c;果断收藏学习下路线。此篇博客讲的非常细&#xff0c;有兴趣…

Python中sys.argv[ ]与Cpp中int main(int argc char *argv[ ])的用法

Python中sys.argv[ ]与Cpp中int main(int argc char *argv[ ])的用法 文章目录Python中sys.argv[ ]与Cpp中int main(int argc char *argv[ ])的用法前言一、Python中sys.argv[]的用法二、Cpp中int main(int argc char *argv[])的用法Reference前言 最近在学习ROS&#xff0c;在…

前端纯函数和副作用概念,且在react上的体现详解

什么是纯函数 纯函数是这样一种函数&#xff0c;即相同的输入&#xff0c;永远会得到相同的输出的函数&#xff0c;而且没有任何可观察的副作用。 什么是副作用 副作用是在计算结果的过程中&#xff0c;系统状态的一种变化&#xff0c;或者与外部世界进行的可观察的交互。 个…

CAN工具 - ValueCAN - 基础介绍(续)

VSpy3&#xff08;Vehicle Spy 3的简写&#xff09;&#xff0c;作为一个常用的车载总线仿真工具&#xff0c;在车载网络领域也是有非常大的市场&#xff0c;前面也简单介绍过一些简单的功能&#xff0c;今天就再次介绍一些。什么是VSpy3&#xff1f;VSpy3是美国英特佩斯公司下…

测试用例设计经典面试题——电梯,杯子,笔,桌子,洗衣机

首先说明的是&#xff0c;遇到这样的测试题目&#xff0c;首先应该反问面试官&#xff0c;需求是什么样的&#xff0c;比如是测什么样的杯子。 因为设计测试用例的规则应该是根据需求分析文档设计用例&#xff0c;客户需求什么&#xff0c;就测试什么。但是在没有需求分析文档…

如何准备pmp考试?(含备考资料)

一、复习计划的制定根据之前在培训班共同奋斗的小伙伴学习时间统计&#xff0c;平均每天的学习时间是在 3-4 小时左右&#xff0c;基本上是白天 1 小时晚上 3 小时左右&#xff0c;通过率基本都在 80% 左右&#xff0c;最好的时候能达到 90%&#xff0c;大概的学习安排如下&…

【科研】【ReID】科研论文怎么写?八股文写作思路

拿 Densely Semantically Aligned Person Re-Identification 这篇文章举例。 本文写作非常好&#xff0c;写的很有逻辑&#xff0c;很标准。科研论文虽然是八股文&#xff0c;但是能经历了百年的发展而来&#xff0c;有它的合理性。我把它Introduction的写作思路跟一下&#x…

buuctf13(perl脚本GET open命令漏洞redis主从复制xssssti关键字过滤绕过csrf)

目录 <1> [HITCON 2017]SSRFme(perl脚本GET open命令漏洞) <2> [网鼎杯 2020 玄武组]SSRFMe(SSRF结合redis主从复制RCE) <3> [GWCTF 2019]mypassword(xss获取保存的cookie内容) <4> [GWCTF 2019]你的名字(ssti {{和关键字绕过) (1) {{ 和 }} 过滤绕…