2019年2月7日

GraphQL Nexusの紹介:Code-First GraphQLサーバー開発

前回の記事では、SDLファーストのGraphQLサーバー開発における課題について概説しました。今週は、コードファーストのGraphQLライブラリであるGraphQL Nexusを発表できることを嬉しく思います。Tim Griesserによる寄稿です。

Introducing GraphQL Nexus
 
「スキーマファースト」GraphQLサーバー開発の問題点
 
(現在閲覧中)
GraphQL Nexusの紹介:Code-First GraphQLサーバー開発
 
GraphQL Nexusとデータベースの利用

要約:SDLファースト開発の課題

前回の記事で概説したように、SDLファーストのGraphQLサーバー開発には、SDLとリゾルバの同期維持GraphQLスキーマのモジュール化優れたIDEサポートの実現など、多くの課題があります。これらの問題のほとんどは解決可能ですが、その代償として、多数の追加ツールを学習し、使用し、統合する必要があります。

本日、GraphQLサーバー開発におけるコードファーストのアプローチを実装したライブラリ、GraphQL Nexusをご紹介します。


GraphQL Nexusの紹介

両方の良いとこ取り:スキーマファースト&コードファースト

前回の記事では、GraphQLサーバーを構築するためのスキーマファースト、SDLファースト、コードファーストのアプローチについて理解を深めました

  • スキーマファースト:開発プロセスにおいて、事前のスキーマ設計が重要
  • SDLファースト:GraphQLスキーマのSDLバージョンがAPIの信頼できる情報源
  • コードファースト:GraphQLスキーマがプログラム的に構築される

GraphQL Nexusはコードファーストのフレームワークですが、スキーマファースト開発にも使用できます。スキーマファーストとコードファーストは相反するアプローチではなく、組み合わせることでさらに有用になります。

Nexusでは、GraphQLスキーマはプログラム的に定義および実装されます。したがって、sangria-graphql(Scala)、graphql-rubygraphene(Python)など、他の言語のGraphQLサーバーで実績のあるアプローチを踏襲しています。

型安全、GraphQLエコシステムとの互換性、データ非依存

GraphQL Nexusは、TypeScript/JavaScriptのIntelliSenseを念頭に置いて設計されました。TypeScriptのジェネリクス、条件型、型マージを組み合わせて、完全に自動生成された型カバレッジを提供します。Nexusの主要な設計目標は、可能な限り少ない手動型アノテーションで最高の型カバレッジを実現することです。

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

Nexusはgraphql-jsのプリミティブを基盤としているため、現在のGraphQLエコシステムとほぼ互換性があります。

Nexusを使ったGraphQLスキーマの定義と実装

NexusのAPIは、オブジェクト型ユニオンインターフェース列挙型など、GraphQLの型システムにあるその他すべてのものなど、GraphQLスキーマの構成要素を定義および実装できる多数の関数を公開しています。

QueryおよびMutation型は、GraphQLスキーマにおけるいわゆるルート型です。Nexusは、これらを定義するための簡略化されたAPIを提供します

GraphQLスキーマのすべての型を定義したら、makeSchema関数を使用してGraphQLSchemaインスタンスを作成できます。これがGraphQLサーバー(例: graphql-yogaまたはapollo-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スキーマの構築を開始できます。graphql-yogaを使用した「Hello World」アプリは次のようになります

4) SDLファーストAPIからの移行

SDLコンバーターを使用すると、SDLスキーマ定義を提供し、対応するNexusコード(リゾルバなし)を出力できます

SDL converter


優れた開発者体験の追求

Nexus APIは、開発者体験に特に配慮して設計されています。いくつかの主要な設計目標は次のとおりです

  • デフォルトで型安全
  • 可読性
  • 開発者の人間工学
  • Prettierとの簡単な統合

APIを構築中に実行される開発サーバーにより、導入したスキーマ変更に対して常に自動補完とエラーチェックが行われます。

GraphQL Playgroundの新しいスキーマポーリング機能により、スキーマを調整するとGraphQL APIも即座にリロードされます。


ご意見をお聞かせください

GraphQL Nexusに非常に期待しており、皆さんもそう感じていただけると嬉しいです。ぜひ公式のを探索したり、ドキュメントの「Getting Started」の手順に従ってNexusを試してみてください。

問題が発生した場合は、GitHubでissueを開くか、Slackでお問い合わせください。

次回の投稿もお見逃しなく!

Prismaニュースレターに登録

© . All rights reserved.