前言
在使用 GraphQL 进行前端开发时,为了快速、高效地实现业务逻辑,我们通常需要使用一些公用组件(例如权限系统、局部缓存数据等)。然而,这些公用组件往往需要单独维护自己的 schema,并且无法直接与现有 schema 整合。这样,在使用多个公用组件时,可能会出现多个 schema 间相互隔离的情况,带来不便。
为了解决这一问题,GraphQL Schema Stitching 诞生了。
本文将详细介绍 GraphQL Schema Stitching 的原理与实现,并给出一些示例代码帮助读者了解并使用本技术。
原理
GraphQL Schema Stitching 的基本思路是将不同的 schema 整合成一个可用于查询和变更的 schema。其原理是通过将不同 schema 中相同名称的类型合并成一个,而不同的部分保持各自独立。同时,针对相同的字段名称,给出一些指导性规则来进行合并。
实现
在实现上,GraphQL Schema Stitching 包含两个主要部分:schema 的合并和 resolver 的合并。
schema 合并
在 schema 的合并中,需要考虑以下几个方面:
将相同名称的类型合并成一个。
针对相同的字段名称,确定各自的祖先类型,并给予不同的别名。
合并后的 schema 应当满足原 schema 的要求。
示例如下:
-- -------------------- ---- ------- -- ----- -------------- - ------- ----- - ----------- - - ------------------- ----- ------------ - ------------------------- ----- -------- - - ---- ----- - -------- ----- ---- - ---- ---- - ------ ------- ------- ------- - ---- ------ - ----- ------- - -- ----- ------- - ---------------------- ----- -------- - - ---- ----- - -------- ----- ---- - ---- ---- - ------- ------- - ---- ------ - ---- ---- - -- ----- ------- - ---------------------- ----- ------ - --------------------------- -------- --------- --------- ---------- - ----- - ------- - --------- ---- -- ---- ------ -------- -------- ----- -------- ----- -- - -- - ------- --- -------- ---- -- -- -- -- --- -- ------ --------
在上述示例中,原有的 Author
类型被合并成了一个。对于 Book
类型中的 author
字段名称,我们使用了指定的别名 newAuthor
。同时,为了针对 Book.author
做出修改,我们使用了指定的的 resolver 对其进行了修改。
resolver 合并
在 resolver 的合并中,需要考虑以下几个方面:
- 在原有的 resolver 基础上新增、修改、合并。
示例如下:
-- -------------------- ---- ------- ----- - ------------ ------- - - ------------------- ----- ------------ - ------------------------- ----- -------- - - ---- ----- - -------- ----- ---- - ---- ---- - ------ ------- ------- ------- - ---- ------ - ----- ------- - -- ----- ------ - ---------------------- ----- ---------- - - ------ - ----- -- -- - -- ------- - ---- -------- -- -- ----- - ------ -- -- - -- ------- - ----- -------- -- ------- -- -- - -- ------- - ------ -------- -- -- ------- - ----- -- -- - -- ------- - ---- -------- -- -- -- ----- ---------- - - ------ - ----- -- -- - -- ------- - ---- -------- -- -- ----- - ------ -- -- - -- ------- - ----- -------- -- ------- -- -- - -- ------- - ------ -------- -- -- ------- - ----- -- -- - -- ------- - ---- -------- -- -- -- ----- --------- - ------------ ------------ ----- ------------------- - ----------------------------------- ------- ---------- --- -- ------------------- --------
在上述示例中,我们将两个 schema 的 resolvers 合并到了一起。这里的合并方式为简单的数组合并。两个 schema 只要出现了相同的 resolver,就会进行覆盖。
示例
以下示例展示了如何使用 GraphQL Schema Stitching 组合两个 schema,从而得到一个更为强大的 schema。
-- -------------------- ---- ------- ----- - ------------ ------- - - ------------------- ----- ------------ - ------------------------- ----- ------- - ------------- ---- ---- - --- --- ----- ------- ------ ------ - ---- ----- - ----------- ----- ---- --------- ------ - --- ----- ------- - ------------- ---- ---- - --- --- ------ ------- -------- ------- - ---- ----- - ----------- ----- ---- --------- ------ - --- ----- ------ - --------------------------- -------- --------- --------- --- ----- --------- - - ------ - --- - ---- -- ----- - ------ --- ------ - ------ --- ---- - ------ --- ------- - ------ --- ---- -- -------- -------- ----- -------- ----- -- - -- ------ -- --- - -------- - ------ --- ------ - ------ --- ---- - ------ --- ------- - ------ --- ---- -- --------- -------- ----- -------- ----- -- - -- -------- -- --- - ---- -- ----- - ------ --- ------ - ------ --- ---- - ------ --- ------- - ------ --- ---- -- -------- -------- ----- -------- ----- -- - -- ------ -- --- - -------- - ------ --- ------ - ------ --- ---- - ------ --- ------- - ------ --- ---- -- --------- -------- ----- -------- ----- -- - -- -------- -- -- -- ----- ------------------- - ----------------------------------- ------- ---------- --- -- -- ------------------- -------
在上述示例中,我们通过使用 GraphQL Schema Stitching,成功将两个原本独立的 schema(schemaA
和 schemaB
)合并为一个更为强大的 schema。同时,我们还给出了相应的 resolver,以便对合并后的 schema 进行查询和变更。
总结
GraphQL Schema Stitching 是一种非常实用、高效的技术。它通过将不同 schema 中相同名称的类型和针对相同字段名称的祖先类型进行合并,使得多个 schema 可以方便且高效地进行整合。同时,在 resolver 的合并中,也存在相应的处理方案。
本文中,我们详细介绍了 GraphQL Schema Stitching 的原理和实现,并给出了具体的示例代码,相信读者们已经有了一定的了解并掌握了相关技能。我们希望,这种技术能够在读者的日常工作中发挥出应有的作用,并为他们的工作带来更多的便利。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f6b8f0f6b2d6eab3f46117