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

要約: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-ruby
、graphene
(Python)など、他の言語のGraphQLサーバーで実績のあるアプローチを踏襲しています。
型安全、GraphQLエコシステムとの互換性、データ非依存
GraphQL Nexusは、TypeScript/JavaScriptのIntelliSenseを念頭に置いて設計されました。TypeScriptのジェネリクス、条件型、型マージを組み合わせて、完全に自動生成された型カバレッジを提供します。Nexusの主要な設計目標は、可能な限り少ない手動型アノテーションで最高の型カバレッジを実現することです。

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は型定義をオンザフライで生成するため、最高の開発者体験は、コードを書く際にバックグラウンドで実行される開発サーバーによって実現されます。ファイルを保存するたびに、生成された型定義の更新が行われます。
3) graphql-yoga
での「Hello World」
エディターの設定が完了したら、GraphQLスキーマの構築を開始できます。graphql-yoga
を使用した「Hello World」アプリは次のようになります
4) SDLファーストAPIからの移行
SDLコンバーターを使用すると、SDLスキーマ定義を提供し、対応するNexusコード(リゾルバなし)を出力できます
優れた開発者体験の追求
Nexus APIは、開発者体験に特に配慮して設計されています。いくつかの主要な設計目標は次のとおりです
- デフォルトで型安全
- 可読性
- 開発者の人間工学
- Prettierとの簡単な統合
APIを構築中に実行される開発サーバーにより、導入したスキーマ変更に対して常に自動補完とエラーチェックが行われます。
GraphQL Playgroundの新しいスキーマポーリング機能により、スキーマを調整するとGraphQL APIも即座にリロードされます。
ご意見をお聞かせください
GraphQL Nexusに非常に期待しており、皆さんもそう感じていただけると嬉しいです。ぜひ公式の例を探索したり、ドキュメントの「Getting Started」の手順に従ってNexusを試してみてください。
問題が発生した場合は、GitHubでissueを開くか、Slackでお問い合わせください。
次回の投稿もお見逃しなく!
Prismaニュースレターに登録