Closed6

Reactのフォーム、バリデーションライブラリの比較

tkc310tkc310

react-final-form, react-hook-formを比較する。

react-final-form

  • 3.2kb (+ final-form 5.2kb)
  • ts型ビルトイン
  • ドキュメント
  • Blitz.jsで採用されている。
  • name, value, handlerなどをコンポーネントに渡す形式
    input

chakrauiとの併用サンプル
https://codesandbox.io/s/github/final-form/react-final-form/tree/master/examples/chakra?file=/index.js:5672-5679

hooksもある
https://github.com/final-form/react-final-form-hooks

react-hook-form

  • 8.2KB
  • ts型ビルトイン
  • ドキュメント
  • react-final-formより人気
  • ドキュメントが見やすい、日本語記事も見つかりやすい
  • 最大/最小値、必須、正規表現などシンプルなバリデーションもビルトインでできる
  • refをコンポーネントに渡す形式
    register

chakrauiとの併用サンプル
https://chakra-ui.com/guides/integrations/with-hook-form

外部ライブラリのコンポーネント、自作コンポーネントはrefを渡せるようにする必要がある。
自作の場合は React.forwardRef で対応できる。
https://ja.reactjs.org/docs/forwarding-refs.html

結論

どちらも出来ることに差はなさそう

react-hook-formはrefを渡すインターフェースが特徴的で、react-final-formの方がシンプルに見える。
ドキュメントが充実していて、日本語記事も多いためreact-hook-formを選んでおくのが無難そうではある。

tkc310tkc310

バリデーションライブラリの比較をする。
シンプルなAPIのものを利用して複雑なバリデーションは自作する方針にしたい。

参考記事
https://bagelee.com/programming/react/validation-library/
https://github.com/react-hook-form/resolvers
https://www.npmtrends.com/io-ts-vs-joi-browser-vs-superstruct-vs-vest-vs-yup-vs-zod

とりあえず沢山あることが分かった..

下記がメジャーで日本語記事もよく見つかる。

  • yup
  • zod
tkc310tkc310

yupとzodを比較する。

zodのREADME.mdに比較内容が記載されている。
https://github.com/colinhacks/zod#comparison

yup

  • 18.2kb
  • デフォルト任意入力
  • API
  • APIの差分
    • nubmer.round
    • object.camelCase
    • string.trim
    • cast, transform

zod

  • 11.3kb
  • デフォルト必須入力
  • API
  • APIの差分
    • object.partial, object.deepPartial
    • union, intersection
    • primise
    • function
  • Blitz.jsで採用されている (final-form x zod)
    https://blitzjs.com/docs/utilities

yupは途中からzodは最初からtypescriptに対応していたという経緯があるからか、下記の記事に書かれているように型生成時の挙動が安定していない部分があるらしい。
https://bagelee.com/programming/react/validation-library/#4

react-hook-formと組み合わせる場合、zodでnumberを扱う時に { valueAsNumber: true } のような記載をする必要がある。
scheme自体はyupよりzodの方がシンプルに見える。

結論

ユーザ数はyupが圧倒的に多いため困った時に助かりそうだが、Blitz.jsが採用している & typescriptフレンドリーなzodを利用してみたいと思った。

tkc310tkc310

余談

Ant Designはビルトインで Form コンポーネントにtypescript対応のstate管理とバリデーションが付いている。

Ant Designを利用する場合はreact-hook-form, zodを利用せず、ビルトインのシンプルなAPIで頑張れそうだと思った。

tkc310tkc310

後日談

toB・デスクトップ向けのsaasでantdのFORMだけで頑張った結果、痒いところに手が届かない事が理解できた。
ある程度大きなor複雑なフォームを持つプロダクトではreact hook form(rhf)を利用するのが間違いなさそう。
ref経由でdom apiを直接利用する作りのためパフォーマンスにも優しい。

例えば、巨大なフォームを分解して兄弟・親子関係にあるフォームを作った時に、値の共有方法やイベント周りのAPIがrhfは充実・洗練されている。
(フォームのライブラリということもあるため当然ではある)

また、ユーザー数も多いためググラビリティが高く複雑な処理を書いた時に困る人が少なくなる。
(マルタスタックなチームでは特に顕著)

洗練されていて予測しやすいAPIを持っている事と有名所でドキュメントが豊富な事はとても大切。

このスクラップは2021/10/19にクローズされました