tRPC
基本事項 †
RPC †
- リモートプロシージャコール の略で、遠隔手続き呼び出しなどと呼ばれるプロトコル、規約のことを指す
- RPC では、あるコンピュータからネットワーク越しに別のコンピュータで動作するプログラムをプログラム中の手続きや関数、メソッドなどを呼び出すのと同じ手順で呼び出すものであり、呼び出し時にネットワークレイヤを意識することなく抽象化したものと言える
- ネットワーク上で双方で RPC による通信をするために通信規約として RPC プロトコルが定められている
- RPC でやり取りをする際のデータフォーマットというのは、いくつかあり、例えば、メッセージを XML で記述する XML-RPC や JSON で記述する JSON-RPC などがある
- RPC でやり取りする際に バイナリ形式だとデータの取り扱いが大変だったり、テキストベースのプロトコルだと通信における転送効率が良くないという問題があった
gRPC †
- そこで登場したのが、gRPC
- gRPC は、Googleが開発したRPC 実現のためのプロトコル
- gRPC を使うと IDL を使い API 仕様をファイルとし定義でき、そこからサーバーとクライアントに必要なソースコードのひな形を生成することができる
- Protocol Buffers を使いデータをシリアライズし、高速な通信を実現できる
tRPC †
- tRPC は、gRPC のように スキーマを作成し、Protocol Buffers のようにバイナリベースのプロトコルでかつデータをシリアライズし高速化を目指すとかではない
- クライアントとサーバーの間で型を直接共有できるための RPC フレームワーク
特徴 †
- 軽量 (公式ページによると 🍃 Light - tRPC has zero deps and a tiny client-side footprint.)
- 学習コストが低い
- GraphQL や gRPC ではクライアント / サーバー間の API 通信を行うために独自のクエリで API を定義する必要がありますが、tRPC ではそのようなことは不要です。そのためサクッと実装することができ、開発体験が非常に良いです。
- ではどのようにしてクライアント・サーバー間で型安全な API 通信を実現しているかというと、具体的には tRPC ではサーバー側で実装した router モジュールの型をエクスポートして、クライアント側で利用します。
比較 †
事例 †
関連ライブラリ †
- zodはTypeScriptによるスキーマの定義と、それをもとにバリデーションができるライブラリ
- tRPCではそのスキーマを使用してリクエストを定義します。型が一致しているかはもちろん、詳細なバリデーションもスキーマファーストで行えるため、バリデーションを忘れていないか?変な値がリクエストされてないか?と不安にならずにすみます。