使用graphql-tools和GitHub将GraphQL服务器和模式定义分离
目录
-
- 目录
-
- 前言
正文
将GraphQL服务器和模式定义分离
创建用于模式定义的GitHub仓库
从GitHub中读取模式定义以供GraphQL服务器使用
总结
序言
经纬
在尝试使用GraphQL进行应用程序开发时,我发现GraphQL服务器和架构定义融为一体,使开发变得困难,因此我进行了分离方法的研究和尝试。
目标读者
-
- GraphQLサーバとスキーマ定義を分離したい人
-
- Node.jsを使用してGraphQLサーバを構築したい人
graphql-toolsを使用している/使用を検討している人
GitHubを使用してリポジトリを管理している人
这次要使用的东西的说明
以下是关于本次使用的技术要素的简要说明。
GraphQL 是什么?
GraphQL是一种用于与数据源进行通信的查询语言,可以以以下形式进行描述:
# 型定義
type Exmaple {
id: ID!
requiredString: String!
string: String
}
# 参照
type Query {
read(id: ID!, string: String): Exmaple
}
# 作成/更新/削除
type Mutation {
create(id: ID!, string: String): Exmaple
update(id: ID!, string: String): Exmaple
delete(id: ID!): Exmaple
}
您可以通过组合标量类型来创建自定义类型,
您还可以为查询定义数据引用功能的接口定义,
以及为编辑数据功能的接口定义来创建变化。
由于GraphQL的模式定义本身就是接口定义文档,因此可以节省文档编写的时间。
GraphQL服务器指的是可以使用GraphQL进行通信的服务器应用程序。
graphql-tools是什么?
graphql-tools是一个作为Node.js的包而创建的GraphQL实用工具集合。
這次使用它來讀取已分離的架構定義。
This question.
将GraphQL服务器和模式定义分离
创建一个用于定义架构的GitHub存储库。
首先,在GitHub上创建一个存储库来管理已分离的模式定义。
创建存储库时,将模式定义本身与功能单位分离,并在不同的存储库中进行管理。
GraphQL的模式定义必须将引用功能定义为查询类型,将编辑功能定义为变异类型,因此通常需要将其汇总在一个文件中进行定义。
然而,使用graphql-tools工具,可以合并并使用不同的模式定义。
这样做有以下好处
-
- スキーマ定義が機能単位で分割されるため拡張/修正しやすくなる
新規追加時/修正時に他の定義への影響をなくすことができる
スキーマ定義を利用する側のアプリケーションが使用する定義を選択できる
マイクロサービスアーキテクチャでアプリケーションを構築することも可能になる
在GraphQL服务器中从GitHub读取模式定义。
如果能够创建管理模式定义的存储库,我们将在GraphQL服务器端添加用于获取模式定义的处理程序。
因为希望使用graphql-tools,所以将在Node.js上创建GraphQL服务器。
本文创建时使用的Node.js版本如下。
node -v
v16.17.1
npm -v
8.15.0
首先我们需要安装所需的库。因为我们想要从GitHub获取模式定义,所以我们将使用github-loader和load库。
npm i @graphql-tools/github-loader @graphql-tools/load
使用已安装的github-loader和load库来获取和读取模式定义文件。
请注意,包含安全信息的部分已记录在环境变量中获取的方式。
import { GithubLoader } from '@graphql-tools/github-loader';
import { loadSchema } from '@graphql-tools/load';
const GIT_TOKEN = process.env.GIT_TOKEN;
const USER_NAME = process.env.USER_NAME;
const typeDefs = await loadSchema(
[
`github:${USER_NAME}/feature-a-schema#v1:schema.graphql`,
`github:${USER_NAME}/feature-b-schema#v1:schema.graphql`,
`github:${USER_NAME}/feature-c-schema#v1:schema.graphql`
],
{
loaders: [new GithubLoader()],
token: GIT_TOKEN
}
);
在中国本地化的方式中,使用load库的loadSchema方法来加载架构,需要指定loader,因此指定github-loader。
在github-loader中,指针模式(指向存放模式定义的位置)的描述方法如下:
`github:${リポジトリのオーナー名}/${リポジトリ名}#${ブランチ名 or タグ}:${スキーマ定義ファイル名}`
通过指定GitHub仓库和模式定义文件,可以读取在外部管理的模式定义。此外,还可以指定标签,这样即使模式定义发生更改,也不会对应用程序产生影响,只需更改标签即可。
可以同时写入多个要加载的模式定义,
加载的定义将自动合并为一个模式定义可以使用。
您也可以将已加载的模式定义传递给Apollo Server并启动GraphQL服务器。
通过这个方法,我们成功地将模式定义的开发与GraphQL服务器的开发分离出来。
摘要
-
- github-toolsを使用することでGraphQLサーバとスキーマ定義を分離できる
分離することでスキーマ定義を変更しやすくなる
スキーマ定義自体も分割管理できるようになる
github-loaderを使用することでGitHubから直接スキーマ定義を読み込むことができる
我目前只在个人开发中进行了尝试,但考虑到在团队开发中可能有一些优势,如果有机会的话,我会尝试将其引入。