2019 年 2 月 7 日

GraphQL Nexus 简介:代码优先的 GraphQL 服务器开发

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

Introducing GraphQL Nexus
部分1
 
“Schema-First” GraphQL 服务器开发的问题
部分2
 
(当前阅读)
GraphQL Nexus 简介:代码优先的 GraphQL 服务器开发
部分3
 
将 GraphQL Nexus 与数据库一起使用

回顾: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-rubygraphene (Python)。

类型安全、兼容 GraphQL 生态系统且数据无关

GraphQL Nexus 的设计考虑了 TypeScript/JavaScript 的智能感知。它结合了 TypeScript 泛型、条件类型和类型合并,以提供完全自动生成的类型覆盖。Nexus 的核心设计目标是以尽可能少的手动类型注释获得最佳的类型覆盖。

Type-safe, compatible with GraphQL ecosystem & data-agnostic

Nexus 构建于 graphql-js 的原语之上,这使其在很大程度上与当前的 GraphQL 生态系统兼容。

使用 Nexus 定义和实现 GraphQL schema

Nexus 的 API 公开了一些函数,可让您定义和实现 GraphQL schema 的构建块,例如 对象类型联合类型接口枚举 以及您在 GraphQL 的类型系统中找到的所有其他内容

QueryMutation 类型是 GraphQL schema 中的所谓根类型。Nexus 提供了一个简写 API 来定义这些类型

定义 GraphQL schema 的所有类型后,您可以使用 makeSchema 函数创建一个 GraphQLSchema 实例,该实例将成为您的 GraphQL 服务器(例如 graphql-yogaapollo-server)的基础

makeSchema 还允许您提供 Prettier 配置,以便生成的代码符合您的样式指南 💅

GraphQL Nexus 入门

开始使用 Nexus 的最快方法是浏览官方示例或使用在线 Playground

1) 安装

由于 GraphQL Nexus 在很大程度上依赖于 graphql-js,因此需要将其作为安装的 peer dependency(对等依赖)

2) 配置和最佳实践

文档中的最佳实践部分包含有关理想编辑器设置和 Nexus 项目结构提示的许多说明。

由于 GraphQL Nexus 动态生成类型定义,因此最佳的开发者体验是通过在您编写代码时在后台运行的开发服务器实现的。每当您保存文件时,它都会负责更新生成的类型定义。

使用 TypeScript 时,一种可能的设置是使用 ts-node-dev 作为开发服务器

然后,您可以在 package.json 中为开发配置 npm 脚本

使用 JavaScript 时,您可以使用 nodemon

然后,您可以在 package.json 中为开发配置 npm 脚本

3) 使用 graphql-yoga 的“Hello World”

完成编辑器设置后,您可以开始构建您的 GraphQL schema。以下是使用 graphql-yoga 的“Hello World”应用程序的样子

4) 从您的 SDL 优先 API 迁移

SDL 转换器允许您提供 SDL schema 定义并输出相应的 Nexus 代码(没有任何解析器)

SDL converter


力求卓越的开发者体验

Nexus API 的设计特别注重开发者体验。一些核心设计目标是

  • 默认类型安全
  • 可读性
  • 开发者人体工程学
  • 轻松与 Prettier 集成

在您构建 API 时运行的开发服务器确保您始终获得刚引入的 schema 更改的自动完成和错误检查。

借助 GraphQL Playground 中新的 schema 轮询功能,当您调整 schema 时,您的 GraphQL API 也会立即重新加载。


让我们知道您的想法

我们对 GraphQL Nexus 感到非常兴奋,并希望您也会如此。欢迎通过浏览官方示例或按照文档中的“快速入门”说明来试用 Nexus。

如果您遇到任何问题,请打开一个 GitHub issue 或在我们的 Slack 中联系我们。

不要错过下一篇文章!

注册 Prisma 新闻通讯