next.js全栈
9️⃣关键词await,async,fetch,promise
00 min
2021-7-2
2024-9-29
type
status
date
slug
summary
tags
category
icon
password
😀
在 Next.js 项目中,await 是 JavaScript 中的关键字,用于等待一个 异步操作(通常是一个 Promise)的完成,并获取其返回结果。await 只能在 async 函数内部使用,并且会暂停该函数的执行,直到 Promise 完成。

关键词await

在 Next.js 中的常见用法

  1. 数据获取:Next.js 是一个 React 框架,常用于构建服务器端渲染(SSR)或静态生成(SSG)的网站。通常你会在 Next.js 的 getServerSidePropsgetStaticProps 或 API 路由中使用 await 来获取数据。

示例 1:在 getServerSideProps 中使用 await

在这个例子中,await 等待从 API 获取数据 (fetch 返回的 Promise),一旦数据获取完成,它会返回 json 格式的数据。

示例 2:在 API 路由中使用 await

在 Next.js 的 API 路由中,await 通常用来处理异步操作,比如从数据库获取数据、调用外部 API 等。

await 的作用是什么?

  • 暂停执行,直到异步操作完成:当你在异步函数内部使用 await,它会暂停该函数的执行,直到所等待的 Promise 解决(即成功或失败)。
  • 简化异步代码:相比传统的回调函数或 then 链式调用,await 使代码更具可读性和可维护性。

为什么在 Next.js 中使用 await

  1. 异步数据获取:在 SSR、SSG 或 API 请求中,通常需要等待外部数据源(如 API、数据库)的响应,这些操作通常是异步的。
  1. 简化代码:相比回调函数、Promisethen()await 能让异步代码写得更像同步代码,逻辑更加直观。

总结

在 Next.js 项目中,await 用来等待异步操作的完成,主要用在数据获取和异步逻辑中,使得代码易于理解和维护。你会在如 getServerSidePropsgetStaticProps、API 路由等地方频繁使用 await 来处理异步任务。

关键词getServerSideProps

getServerSideProps 是 Next.js 提供的一个特殊函数,用于在 服务器端 渲染页面时 获取数据。它允许你在每次请求时,动态获取数据并将其传递给页面组件,用于 服务端渲染(SSR)

主要特点:

  1. 服务器端渲染(SSR)getServerSideProps 运行在服务器上,页面每次请求都会触发一次数据获取操作。不同于客户端渲染,它在服务器获取数据并生成 HTML,然后将渲染好的页面返回给浏览器。
  1. 每次请求执行:当用户访问页面时,服务器会执行 getServerSideProps 函数,获取最新数据并将其传递给页面组件。
  1. 返回数据作为 propsgetServerSideProps 返回的数据会被作为 props 传递给页面组件,让你可以在页面中使用获取的数据。

语法和用法

示例 1:基本使用

详细解读:

  • export async function getServerSideProps(context):
    • 这是一个 异步函数,Next.js 在每次请求时会调用它,用来获取服务器端的数据。
    • context 是传递给 getServerSideProps 的上下文对象,里面包含一些请求相关的信息(例如请求参数、headers 等)。
  • 获取数据:
    • 你可以在 getServerSideProps 中使用 fetch、数据库查询等方法来获取数据。因为它是服务器端执行的,所以你可以安全地使用 API 密钥或数据库查询。
  • 返回 props:
    • 函数返回的对象中的 props 会传递给页面组件。在上面的例子中,data 会作为 props 传递给 MyPage 组件。

示例 2:使用请求参数

  • context.query 包含请求的 URL 查询参数。在这个例子中,页面会根据 URL 中的 id 参数获取相应的数据。

getServerSideProps 的使用场景

  1. 动态数据:需要从 API、数据库等地方获取 每次请求更新 的数据。例如:新闻详情页、用户个性化内容、实时数据等。
  1. SEO 友好:因为它是在服务器上渲染的,搜索引擎可以更好地抓取页面内容,因此对 SEO 有利。
  1. 权限验证:在 getServerSideProps 中,你可以进行用户身份验证,根据用户的权限来返回不同的数据。

getServerSideProps 的注意事项

  • 只能用于页面级别getServerSideProps 只能在页面组件中使用,不能在普通的 React 组件中使用。
  • 性能影响:每次请求都会触发数据获取,因此如果数据获取过程较慢,会影响页面加载时间。需要在一些性能敏感的地方谨慎使用。
  • 无法在客户端使用getServerSideProps 只能在服务器端运行,无法在客户端(如浏览器)中调用。

总结

getServerSideProps 是 Next.js 用于 服务器端渲染 的一个工具,允许你在请求时动态获取数据并传递给页面组件。它在每个页面请求时运行,因此非常适合那些需要最新数据、动态生成内容的场景。
 

关键词getStaticProps

getStaticProps 是 Next.js 提供的一个特殊函数,用于在 构建时 (也叫做 静态生成)获取数据。与 getServerSideProps 不同,getStaticProps 只会在 构建时执行一次,生成的页面在构建后会变成静态文件,能够高效地服务于用户请求。

主要特点:

  1. 静态生成getStaticProps 在构建时运行,获取数据并生成静态页面,适用于 不需要频繁更新 的内容,比如博客文章、产品展示页面等。
  1. 提升性能:静态生成的页面在访问时不需要重新请求服务器,直接从 CDN 或服务器读取预生成的 HTML 页面,因此性能极高。
  1. 可结合 ISR(增量静态生成):通过设置 revalidate 参数,Next.js 可以在后台 定期重新生成页面,这允许你在静态生成的基础上添加一定的动态性。

语法和用法

示例 1:基本使用

详细解读:

  • export async function getStaticProps():
    • 这是一个 异步函数,Next.js 会在构建时调用它,用来获取静态生成页面所需要的数据。
    • 你可以在这个函数中调用 API、数据库或者本地文件,获取数据并将其传递给页面组件。
  • 返回 props:
    • 函数返回的对象中包含 props 字段,页面组件会使用这些 props 来渲染页面。在上面的例子中,data 会被作为 props 传递给 MyPage 组件。
  • 一次性执行:
    • 该函数仅在项目 构建时 执行一次,生成静态的 HTML 文件。用户访问这个页面时,Next.js 会直接返回静态 HTML,而不需要再重新执行数据请求。

示例 2:带有 revalidate(增量静态生成)

  • revalidaterevalidate 是用于设置页面重新生成的间隔时间(以秒为单位)。在这个例子中,页面会每隔 10 秒在后台重新生成一次,用户访问的页面将会是最新的静态生成结果。这种机制称为 增量静态生成(ISR)

getStaticProps 的使用场景

  1. 不需要频繁更新的数据:适合那些数据更新频率较低的页面,比如博客文章、文档、产品列表等。这些页面可以在构建时生成静态内容,提升性能。
  1. 提升 SEO:静态生成的页面会生成完整的 HTML,因此对搜索引擎非常友好,帮助提升页面的 SEO 排名。
  1. 高性能要求:因为页面是静态的,用户请求时不需要重新生成页面或从数据库获取数据,因此响应速度非常快,尤其是在配合 CDN 的情况下。
  1. 增量静态生成(ISR):你可以通过 revalidate 参数让页面在后台自动重新生成,达到“半动态”效果,非常适合内容定期更新但又希望保持高性能的场景。

getStaticPropsgetServerSideProps 的区别

特性
getStaticProps
getServerSideProps
执行时机
构建时执行
每次请求时执行
页面类型
静态页面
动态页面
性能
最高性能(生成静态 HTML)
性能较低(每次请求重新生成页面)
适用场景
数据更新频率低,页面可以静态化
需要实时数据或个性化内容
SEO
非常有利
也有利于 SEO,但比静态稍慢

getStaticProps 的注意事项

  • 只能在页面级别使用getStaticProps 只能在页面组件中使用,不能在普通的 React 组件中使用。
  • 适用于静态内容:它适合那些 在构建时 就能确定的数据。对于实时数据,getServerSideProps 或客户端获取数据(CSR)更适合。
  • 定期再生页面:通过设置 revalidate,你可以在后台定期重新生成静态页面,避免过时的数据。

总结

getStaticProps 是 Next.js 的一种 静态生成 数据获取方式,用于在构建时获取数据,并生成静态页面。它能大幅提升页面的性能,并且对 SEO 友好。通过结合 revalidate,可以实现 增量静态生成,让静态页面也能够动态更新。
 

关键词 promise

在 Next.js 项目中,Promise 是 JavaScript 原生的一种异步编程工具,它用于处理异步操作,例如网络请求、数据库查询或其他需要时间完成的任务。Promise 允许你在代码中处理异步任务时避免“回调地狱”(嵌套的回调函数),并提供一种更加直观的处理异步流程的方式。

基本概念

Promise 代表的是一个尚未完成的任务,将来可能会返回一个值(成功)或抛出一个错误(失败)。
Promise 有三种状态:
  1. Pending(进行中):Promise 的初始状态,任务尚未完成。
  1. Fulfilled(已成功):任务成功完成,并返回了结果。
  1. Rejected(已失败):任务失败,并返回了错误。

Promise 语法

创建一个 Promise 的基本结构如下:
  • resolve:成功时调用,用于返回成功结果。
  • reject:失败时调用,用于返回错误。

示例:在 Next.js 项目中使用 Promise

1. 基本示例:模拟异步任务

2. 使用 fetch 进行 API 调用

在 Next.js 项目中,Promise 常用于处理 fetch 请求(因为 fetch 是基于 Promise 的)。例如,你可以在 getStaticPropsgetServerSideProps 中发起网络请求获取数据:
在这里,fetch 是一个 Promise,它可以通过 await 来等待完成。当 Promise 成功时,它会返回 API 的数据;如果失败,错误将被抛出并进入 catch 块。

3. 使用 asyncawait

在现代 JavaScript 中,async/await 是一种更简单的方式来处理 Promiseasync 用于声明一个异步函数,而 await 用来等待 Promise 的结果。
例如,以上的 fetchData 函数可以改写为使用 async/await

在 Next.js 中的使用场景

  1. API 请求:获取后端数据时,通常通过 Promise 处理异步请求(如 fetchaxios)。
  1. 文件读取:当从文件系统中读取数据时(例如在 getStaticProps 中读取本地文件),也可以使用 Promise 来处理异步文件操作。
  1. 数据库查询:与数据库交互时,查询操作通常是异步的,因此也会返回 Promise

总结

  • Promise 是一种处理异步操作的机制,避免了复杂的回调嵌套。
  • 在 Next.js 中,Promise 主要用于处理诸如 API 请求、文件读取、数据库查询等异步任务。
  • 通过 async/await,你可以用更简洁的方式处理 Promise,提高代码的可读性。
Promise 是 JavaScript 异步编程的基础,特别是在像 Next.js 这样的现代框架中,它帮助管理复杂的异步逻辑。

关键词async

在 Next.js 项目中,async 是 JavaScript 用于定义 异步函数 的关键字。它允许你编写异步代码,并使代码看起来像是同步执行的。与之配合的 await 关键字,可以让你等待异步操作的完成,简化了 Promise 的使用。

async 基本概念

async 关键字用来声明一个异步函数,它会返回一个 Promise。即使函数内部看起来像是返回一个普通的值,实际上这个值会自动被包装成一个 Promise 对象。
在上面的例子中,尽管 myFunction 返回的是一个字符串 "Hello, Next.js!",但由于它是一个异步函数,所以实际上返回了一个 Promise 对象。

await 关键字

await 是专门与 async 配合使用的。它用来暂停代码的执行,直到 Promise 完成,然后返回 Promise 的结果。只有在 async 函数内部才能使用 await

asyncawait 的工作原理

  • async 函数:是一个返回 Promise 的函数。无论函数内部返回什么,最终它都会被封装在一个 Promise 中。
  • await 关键字:可以暂停函数的执行,直到 Promise 完成。它会返回 Promise 的解析结果,而不是 Promise 本身。

在 Next.js 中的使用场景

1. 数据获取(如在 getStaticPropsgetServerSideProps 中)

asyncawait 在 Next.js 中非常常见,特别是在数据获取的场景中。比如在 getStaticPropsgetServerSideProps 中,你通常需要从 API 或数据库中获取数据,这些操作是异步的,因此 async 是必须的。
在这个例子中,getStaticProps 是一个异步函数,它通过 await 等待 fetch 完成,并返回获取到的数据作为页面的 props

2. API 路由中的异步操作

在 Next.js 中,你可以通过 pages/api 目录创建 API 路由。这些路由可以处理异步任务,比如查询数据库或处理外部 API 请求,通常会用到 async

3. 异步事件处理

在组件内,也可以使用 async 函数来处理用户的交互事件。比如表单提交、按钮点击等操作可能需要发起异步请求,通常会用 async 来处理。

优点

  1. 可读性强async/await 让异步代码看起来像是同步执行的,避免了繁杂的回调嵌套。
  1. 处理错误更加简便:可以通过 try/catch 来捕获 Promise 的错误,比 Promise 链中的 .catch 更直观。

    总结

    • async:定义一个异步函数,返回一个 Promise
    • await:暂停函数执行,等待异步操作完成,返回 Promise 的解析结果。
    • 在 Next.js 中,async/await 常用于 获取数据处理 API 请求事件处理 等异步操作。
    使用 async/await,可以让你的代码更加简洁、清晰,并且处理异步操作时更加直观。
     

    关键词 fetch

    在 Next.js 项目中,fetch 是一个原生的 JavaScript 函数,用于发起 HTTP 请求,通常用于从外部 API 或服务器获取数据。fetch 是基于 Promise 的,这意味着它是异步的,可以使用 async/await 来处理异步任务。fetch 是前端和后端通用的,因为 Next.js 既支持客户端渲染,也支持服务端渲染。

    基本用法

    fetch 可以发起 GET、POST、PUT、DELETE 等 HTTP 请求,典型的用法如下:
    上面的代码发起了一个 GET 请求,成功后返回的数据被解析为 JSON,然后打印到控制台。fetch 的请求和响应都是基于 Promise 的,因此可以使用 .then().catch() 来处理结果和错误。

    使用 async/await

    为了让代码更简洁且易于阅读,async/await 常用于替代 .then() 的方式:

    在 Next.js 中的使用场景

    1. 在 getStaticProps 中使用 fetch

    fetch 在 Next.js 的 静态生成(Static Generation)中经常用于从 API 或数据库获取数据。
    getStaticProps 中,fetch 用于在构建时获取数据,返回的 props 将在页面上渲染。

    2. 在 getServerSideProps 中使用 fetch

    fetch 也可以在 服务器端渲染(Server-Side Rendering)中使用,特别是在 getServerSideProps 中。
    在这个例子中,fetch 在服务器端被调用,页面每次请求都会重新获取数据。

    3. 在客户端组件中使用 fetch

    除了在服务器端,fetch 也可以在客户端组件中使用。比如在一个按钮点击事件中触发数据请求:

    fetch 的配置选项

    fetch 允许你配置不同的请求方式、请求头、请求体等参数。常见的选项有:

    返回值解析

    fetch 的返回值是一个 Response 对象,它需要解析为可读格式,比如 JSON、文本等。
    • JSON 格式response.json() 返回一个解析后的 JSON 对象。
    • 文本格式response.text() 返回纯文本内容。
    • 其他格式:可以通过 response.blob()response.arrayBuffer() 等获取不同格式的数据。

    错误处理

    fetch 只会在网络错误或无法完成请求时触发错误,但不会自动抛出 HTTP 状态码 4xx 或 5xx 的错误。因此,你需要手动检查 response.okresponse.status

    总结

    • fetch 是用于发起 HTTP 请求的原生函数,返回的是一个 Promise
    • 在 Next.js 中,fetch 可以在客户端和服务器端使用,常用于获取外部 API 或服务器端的数据。
    • 你可以结合 async/await 来使代码更简洁,并通过不同的配置来定制请求行为。
    💡
    有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
     
    上一篇
    next.js的原生api的构建方式
    下一篇
    关于next.js路由的学习