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

回顾:SDL-first 开发的问题
如上一篇文章所述,SDL-first GraphQL 服务器开发面临诸多挑战,例如保持 SDL 和解析器同步、模块化 GraphQL schema 以及实现出色的 IDE 支持。大多数问题可以解决,但代价是学习、使用和集成大量额外工具。
今天我们推出一个库,它实现了 GraphQL 服务器开发的 code-first 方法: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 以编程方式定义和实现。因此,它遵循其他语言(如 sangria-graphql (Scala)、graphlq-ruby 或 graphene (Python))中 GraphQL 服务器的成熟方法。
类型安全、兼容 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 的最快方法是探索官方示例或使用在线演练场。
1) 安装
由于 GraphQL Nexus 严重依赖 graphql-js,因此安装时需要将其作为对等依赖
2) 配置和最佳实践
文档中的最佳实践部分包含许多关于理想编辑器设置的说明以及构建 Nexus 项目的提示。
由于 GraphQL Nexus 会即时生成类型定义,因此最好的开发体验是在您编码时在后台运行开发服务器。每当您保存文件时,它都会负责更新生成的类型定义。
3) 使用 graphql-yoga 的“Hello World”
完成编辑器设置后,您可以开始构建 GraphQL schema。以下是使用 graphql-yoga 的“Hello World”应用程序的样子
4) 从 SDL-first API 迁移
SDL 转换器允许您提供 SDL schema 定义并输出相应的 Nexus 代码(不含任何解析器)

力求卓越的开发者体验
Nexus API 的设计特别注重开发者体验。一些核心设计目标是
- 默认类型安全
- 可读性
- 开发者人体工程学
- 轻松集成 Prettier
在您构建 API 时运行的开发服务器确保您始终获得刚刚引入的 schema 更改的自动补全和错误检查。
借助 GraphQL Playground 中的新 schema 轮询功能,您的 GraphQL API 也会在您调整 schema 时即时重新加载。
告诉我们您的想法
我们对 GraphQL Nexus 感到非常兴奋,希望您也会喜欢它。欢迎通过探索官方示例或按照文档中的“入门”说明来试用 Nexus。
如果您遇到任何问题,请在 GitHub 上提出问题或通过我们的 Slack 联系我们。
不要错过下一篇文章!
订阅 Prisma 新闻通讯