VJSFを利用してJSON Schemaから入力フォームを自動生成する

2025-07-02

はじめに

バックエンドからJSON Schemaを受け取って、 そのスキーマをもとにVuetifyの入力フォームを表示してくれるライブラリを見つけました。

VJSF

しかし、VueやNuxtでの実際の使い方が調べてもあまり出てこなかったため、備忘録を残します。

環境

Node.js: v22.11.0

package.json
{
  "dependencies": {
    "@koumoul/vjsf": "^3.15.6",
    "nuxt": "^3.17.5",
    "vue": "^3.5.17",
    "vue-router": "^4.5.1",
    "vuetify-nuxt-module": "^0.18.7"
  }
}

設定内容

以下のページの「CommonJS dependencies」部分に記載されている設定内容をNuxtに設定します。

https://koumoul-dev.github.io/vuetify-jsonschema-form/latest/getting-started

nuxt.config.ts
import { commonjsDeps } from "@koumoul/vjsf/utils/build.js"

export default defineNuxtConfig({
  vite: {
    optimizeDeps: {
      include: [...commonjsDeps],
    },
    build: {
      commonjsOptions: {
        transformMixedEsModules: true,
      },
    },
  },
})

これがないと以下のようなエラーが発生します。

Uncaught SyntaxError: The requested module '/_nuxt/node_modules/ajv-formats/dist/index.js?v=7fe74a33' does not provide an export named 'default' (at validate.js:2:8)

Vjsfのコンポーネントを認識するために、以下の設定も入れます。

plugins/vjsf.ts
import Vjsf from "@koumoul/vjsf"

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.component("Vjsf", Vjsf)
})

使い方

<template>
  <v-form>
    <vjsf v-model="formData" :schema="schema"></vjsf>
  </v-form>
</template>

<script setup lang="ts">
// ref. https://tour.json-schema.org/content/01-Getting-Started/05-Arrays
const jsonSchema = {
  type: "object",
  properties: {
    name: {
      type: "string"
    },
    age: {
      type: "integer"
    },
    hobbies: {}
  },
  required: [
    "name",
    "age",
    "hobbies"
  ]
}

const formData = ref({})
const schema = ref(jsonSchema)
</script>

これの実行結果は以下のようになります。

バックエンドなどからJSON Schemaさえ連係されれば、その情報だけで入力フォームができあがってくれるのはけっこう嬉しいかもしれない
(スキーマが変わったらどうなるか、そこからは目を背ける)

スポンサーリンク