Next.js + サーバーサイドTypeScript + 関数フレーバーでクリーンなアプリを作ったので実装意図とか書く Advent Calendar 2022
の12日目。株式会社mofmofに生息しているshwldです。
前日はリポジトリ層について書きました
GraphQLサーバーを構成する要素
GraphQLのサーバーサイド実装は @graphql-codegenをメインにThe Guildのツールを多数使って実装しています。
いろいろ試していますがまだ、これがいい!みたいなのは自分の中で見つかっておらず、experimentalな感じです。
利用しているパッケージは以下。
Next.js配下
Next.jsのapiルートで使うためのパッケージです。
GraphQL Yoga
GraphQLサーバーです。サーバー自体はNext.jsのAPIルートを使っておりfastifyなど他のライブラリは使ってません。
GraphQL Envelop
Yogaを拡張するために使っています。
ContextやLoggerなどを使えるようにしています。
GraphQLリゾルバ
GraphQLのリゾルバはNext.jsとはレイヤーを分けています。
また、ユースケース層は分けず、GraphQLリゾルバをユースケース層として扱っています。
リゾルバーを作るために使っているパッケージは以下です。
@envelop/generic-auth
- コンテキストとして受け取ったユーザーを認証する
- ユーザーが存在しない場合にどうするかなどまだ、ちゃんと設定できてない
@graphql-codegen
- GraphQLのschemaからリゾルバの型を生成するために使っています
構造化とモジュール整理のためにGraphQL Modulesも試しましたが、こちらはfsを使ってファイルを引いて来るみたいな仕様が嫌で使っていません。
const executableSchema = makeExecutableSchema<GraphqlServerContext>({
typeDefs,
resolvers: merge.all<Resolvers<GraphqlServerContext>>([
userProfileModule.resolvers,
storyModule.resolvers,
projectModule.resolvers,
accountModule.resolvers,
viewerModule.resolvers,
]),
});
/advent-calendar/use-cases/graphql-resolvers/src/index.ts
zod
- バリデーションライブラリ
GraphQL Shield
- これでやっているのはログインしてるかどうかのチェックのみで、細かい認可制御は別でやっています
- これいらないかもなーとか思ったりしなくもない。理由はGraphQL Middlewareの項で
GraphQL Middleware
- GraphQLShieldを利用するために使っています。
- Middlewareを使うとレイヤー化を促進しますが、個人的にはGraphQL全体を責務でスライスするよりも、feature単位でスライスしたくて、あんまり好みとは合わない気がしています。
- はがそうかなーと思っています。
graphql-relay
- relay styleのページネーションを実装するためだけに使っています。
- 後日このカレンダーで記事にします。
次回予告
明日は、GraphQLリゾルバのディレクトリ構造について書きます