テック技報最新号へ →
コード

Vite+(vp)で lint・format・型チェック・テスト・Node 管理を1つにまとめる

Vite+ は Vite・Vitest・Oxlint・Oxfmt・Rolldown・tsdown・Vite Task を1つの依存にまとめたツールチェーン(MIT)。vp check で format・lint・型チェックを一度に走らせられ、husky + lint-staged や fnm も置き換えられる。

@shimabu_it · 投稿 2026-03-14
#frontend#vite#tooling#oxlint#vitest#github-actions#monorepo

移行で消せたもの(実例)

oxfmt、oxlint、oxlint-tsgolint、tsgo、lefthook(husky + lint-staged 相当)、fnm(Node のバージョン管理)。npm scripts もかなり減らせた。

主なコマンド

コマンド役割
vp migrate既存プロジェクトを移行。.oxlintrc* / .oxfmtrc* / lint-staged の設定を vite.config.ts に統合
vp check(--fix)format + lint + 型チェック
vp test / vp build / vp devVitest / 本番ビルド / dev サーバー
vp run <task>package.json scripts とモノレポのタスクをキャッシュ付き・依存順で実行
vp envNode.js とパッケージマネージャーをグローバル・プロジェクト単位で管理
vp install / vp addlockfile と packageManager から pnpm / npm / Yarn / Bun を自動判別して実行
vp staged / vp hooksステージ済みファイルへのチェックと Git フック

設定は vite.config.ts 1つ

ts
import { defineConfig } from 'vite-plus'

export default defineConfig({
  test: { include: ['src/**/*.test.ts'] },   // Vitest
  lint: { ignorePatterns: ['dist/**'] },     // Oxlint
  fmt: { semi: true, singleQuote: true },    // Oxfmt
  run: {                                     // Vite Task
    tasks: {
      'generate:icons': {
        command: 'node scripts/generate-icons.js',
        cache: { env: ['ICON_THEME'] },       // この環境変数もキャッシュキーに含める
      },
    },
  },
  staged: { '*': 'vp check --fix' },         // コミット前チェック
})

タスクランナー(Vite Task)は、起動したプロセスが実際に読んだファイルを Rust の fspy クレートで捕捉してキャッシュの入力を決めるため、Turborepo のように入力ファイルを手で列挙しなくてよい(仕組みの解説は出典の asa1984 さんの記事)。

CI(GitHub Actions)

yaml
- uses: actions/checkout@v5
- uses: voidzero-dev/[email protected]   # 正確なバージョンタグを指定する
  with:
    node-version-file: ".node-version"
    cache: true          # lockfile を自動検出して依存をキャッシュ
    run-install: true
- run: vp check
- run: vp test

注意: setup-vp@v1 のメジャータグは v1.15.0 で凍結されていて更新されない。@v1 のままだと新しいリリースが入らないので、正確なタグ(さらに GitHub Actions: pinact で uses: をコミット SHA に固定する)で指定する。

注意

出典

X の元の投稿を開く