npm 包 graphql-yoga 使用教程

阅读时长 8 分钟读完

简介

GraphQL 是一种用于 API 构建的查询语言,它使得客户端可以精确地获取自己所需的数据。与 RESTful API 不同的是,GraphQL 中的数据查询是通过一个单一的入口点进行的,这样客户端可以避免请求多个端点以获取所有需要的数据。GraphQL 还提供了强大的类型系统,让开发者可以更加安全地进行数据查询。

graphql-yoga 是一个基于 Express 和 Apollo Server 的 GraphQL 服务器工具包,它简化了 GraphQL 的配置和启动流程,并提供了额外的功能,例如支持 GraphQL Playground、实时数据更新等。如果你想在自己的项目中使用 GraphQL,graphql-yoga 是一个不错的选择。

本文将介绍如何使用 npm 包 graphql-yoga 进行 GraphQL 服务器开发。

安装

安装 graphql-yoga 可以使用 npm:

使用

graphql-yoga 提供简单的 API,可以很方便地启动你的 GraphQL 服务器。

首先,我们需要创建一个 schemaschema 定义了你的 GraphQL 服务器所支持的查询和数据类型。你可以使用 GraphQL Schema Language 来定义你的 schema。例如,以下是一个简单的 schema

schema 定义了一个查询 hello,它返回一个字符串类型的数据。

接下来,我们可以使用 graphql-yoga 创建一个服务器并指定 schema

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

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

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

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

这个例子中,我们定义了 typeDefsresolvers,并将它们传递给 GraphQLServertypeDefs 定义了我们的 schema,而 resolvers 定义了如何获取数据。在 resolvers 中,我们定义了一个 Query 类型,并在其中定义了 hello 字段。

最后,我们使用 server.start() 开始运行服务器。

现在,我们启动我们的服务器,然后在浏览器中打开 http://localhost:4000,我们应该能够在 GraphQL Playground 中看到我们的 hello 查询:

这将返回:

其他配置

热重载

如果你在开发过程中需要修改代码并快速查看更改的效果,你可以使用 nodemongraphiql 包来实现热重载。nodemon 会监视你的代码更改并重启服务器,而 graphiql 则提供了一个 Web 用于在浏览器中进行 GraphQL 查询的接口。

首先,我们创建一个 nodemon.json 文件来配置 nodemon

然后,我们安装 nodemongraphiql

接下来,我们将 start 命令改成:

然后,在我们的 index.js 文件中添加以下代码:

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

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

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

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

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

这将启用 graphiql,并在 http://localhost:4000/graphiql 上提供一个 Web 接口。

使用 DataLoader

DataLoader 是一种优化 GraphQL 数据访问的工具,它可以自动批量加载数据并减少重复加载。如果你的服务需要处理大量数据,DataLoader 可以帮助你优化性能。

以下是一个使用 DataLoader 的例子:

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

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

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

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

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

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

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

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

在这个例子中,我们定义了一个 user 查询和一个 User 类型,并在 User 类型中定义了 country 字段。loaders 对象包含了 userLoadercountryLoader,它们分别用于批量加载用户和国家数据。batchUsersbatchCountries 方法实现了批量加载数据的逻辑。

使用 DataLoader 可以帮助我们优化数据加载性能。

结语

在本文中,我们介绍了使用 npm 包 graphql-yoga 进行 GraphQL 服务器开发的基本方法。如果你想进一步学习 GraphQL 的使用,可以参考 GraphQL 官方文档

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/195724