Apollo GraphQL 服务器 + TypeScript

Apollo GraphQL Server + TypeScript

我最近在做一个项目,有node.js + express + typescript + Apollo server stack。在研究 Apollo 客户端时,我偶然发现了 TypeScript 部分。但是对于服务器来说就不是这样了,在这种情况下我可以自由选择。

所以问题是:是否有关于使用打字稿实现 Apollo graphql 服务器的最佳实践,或者我至少应该避免什么?

我一直在用它 apollo-server-express with Typescript for some projects and I have a small demo on gitHub

我不确定 best practices,但 apollo-server-express 基本上它提供了 graphqlExpressgraphiqlExpress 处理程序。

查看有关 Apollo Server with Express 的文档了解更多详情。

我正在使用 GraphQL CLI。你会像这样安装它

npm install -g graphql-cli

然后生成支持 TypeScript 的 GraphQL 项目

更多信息:https://oss.prisma.io/content/graphql-cli/05-Boilerplates.html

我为此编写了一个小型库和一个 CLI。它为服务器(根据您的架构)和客户端(根据您的架构和 GraphQL 文档)生成 TypeScript 类型。 它还生成解析器签名并且非常可定制。

您可以在这里尝试:https://github.com/dotansimha/graphql-code-generator

其背后的想法是让开发人员能够充分利用 GraphQL 和生成的类型,并更轻松地自定义生成的输出。

我使用 typescript + apollo graphql server 已经有一段时间了,并启动了一个模板,其中包含 dotan's graphql-code-generator 以及一些定义的文件夹结构和方法,这使得一切都很好地协同工作。重点是保持简单,但我会继续添加,因为我发现了良好的实践和有用的库。

github 存储库是 here

我写了一个叫typescript-typedefs的小包。它允许您定义 类 并使用打字稿装饰器从那里生成打字稿类型定义。这使它非常简单,并且与 apollo 服务器的处理方式配合得很好。

一个例子:

@Type()
class Student {
  @Field(ID)
  id: string;

  @Field()
  name: string;

  @Field(String)
  friendNames: string[];

  @Field({ type: Int, nullable: true })
  room: number;

  @Field()
  gpa: number;

  @Field(Course)
  courses: Course[];
}

我绝对建议使用 type-graphql + apollo-server-express

编写 Graphql API 通常有两种主要方式。代码优先或模式优先。

模式优先在节点社区中最受欢迎。它基本上意味着编写一个 graphql 模式文件 (SDL),然后将其导入并将其传递给 apollo 服务器(或您使用的任何工具),然后附加解析器。要将 Typescript 添加到此流程中,您将使用代码生成器(如 graphql-codegenerator)为您需要实现的解析器生成 Typescript 定义。

代码优先是大多数其他语言实现 graphql API 的方式。它基本上只是意味着使用库编写模式,然后从代码生成模式(或模式文件)。这种方法有很多好处,包括不必在几个不同的地方定义类型。

对于代码优先解决方案,有几个不错的选择。 Type-GraphQL 和 GraphQL nexus 都是非常可靠的库,具有良好的打字稿支持。就个人而言,我将始终提倡 GiraphQL,因为我维护它,但我确实相信它是目前在 typescript 中构建 graphql API 的最佳方式。

GiraphQL:https://giraphql.com/

关于 Prisma 的精彩演讲以及为什么代码优先很棒 https://youtu.be/5oyWwjLpUS4