👻

次世代Form LibrariesのRegleに入門してみる

に公開

Vue Advent Calendar 2025 の 12 日目の記事です。

はじめに

過去の記事にてVueでTanStack Formを触ってみましたが、競合するライブラリとしてRegleが存在します。

https://reglejs.dev/

Regleを触ったことがなかったので、調べて触ってみたことをまとめてみようと思います。

Regleとは

公式のトップページで以下の記載があります。

Headless form validation for Vue.js Type safe, model-based and intuitive API. The perfect evolution of Vuelidate.

Vue.jsのためのヘッドレスなフォームバリデーション
型安全で、モデルに基づいた直感的API
Vuelidateの完璧な進化形。

VuelidateはVue 2の時から存在するFormバリデーションライブラリのことです。
The perfect evolution of Vuelidate.と記載があるとおり、Vuelidateからのマイグレーションガイドもありますね。(若干ハードル上げてないかなと思いつつ...🤔)

TanStack Formとの比較についての記載もありました。

Regle is a more lightweight and less boilerplate alternative to TanStack Form.

Regleは、TanStack Formよりも軽量で、ボイラープレートも少ない代替手段と言えるでしょう。

私もTanStack Formでバリデーションを書いたとき、ボイラープレートが多いなと感じていたので期待が膨らみます。

https://zenn.dev/shava2c/articles/e0649fab434339

検証

Regleのプレイグラウンド環境があるのでそちらを使います。

フォームの要件

  • 名前を登録するフォーム
  • バリデーション条件
    • サブミット時、ブラー時で検知
  • バリデーション内容
    • 空文字入力の場合は「名前は必須です」というエラーを表示

実装例

Regleを使って書くと以下の通りです。

<script setup lang="ts">
import { ref } from 'vue'
import { useRegle } from '@regle/core'
import { required, withMessage } from '@regle/rules'

const state = ref<null | string>(null);
const { r$ } = useRegle(state, { 
  required: withMessage(required, '名前は必須です')
})
async function handleSubmit() {
  const { valid, data } = await r$.$validate()
  if (valid) {
    alert(data)
  } else {
    console.warn('Errors: ', r$.$errors)
  }
}
</script>

<template>
  <form @submit.prevent.stop="handleSubmit">
    <div>
      <label for="userName">名前</label>
      <input
        id="userName"
        name="userName"
        v-model="r$.$value"
        @blur="r$.$validate()"
      />
      <p v-if="r$.$error">{{ r$.$errors[0] }}</p>
    </div>
    <button type="submit">Submit</button>
  </form>
</template>

お、useRegleという関数を利用していますね、順々に見ていきましょう。

コードの説明

useRegle

Regleの中核となる機能です。
公式に載っているように、状態とバリデーションルールなどを設定できるようです。

const { r$ } = useRegle(
  /* 1. Your data (state) */,
  /* 2. Your validation rules */,
  /* 3. Optional modifiers */
);

また、第二引数のrequiredには自分で設定したバリデーション関数やRegleから提供されるバリデーション関数を設定できます。
Built-in rules がかなり充実している...!

今回は単一の状態だけなので以下のように書けます。

const state = ref<null | string>(null);
const { r$ } = useRegle(state, { 
  required: withMessage(required, '名前は必須です')
})

Built-in wrappersのwithMessageを使ってバリデーションのメッセージをカスタマイズできます。

<template>

useRegleの戻り値r$$付きプロパティでフォームに関する処理が一手にできるようになっています。

  • $value:リアクティブなデータをバインディング

  • $validate:バリデーションの実行関数

  • $error$errors:エラー有無とエラーメッセージの配列

r$にバリデーションに必要な要素が凝縮されています。
Validation propertiesを読み込むともっと踏み込んだことができそうです。

handleSubmit

ボタン押下によるhandleSubmit関数内でもr$が利用できます。

r$.$validate()の戻り値validdataを利用してその後の処理を書けるので直感的ですね。

また$validate()実行後、validtrue(バリデーション通過)の場合のdataは、バリデーションの結果が反映された型になります!

例えば今回の場合はstateの初期値の型を null | string として設定していましたが、handleSubmit内のdataを見てみるとnullがなくなっています。
これはrulerequiredを設定したので、Regleが型をナローイングしてくれます。

Regleの型ナローイング

結論

Regle、はじめて触ってみました。
個人的にはTanStack FormよりもVue.jsらしく書け、かつ型安全に書けるので推しのライブラリになりました。
また、ドキュメントが充実していてCheat Sheet、Playgroundが提供されているのも最高でした💯。

参考文献

GitHubで編集を提案

Discussion