Back

Standard Schema 解説: ロックインなしの柔軟なバリデーション

Standard Schema 解説: ロックインなしの柔軟なバリデーション

あなたはZodでアプリを構築しました。フォームは動作し、APIはリクエストを検証し、TypeScriptはコンパイル時に型の不一致を検出します。そして、チームがValibotのみをサポートする新しいルーターを採用することになりました。あるいは、パフォーマンス上の利点からArkTypeを試したいと考えています。突然、書き直しに直面するか、互換性のないバリデーションライブラリ間のアダプターを保守することになります。

これが、Standard Schemaが解決するベンダーロックインの問題です。これは、バリデーションライブラリが共通言語で対話できるようにする小さなインターフェースであり、それらを利用するツールは、どのライブラリを選択したかを気にする必要がありません。

重要なポイント

  • Standard Schemaは、Zod、Valibot、ArkTypeなどのバリデーションライブラリ間の相互運用性を可能にするTypeScriptインターフェース(バリデーションライブラリではない)です。
  • スキーマのプロデューサーとコンシューマー間の共通契約を提供することで、アダプターの問題をN×Mの関係からN+Mに削減します。
  • 主要なバリデーションライブラリとエコシステムツールはすでに仕様をサポートしており、フォーム、ルーター、APIハンドラーを書き直すことなくバリデーターを切り替えることができます。
  • ~standardプロパティは、validateメソッド、型推論ヘルパー、および安定したバージョン管理された契約を公開します。

Standard Schemaとは何か(そして何でないか)

Standard Schemaは、別のバリデーションライブラリではありません。Zod、Valibot、ArkTypeと競合するものではありません。また、JSON Schemaやschema.orgとも無関係です。

代わりに、これはバリデーションライブラリが実装できるTypeScriptインターフェース(約60行の型定義)です。ライブラリがスキーマに~standardプロパティを公開すると、Standard Schemaを理解するあらゆるツールが、どのライブラリがスキーマを作成したかを知らなくてもデータを検証できます。

これをプロデューサー・コンシューマー契約と考えてください。バリデーションライブラリはプロデューサーです:スキーマを定義し、インターフェースを実装します。フレームワークとツールはコンシューマーです:契約に従う任意のスキーマを受け入れます。

アダプター増殖の問題

Standard Schema以前、エコシステムツールは不可能なメンテナンス負担に直面していました。計算を考えてみてください:6つの人気のあるバリデーションライブラリと、バリデーションを必要とする50のツールがある場合、300の潜在的なアダプターが必要になります。各アダプターには、メンテナンス、テスト、そしていずれかの側が変更されたときの更新が必要です。

Zod、Valibot、ArkTypeのエコシステムは急速に成長しましたが、この成長は断片化を生み出しました。フォームライブラリはZodをネイティブにサポートするかもしれませんが、他のすべてにはコミュニティアダプターが必要です。これらのアダプターは遅れをとることが多く、更新で壊れたり、単に存在しなかったりしました。

Standard Schemaは、これをN×Mの関係からN+Mに削減します。ライブラリは仕様を一度実装します。ツールは一度消費します。全員が恩恵を受けます。

インターフェースの仕組み

仕様は3つの重要な要素を定義します:

validateメソッドは、未知の入力を受け取り、型付けされた値を持つ成功結果、または問題の配列を持つ失敗結果のいずれかを返します。

型推論ヘルパーにより、ツールは、どのライブラリが作成したかに関係なく、準拠したスキーマから入力型と出力型を抽出できます。

安定した契約は、StandardSchemaV1としてバージョン管理され、メジャーバージョンアップなしに破壊的変更がないことを保証します。

~standardプロパティは意図的にチルダ接頭辞を使用しています。これにより、オートコンプリートリストの下部にソートされ、通常の開発中は邪魔になりません。

実践におけるベンダー中立的なバリデーション

このロックインなしの柔軟なバリデーションは、スタック全体に現れます:

フォーム: TanStack FormReact Hook Formは、Standard Schemaバリデーターを受け入れます。バリデーションロジックを一度書けば、フォームコードに触れることなくライブラリを切り替えられます。

ルーティング: TanStack Routerは、準拠したスキーマを使用してルートパラメーターと検索パラメーターを検証します。フォームとルーティングにおけるStandard Schemaは、アプリ全体で一貫したバリデーションパターンを意味します。

API: tRPCのようなツールは、特定のバリデーションライブラリに結合することなくリクエストボディを検証します。

設定: envinのようなツールは、好みのバリデーターを使用してビルド時に環境変数を検証します。

テスト: 本番データを検証するのと同じスキーマを使用して、テストでレスポンスの形状をアサートします。

仕様を実装するライブラリ

主要なプレーヤーはすでにStandard Schemaをサポートしています:

  • Zod (v3.24.0+)
  • Valibot (v1.0+)
  • ArkType (v2.0+)
  • Yup (v1.6.0+)
  • Typia (v7.3.0+)

現在、多くのライブラリが仕様を実装しており、数十のツールがそれを消費しています。サポートされているライブラリとその最小バージョンの現在のリストについては、公式Standard Schemaリポジトリを確認してください。

これがあなたのスタックにとって意味すること

馴染みがあるためZodから始め、より小さなバンドルのためにValibotに切り替え、または型レベルのバリデーションのためにArkTypeを採用できます。すべて、フォーム、ルーター、またはAPIハンドラーを書き直すことなく実現できます。

ベンダー中立的なバリデーションアプローチは、アーキテクチャ上の決定が永続的でないことを意味します。ライブラリをその利点で評価できます:API設計、バンドルサイズ、パフォーマンス、エラーメッセージ。スタックの残りの部分は安定したままです。

まとめ

Standard Schemaは、成熟したエコシステムを表しています。競合するバリデーションライブラリがツールの景観を断片化する代わりに、相互運用性が得られます。バリデーターの選択は、スタック全体のコミットメントではなく、ローカルな決定になります。

現在のツールが仕様をサポートしているか確認してください。サポートしている場合、すでにロックインなしの柔軟なバリデーションを持っています。それを使用するだけです。

よくある質問

いいえ。Standard Schemaは単なるTypeScriptインターフェース仕様です。それをサポートするバリデーションライブラリは、~standardプロパティを自動的に公開します。選択したバリデーションライブラリを通常どおり使用すれば、互換性のあるツールは追加の依存関係なしにインターフェースを検出します。

各ライブラリには独自のAPIがあるため、ライブラリを切り替えるにはスキーマ定義を書き直す必要があります。ただし、フォームライブラリやルーターなどの消費ツールは、ライブラリ固有のAPIではなくStandard Schemaインターフェースを介して対話するため、変更なしで動作し続けます。

ツールのドキュメントで、通常はバリデーションまたは型安全性に関するセクションでStandard Schemaが言及されているかを確認してください。また、ツールが~standardプロパティを持つスキーマを受け入れるか、TypeScript型でStandardSchemaV1を参照しているかを確認することもできます。

既存のスキーマの周りに~standardインターフェースを実装する薄いラッパーを作成できます。これには、期待される結果形式を返すvalidateメソッドを公開することが含まれます。実装例とガイダンスについては、Standard Schemaリポジトリを確認してください。

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay