GraphQL Schema Stitching:在现有 Schema 上添加更多 Schema 的方案

阅读时长 9 分钟读完

前言

在使用 GraphQL 进行前端开发时,为了快速、高效地实现业务逻辑,我们通常需要使用一些公用组件(例如权限系统、局部缓存数据等)。然而,这些公用组件往往需要单独维护自己的 schema,并且无法直接与现有 schema 整合。这样,在使用多个公用组件时,可能会出现多个 schema 间相互隔离的情况,带来不便。

为了解决这一问题,GraphQL Schema Stitching 诞生了。

本文将详细介绍 GraphQL Schema Stitching 的原理与实现,并给出一些示例代码帮助读者了解并使用本技术。

原理

GraphQL Schema Stitching 的基本思路是将不同的 schema 整合成一个可用于查询和变更的 schema。其原理是通过将不同 schema 中相同名称的类型合并成一个,而不同的部分保持各自独立。同时,针对相同的字段名称,给出一些指导性规则来进行合并。

实现

在实现上,GraphQL Schema Stitching 包含两个主要部分:schema 的合并和 resolver 的合并。

schema 合并

在 schema 的合并中,需要考虑以下几个方面:

  1. 将相同名称的类型合并成一个。

  2. 针对相同的字段名称,确定各自的祖先类型,并给予不同的别名。

  3. 合并后的 schema 应当满足原 schema 的要求。

示例如下:

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

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

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

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

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

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

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

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

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

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

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

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

在上述示例中,原有的 Author 类型被合并成了一个。对于 Book 类型中的 author 字段名称,我们使用了指定的别名 newAuthor。同时,为了针对 Book.author 做出修改,我们使用了指定的的 resolver 对其进行了修改。

resolver 合并

在 resolver 的合并中,需要考虑以下几个方面:

  1. 在原有的 resolver 基础上新增、修改、合并。

示例如下:

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

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

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

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

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

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

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

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

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

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

在上述示例中,我们将两个 schema 的 resolvers 合并到了一起。这里的合并方式为简单的数组合并。两个 schema 只要出现了相同的 resolver,就会进行覆盖。

示例

以下示例展示了如何使用 GraphQL Schema Stitching 组合两个 schema,从而得到一个更为强大的 schema。

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

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

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

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

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

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

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

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

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

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

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

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

在上述示例中,我们通过使用 GraphQL Schema Stitching,成功将两个原本独立的 schema(schemaAschemaB)合并为一个更为强大的 schema。同时,我们还给出了相应的 resolver,以便对合并后的 schema 进行查询和变更。

总结

GraphQL Schema Stitching 是一种非常实用、高效的技术。它通过将不同 schema 中相同名称的类型和针对相同字段名称的祖先类型进行合并,使得多个 schema 可以方便且高效地进行整合。同时,在 resolver 的合并中,也存在相应的处理方案。

本文中,我们详细介绍了 GraphQL Schema Stitching 的原理和实现,并给出了具体的示例代码,相信读者们已经有了一定的了解并掌握了相关技能。我们希望,这种技术能够在读者的日常工作中发挥出应有的作用,并为他们的工作带来更多的便利。

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

纠错
反馈