在上一篇文章中,我们概述了 SDL 优先的 GraphQL 服务器开发的问题。本周,我们很高兴宣布 GraphQL Nexus,一个代码优先的 GraphQL 库。这是 Tim Griesser 的客座文章。

回顾:SDL 优先开发的问题
正如上一篇文章中概述的那样,SDL 优先的 GraphQL 服务器开发面临许多挑战,例如保持 SDL 和解析器同步、模块化您的 GraphQL schema 以及实现出色的 IDE 支持。大多数问题可以解决,但需要学习、使用和集成大量额外的工具。
今天,我们推出一个库,该库实现了 GraphQL 服务器开发的代码优先方法:GraphQL Nexus。
GraphQL Nexus 简介
两全其美:Schema-first 和 code-first
在上一篇文章中,我们深入了解了构建 GraphQL 服务器的schema-first、SDL-first 和code-first 方法
- Schema-first:预先的 schema 设计是开发过程的关键部分
- SDL-first:GraphQL schema 的 SDL 版本是 API 的真理之源
- Code-first:GraphQL schema 以编程方式构建
GraphQL Nexus 虽然是一个 code-first 框架,但仍然可以用于 schema-first 开发。Schema-first 和 code-first 不是对立的方法:当它们结合使用时,会变得更加有用。
借助 Nexus,GraphQL schema 以编程方式定义和实现。因此,它遵循其他语言中 GraphQL 服务器的成熟方法,例如 sangria-graphql
(Scala)、graphlq-ruby
或 graphene
(Python)。
类型安全、兼容 GraphQL 生态系统且数据无关
GraphQL Nexus 的设计考虑了 TypeScript/JavaScript 的智能感知。它结合了 TypeScript 泛型、条件类型和类型合并,以提供完全自动生成的类型覆盖。Nexus 的核心设计目标是以尽可能少的手动类型注释获得最佳的类型覆盖。

Nexus 构建于 graphql-js
的原语之上,这使其在很大程度上与当前的 GraphQL 生态系统兼容。
使用 Nexus 定义和实现 GraphQL schema
Nexus 的 API 公开了一些函数,可让您定义和实现 GraphQL schema 的构建块,例如 对象类型、联合类型 和 接口、枚举 以及您在 GraphQL 的类型系统中找到的所有其他内容
Query
和 Mutation
类型是 GraphQL schema 中的所谓根类型。Nexus 提供了一个简写 API 来定义这些类型
定义 GraphQL schema 的所有类型后,您可以使用 makeSchema
函数创建一个 GraphQLSchema
实例,该实例将成为您的 GraphQL 服务器(例如 graphql-yoga
或 apollo-server
)的基础
makeSchema
还允许您提供 Prettier 配置,以便生成的代码符合您的样式指南 💅
GraphQL Nexus 入门
开始使用 Nexus 的最快方法是浏览官方示例或使用在线 Playground。
1) 安装
由于 GraphQL Nexus 在很大程度上依赖于 graphql-js
,因此需要将其作为安装的 peer dependency(对等依赖)
2) 配置和最佳实践
文档中的最佳实践部分包含有关理想编辑器设置和 Nexus 项目结构提示的许多说明。
由于 GraphQL Nexus 动态生成类型定义,因此最佳的开发者体验是通过在您编写代码时在后台运行的开发服务器实现的。每当您保存文件时,它都会负责更新生成的类型定义。
3) 使用 graphql-yoga
的“Hello World”
完成编辑器设置后,您可以开始构建您的 GraphQL schema。以下是使用 graphql-yoga
的“Hello World”应用程序的样子
4) 从您的 SDL 优先 API 迁移
SDL 转换器允许您提供 SDL schema 定义并输出相应的 Nexus 代码(没有任何解析器)
力求卓越的开发者体验
Nexus API 的设计特别注重开发者体验。一些核心设计目标是
- 默认类型安全
- 可读性
- 开发者人体工程学
- 轻松与 Prettier 集成
在您构建 API 时运行的开发服务器确保您始终获得刚引入的 schema 更改的自动完成和错误检查。
借助 GraphQL Playground 中新的 schema 轮询功能,当您调整 schema 时,您的 GraphQL API 也会立即重新加载。
让我们知道您的想法
我们对 GraphQL Nexus 感到非常兴奋,并希望您也会如此。欢迎通过浏览官方示例或按照文档中的“快速入门”说明来试用 Nexus。
如果您遇到任何问题,请打开一个 GitHub issue 或在我们的 Slack 中联系我们。
不要错过下一篇文章!
注册 Prisma 新闻通讯