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 模式实现出色的 IDE 支持。 大部分问题可以解决,但需要学习、使用和集成大量额外的工具。

今天,我们推出一个实现 GraphQL 服务器代码优先方法的库:GraphQL Nexus


GraphQL Nexus 介绍

两全其美:Schema-first & 代码优先

在上一篇文章中,我们对构建 GraphQL 服务器的schema优先、SDL优先和代码优先方法有了了解

  • Schema-first:预先的模式设计是开发过程的关键部分
  • SDL-first:GraphQL 模式的 SDL 版本是 API 的真值来源
  • 代码优先:GraphQL 模式以编程方式构建

GraphQL Nexus 作为一个代码优先框架,仍然可以用于 schema-first 开发。 Schema-first 和代码优先不是对立的方法:当它们结合在一起时会变得更加有用。

使用 Nexus,GraphQL 模式以编程方式定义和实现。 因此,它遵循其他语言中 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 模式

Nexus 的 API 公开了许多函数,使你可以定义和实现 GraphQL 模式的构建块,例如 对象类型联合 & 接口枚举 以及你在 GraphQL 的类型系统中找到的所有其他内容

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

定义了 GraphQL 模式的所有类型后,你可以使用 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 模式。 这是一个使用 graphql-yoga 的“Hello World”应用程序的样子

4) 从你的 SDL 优先 API 迁移

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

SDL converter


努力获得出色的开发者体验

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

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

在您构建 API 时运行的开发服务器可确保您始终获得自动补全功能,并对您刚刚引入的模式更改进行错误检查。

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


请告诉我们您的想法

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

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

不要错过下一篇文章!

注册 Prisma 新闻通讯