2026年のフォームバリデーション:ライブラリを不必要に使用するのはやめよう
2026年において、フォームのバリデーションに重いJavaScriptライブラリは必要ありません。
先月、バリデーションライブラリを一切使わずにチェックアウトフォームをリリースしました。ネイティブなHTMLとわずか30行のJavaScriptだけで、必須項目、メールアドレスの形式、パスワードの長さのチェックを実現しました。
npm install を実行する前に、ほとんどの問題を解決できるこれら6つのネイティブ属性を活用しましょう。
• required: テキスト、セレクトボックス、チェックボックスの空送信を防ぎます。
• type: type="email" や type="url" を使用して、基本的な形式のミスを検知します。
• minlength と maxlength: カスタムロジックなしで文字数制限を強制します。
• min、max、step: 数値や日付の範囲を制御します。
• pattern: 正規表現を使用して、郵便番号などの特定の形式を強制します。
• inputmode と autocomplete: 適切なキーボードを表示したり、既知のデータを自動入力したりすることで、エラーを減らします。
ネイティブのメッセージが汎用的すぎると感じる場合は、Constraint Validation APIを使用してください。
すべての input 要素は validity オブジェクトを持っています。valueMissing や typeMismatch といったプロパティをチェックすることで、役立つエラーメッセージを作成できます。独自のテキストを表示するには setCustomValidity を使用します。
input イベントが発生した際に、カスタムメッセージをクリアすることを忘れないでください。そうしないと、ユーザーが内容を修正した後でも、フィールドがエラー状態のままになってしまいます。
スタイリングに関しては、フィールドが「touched(操作済み)」かどうかを追跡するためにJavaScriptを使うのはやめましょう。
現在は CSS の :user-invalid 擬似クラスがこれを処理してくれます。これはユーザーがフィールドを操作した後にのみスタイルを適用します。これを :has() セレクターと組み合わせることで、エラーテキストを自動的に表示できます。これにより、数十行の不要なコードを削減できます。
では、どのような時に実際にライブラリを使うべきなのでしょうか?
ライブラリが必要になるのは、以下の2つの特定のケースに限られます。
- フィールド間のバリデーション: 「パスワードの確認」や複雑な条件ロジックなど、あるフィールドが別のフィールドに依存する場合。
- 非同期バリデーション: 「このユーザー名は既に使用されていますか?」のように、データベースを確認する必要がある場合。
フォームに単一フィールドのルールしか必要ないのであれば、ネイティブな方法を使いましょう。コードが少なければ、バグも少なくなります。まずはブラウザの機能を活用することから始めてください。ブラウザの限界に達したときに初めて、ライブラリを追加しましょう。
Optional learning community: https://t.me/GyaanSetuAi