2019年2月7日

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

在我们上一篇文章中,我们概述了 SDL 优先的 GraphQL 服务器开发所面临的问题。本周,我们很高兴地宣布推出 GraphQL Nexus,一个代码优先的 GraphQL 库。由 蒂姆·格里瑟 撰写的客座文章。

Introducing GraphQL Nexus
 
“Schema 优先” GraphQL 服务器开发的问题
 
(正在阅读)
介绍 GraphQL Nexus:代码优先的 GraphQL 服务器开发
 
将 GraphQL Nexus 与数据库结合使用

回顾:SDL 优先开发的问题

正如上一篇文章所述,SDL 优先的 GraphQL 服务器开发面临诸多挑战,例如保持 SDL 与解析器同步模块化你的 GraphQL schema以及获得出色的 IDE 支持。大多数问题可以解决,但这需要学习、使用和集成大量额外工具。

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


介绍 GraphQL Nexus

两全其美:Schema 优先与代码优先

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

  • Schema 优先:预先进行 schema 设计是开发过程中的关键部分
  • SDL 优先:GraphQL schema 的 SDL 版本是 API 的事实来源
  • 代码优先:GraphQL schema 通过编程方式构建

虽然 GraphQL Nexus 是一个代码优先的框架,但它仍然可以用于 schema 优先开发。Schema 优先和代码优先并非相互对立的方法:它们结合使用时会更加有用。

借助 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,因此在安装时需要将其作为对等依赖

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 新闻通讯

© . All rights reserved.