探索在 Next.js 中使用 GraphQL 进行数据查询的最佳实践

随着前端技术的不断发展,前端人员对于数据获取的渴求也越来越强烈。GraphQL 已然成为了现在最流行、最强大的查询语言之一,它通过一种简单优雅的方式来描述数据,可以帮助前端工程师更好地组织和查询数据。而 Next.js 是一个流行的 React 框架,提供了服务器渲染、静态生成和动态渲染等多种方式来生成页面,支持客户端和服务端使用 GraphQL 进行数据的查询。在这篇文章中,我们将详细探讨在 Next.js 中使用 GraphQL 进行数据查询的最佳实践,并提供相应的示例代码。

GraphQL 的基本知识

在使用 GraphQL 进行数据查询之前,我们需要了解一些 GraphQL 的基本知识。

GraphQL 是一种查询语言,它定义了一套描述数据的方式,并提供了一种接口能够更加有效地获取数据。与 REST API 相比,GraphQL 更加灵活、可扩展性更好。GraphQL 查询语言包含三个部分:

  1. 查询(Query):查询是进行数据获取的方式,你可以调用多个查询来获取多个数据集。
  2. 变更(Mutation):变更是修改数据的方式,它类似于传统 REST API 中的 POST、DELETE、PUT 等请求,是用来向服务器提交修改操作的。
  3. 订阅(Subscription):订阅是一种实时通知方式,它允许应用程序订阅某个事件,并在发生事件时接收通知。

GraphQL API 允许开发者定义他们的数据模型,用来描述可获取的数据类型以及那些数据类型的数据,GraphQL 的查询可以对数据执行控制流操作。这也就是说,如果程序需要获取客户端信息,可以查询一个顾客并展现其个人信息;接下来,就可以将这个顾客连接到其订单,然后就可以展示这个顾客的订单历史记录。

GraphQL 的特色包括:

  • 强引用类型
  • 丰富的内省系统(introspection system)
  • 多变,操作入口可依据需求任意定义
  • 按需数据获取,减少数据冗余
  • 规范化查询语法,客户端难以忘记薛晓玲字段或变量类型
  • 支持实时数据获取

Next.js 中使用 GraphQL 的最佳实践

在 Next.js 中使用 GraphQL,我们需要考虑如何在客户端和服务端使用 GraphQL 这两种环境。一般来说,服务端使用 GraphQL 主要可以为 SEO 提供优秀的支持,增强页面响应速度与渲染性能,同时还有利于维护 GraphQL 服务器的后端数据逻辑;而在客户端中,使用 GraphQL 可以为我们提供更好的页面渲染、优秀的响应速度以及数据加载的效率。

第一步:集成客户端 GraphQL

为了使用 GraphQL,我们首先需要安装所需的依赖包:

--- - ------------ -------

安装完成后,我们需要配置 ApolloClient。我们需要指定 GraphQL 服务器的链接和 endpoints,并指明各种默认选项,如缓存策略和 HTTP headers。在 Next.js 项目中,使用 getInitialProps 函数来获得服务器端数据的方式非常适合使用 ApolloClient,因为客户端渲染的时候 getInitialProps 这个钩子函数允许我们在加载组件的时候请求处理数据。

这里我们构造一个可重用的 getConfig 函数来创建 ApolloClient 的默认配置项。

------ - ------------- --------- ------------- - ---- ----------------

----- ------ - --- --------------
  -------- ------ ------ --- ------------
  ----- --- ----------
    ---- ------------------------
    -------- -
      -- -- ---- -------
      -------------- ------- -----------
    --
  ---
  ------ --- ----------------
--

为了防止数据在客户端和服务器之间切换时重新获取,我们需要使用一个公共的客户端实例,以确保应用程序只存在一个 ApolloClient 实例。在 Next.js 中,我们会使用 withApollo 这个高阶函数将 ApolloClient 传递给组件,这样我们的每一个组件都可以使用这个公共的客户端实例。

------ - ---------- - ---- -------------
------ - -------------- - ---- ----------------
------ - ------ - ---- ----------

-------- ------- ---------- --------- -- -
  ------ -
    --------------- ----------------
      ---------- -------------- --
    -----------------
  -
-

------ ------- -----------------

第二步:服务端集成 GraphQL

Next.js 提供了简单的方式将 GraphQL 服务器与应用程序集成。服务端渲染的 Next.js 应用程序可以在页面上提供初始加载的 HTML,这样有助于搜索引擎最优化(SEO)。

在服务端启用 Apollo Server 非常简单。您可以使用相同的 Apollo Server 实例,指定相同的 GraphQL schema,并调用 graphQLServer() 方法来启用 GraphQL API。该服务程序将作为中间件注入到 Next.js 应用程序根目录中的任何路由处理程序中。

------ - ------------ - ---- ---------------------
------ - ------ - ---- ----------

----- ------------ - --- -------------- ------ --
----- ----------- - --------------------

------ ------- ----- -------- ------------ ---- -
  ----- -----------
  ------ ----------------------------
    ----- ---------------
  ------- ----
-

第三步:GraphQL 的 Query 和 Mutation

有两种方式可以通过 GraphQL 进行查询和变更:通过静态暴露和通过动态暴露。每种方式都具有不同的优点和缺点。

静态暴露使用 getStaticPropsgetServerSideProps 函数进行数据预取。这允许您在构建时或每次规划时从服务器预取数据进行自动生成的静态页面。

动态暴露使用客户端请求从 GraphQL 服务器中获取数据。这允许您延迟数据预取,并允许更大的控制。

静态暴露

在 Next.js 中,通过使用 getStaticProps 函数获取静态数据。getStaticProps 函数返回的值将作为其参数 props 传递到页面组件中(若拥有,则 getStaticPaths 函数返回的值将作为参数传递到路径 params 中)。以下是一个简单的示例,每次构建时 getStaticProps 函数会预取 new 字段值为 true 的前 5 篇文章。

------ - --- - ---- ----------------
------ ------ ---- ----------------------

------ ----- -------- ---------------- -
  ----- - ---- - - ----- --------------
    ------ ----
      ----- -------------- --------- -
        ------------- ----- -
          --
          -----
          -------
        -
      -
    --
    ---------- -
      ---- -----
    --
  --

  ------ -
    ------ -
      --------- --------------
    --
    ----------- --
  -
-

------ ------- -------- ------ -------- -- -
  ------ -
    -----
      ----------------------- -- -
        ------------------------
      ---
    ------
  -
-

动态暴露

在 Next.js 中,可以使用参数中的 query 属性来创建与 GraphQL 服务器的连接。在这种情况下,不应使用 getStaticProps 函数(它将在构建时调用)。例如:

------ - --- - ---- ----------------
------ ------ ---- ----------------------

------ ----- -------- --------------------------- -
  ----- - ---- - - ----- --------------
    ------ ----
      ----- -------------- --------- -
        ------------- ----- -
          --
          -----
          -------
        -
      -
    --
    ---------- -
      ---- -----
    --
    -------- -
      -------- -
        ------- ----------------------------
      --
    --
  --

  ------ -
    ------ -
      --------- --------------
    --
  -
-

------ ------- -------- ------ -------- -- -
  ------ -
    -----
      ----------------------- -- -
        ------------------------
      ---
    ------
  -
-

Mutation

在 Next.js 中使用 Mutation,我们可以使用useMutation hook。这个函数使用操作(即在 mutation 中定义的函数)并返回两个元素的数组:

  1. 第一个元素是执行操作的函数。
  2. 第二个元素是包含有关包含数据的操作结果的信息的对象。
------ - ---- ----------- - ---- -----------------

----- ----------- - ----
  -------- ------------------ -------- -
    ----------------- ------- -
      --
      -----
    -
  -
--

------ -------- ------------ -
  ----- ------------ - ---- -- - -------------------------

  ----- ------------ - --- -- -
    -------------------

    ------------
      ---------- -
        ------ ------------------------------
      --
    ---
  -

  ------ -
    -----
      ----- ------------------------
        ------ ----------- ------------ -------- --
        ------- ----------------- -------------
      -------
      ----- -- -
        ---
          ----- ----- -----------------------
        ----
      --
    ------
  -
-

结论

在 Next.js 中使用 GraphQL 进行数据查询可为我们提供很多优势,特别是在处理大型数据集和复杂数据时,其能力表现的更加优异。希望这篇文章对不熟悉 Next.js 或 GraphQL 的前端工程师有所帮助。在使用 GraphQL 过程中,我们需要持续了解 GraphQL 更新频率,并及时更新我们的应用程序代码。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672d9391eedcc8a97c855a7a