React

@vitejs/plugin-react とは?v6.1の導入とvite.config設定・React Compiler・SWC版との違い

@vitejs/plugin-react とは?v6.1の導入とvite.config設定・React Compiler・SWC版との違い

@vitejs/plugin-react は、ViteでReactを動かすための公式プラグインです。開発サーバーのFast Refresh(状態を保ったままの画面更新)と、React向けのJSXの設定を受け持ち、npm create vite のReactテンプレートにも最初から入っています。2026年10月時点の最新は 6.1.2。v6はVite 8が必須で、内部からBabelが外れました。この記事では、導入と vite.config.ts の書き方、v5から上げるときに詰まる箇所、6.1.0で入ったネイティブのReact Compiler、SWC版との使い分けを、手元で実際にビルドした結果つきで整理します。

まとめ:@vitejs/plugin-react の要点

  • 導入は npm install -D @vitejs/plugin-react と、vite.config.ts の plugins: [react()] の2点で終わる。オプションなしで大半の用途に足りる。
  • 最新は6.1.2(2026-10-05)。v6はVite 8専用で、Vite 7のまま入れようとするとnpmがERESOLVEで止まる。Vite 7に留めるならv5.2.0を使う。
  • v6では react({ babel: {...} }) が廃止された。指定してもビルドはエラーなく通り、Babelプラグインが黙って効かなくなるので、@rolldown/plugin-babel へ移す。
  • React Compilerは、6.1.0からの react({ compiler: true })(Rust版・実験的)と、reactCompilerPreset() のBabel版の2通り。500コンポーネントの実測でRust版0.5秒、Babel版6.8秒で、出力は同一だった。
  • 新規なら標準の @vitejs/plugin-react を選ぶ。SWC版はSWCプラグインを使う構成のためのもので、create-vite 9からはSWC版のテンプレートが消えている。

@vitejs/plugin-react がViteで担う処理(Fast RefreshとJSX)

Viteは .ts や .tsx を自前で変換できますが、Reactのコンポーネントを編集したときに状態を残したまま差し替えるFast Refreshは、Vite本体にはありません。公式READMEが挙げる役割は、Fast Refreshの有効化(React 16.9以上)、自動JSXランタイムの使用、インストールサイズの小ささの3つです。

開発サーバーを起動してコンポーネントの配信内容を見ると、プラグインが差し込んだ var _s = $RefreshSig$(); が入っています。これがFast Refreshの仕掛けです。プラグインを外した設定で同じファイルを配信させると、JSXはVite本体が変換するものの、$RefreshSig$ もHMRの登録も入らず、編集のたびにページ全体の再読み込みになります。v6ではこの変換をVite 8に内蔵されたRust製ツールチェーンのOxcが担います。Viteの公式プラグイン一覧も、plugin-reactを「Oxc TransformerでReact Fast Refreshを提供する」と説明しています。

Babelが外れた効果はインストールサイズに出ます。Vite 8.3.5を入れたプロジェクトに追加すると、5.2.0は49パッケージ・約17.3MB(うち @babel 配下が19個)、6.1.2は2パッケージ・約244KBでした。React Server Componentsを扱う場合は、これとは別の @vitejs/plugin-rsc を使います。

@vitejs/plugin-react のインストールとvite.config.ts設定

既存ViteプロジェクトへのReactプラグイン追加

開発依存として入れ、plugins 配列に react() を足します。npm create vite@latest で作ったプロジェクトなら、この状態がすでに出来上がっています。

npm install -D @vitejs/plugin-react
# pnpm の場合
pnpm add -D @vitejs/plugin-react
// vite.config.ts
import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [react()],
})

v6.1.2の動作条件は、Vite 8系、Node.js 20系の20.19.0以降または22.12.0以降です(npmの engines は ^20.19.0 || >=22.12.0)。plugin-react単体のNode.js要件はv5から変わっていません。ただし、後述のBabel構成で使う @rolldown/plugin-babel 0.2.4はNode.js 22.12.0以降を要求するため、Node.js 20系では同じ構成の動作要件を満たしません。

create-viteによるReactプロジェクトの新規作成

ゼロから作るならテンプレートを使います。create-vite 9.3.1で選べるReact系は react-ts・react・react-compiler-ts・react-compiler の4つです。

npm create vite@latest my-app -- --template react-ts
cd my-app
npm install
npm run dev

注意したいのが、以前の記事でよく見る --template react-swc-ts です。SWC版のテンプレートはcreate-vite 9.0.0(2026-03-12)で削除されました。いまこの名前を渡すと、エラーも警告も出ずに素のTypeScriptプロジェクト(src/main.ts と counter.ts)が作られます。Reactが入っていないことに後から気づくことになるので、テンプレート名は上の4つから選びます。

react-tsで作ると、package.jsonは @vitejs/plugin-react ^6.1.2、vite ^8.3.4、react ^19.3.1、typescript ~6.0.3 で、リンターはESLintではなくOxlintが入ります(create-vite 9.1.0から。--eslint でESLintに戻せる)。プロジェクト構成やTypeScript 7との組み合わせはVite + Reactの環境構築手順で扱っています。

plugin-reactの主要オプションと既定値

変換対象・JSX・Fast Refreshを調整する主要な5項目は次のとおりです。

オプション 既定値 使う場面
include .js .jsx .ts .tsx .mdx にもFast Refreshを効かせる
exclude /node_modules/ Workerや非Reactの .tsx を外す
jsxImportSource tsconfigの値 Emotionなどを使う
jsxRuntime automatic 旧来のclassicに戻す
reactRefreshHost なし Module FederationでHMRを共有

このほか6.1.0から compiler が加わりました(後述)。READMEは、Fast Refreshを正しく動かすにはファイルからReactコンポーネントだけをexportするよう求めています。定数を一緒にexportするファイルは、値が変わるたびにモジュールごと再読み込みになります。

@vitejs/plugin-react の最新バージョンと対応するVite

メジャー版ごとに対応するViteが違うため、プラグインだけを上げると壊れることがあります。peerDependenciesをnpmレジストリから引いた結果は次のとおりです。

系列 最終版(公開日) 対応Vite 変換
6.x 6.1.2(2026-10-05) 8 Oxc
5.x 5.2.0(2026-03-12) 4.2〜8 Babel
4.x 4.7.0(2025-07-18) 4.2〜7 Babel

5.xでVite 8に対応したのは最終版の5.2.0だけで、5.1.4までの対応は4.2〜7です。v6の公開後に入った主な変更はCHANGELOGにあり、6.0.4で NODE_ENV=production のまま vite dev を動かしたときの $RefreshSig$ is not defined を修正、6.1.0でネイティブのReact Compilerを追加、6.1.2で複合コンポーネント(export const Accordion = { Root, Item } の形)のHMRを修正しています。GSCでは「4.3.4」のような古い版番号での検索もありますが、4.3.4は2024年11月にVite 6対応を足した版で、いまから選ぶ理由はありません。最新値はnpmのパッケージページか npm view @vitejs/plugin-react version で確認できます。

v5からv6へ上げるときに壊れる箇所(Vite 8移行)

plugin-react v6とVite 7の依存関係の不一致

v6のpeerDependenciesは vite: ^8.0.0 だけです。Vite 7.3.7のプロジェクトで npm install -D @vitejs/plugin-react@6 を実行すると、ERESOLVE unable to resolve dependency tree で止まりました。Vite 8へ上げられない事情があるなら、@vitejs/plugin-react@5 を指定すれば5.2.0が入ります。Vite 8そのものの変更点(Rolldownへの一本化など)はVite 8.3の変更点を参照してください。

react({ babel })の廃止と設定の無視

v6で最も見落としやすいのがこれです。v5まで書けた react({ babel: { plugins: [...] } }) を残したままv6にすると、vite build はエラーも警告も出さずに成功し、指定したBabelプラグインだけが効かなくなります。試しにbabel-plugin-react-compilerを未インストールのまま指定してもビルドは通ったので、設定そのものが読まれていません。

気づける場所は型チェックです。create-viteのテンプレートは npm run build が tsc -b && vite build なので、vite.config.ts に TS2353: Object literal may only specify known properties, and 'babel' does not exist in type 'Options' が出て止まります。vite build を直接呼ぶCIや、設定ファイルが .js のプロジェクトでは、この安全網がありません。

Babelプラグインの@rolldown/plugin-babelへの移行

Babelでしか書けない変換(styled-componentsの表示名付与や提案段階の構文など)が残っているなら、@rolldown/plugin-babel を並べます。CHANGELOGが示す書き換えは次の形です。

npm install -D @rolldown/plugin-babel @babel/core@7 @types/babel__core @babel/plugin-proposal-throw-expressions@7
import babel from '@rolldown/plugin-babel'
import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [
    react(),
    babel({ plugins: ['@babel/plugin-proposal-throw-expressions'] }),
  ],
})

もう1つの変更が react と react-dom の自動dedupeの廃止です。ただしこれはv5.0.0で入った変更で、v4から一気に上げる場合に影響します。同じReactが2つ読み込まれて「Invalid hook call」が出るなら、まずpackage.jsonのバージョン不一致を疑い、必要なら resolve.dedupe に自分で書きます。

React Compilerを @vitejs/plugin-react で有効にする2つの方法

React Compilerは useMemo・useCallback の手書きを不要にする自動メモ化ツールで、babel-plugin-react-compiler 1.0.0が2025年10月7日に公開されています。plugin-react v6での有効化は、Rust版とBabel版の2通りです。

Rust版:react({ compiler: true })(6.1.0から・実験的)

6.1.0で、oxc-transform-react(React CompilerのRust移植)を使う compiler オプションが入りました。READMEは実験的な機能だと明記しています。

npm install -D oxc-transform-react
import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [react({ compiler: true })],
})

インストールには罠が1つあります。6.1.2が求めるのは oxc-transform-react の ^0.152.0 で、0系のキャレットなので0.152.xしか合いません。npmのlatestは0.155.0(2026-10-19)ですが、今回のnpm 11.17.0の検証では、版を付けずに入れると0.152.0が選ばれ、インストールに成功しました。@latest を付けると ERESOLVE could not resolve で失敗しました。入れ忘れたまま compiler: true にすると、ビルドは React Compiler requires the optional `oxc-transform-react` package. で止まるので、こちらは気づけます。

compiler にはReact Compilerの設定も渡せ、react({ compiler: { compilationMode: 'annotation' } }) とすれば "use memo" を書いたコンポーネントだけが対象になります。6.1.2で compiler.logDiagnostics は非推奨になり、compiler.reportDiagnostics へ置き換わりました。

Babel版:reactCompilerPreset と @rolldown/plugin-babel

npm create vite@latest -- --template react-compiler-ts が生成するのはこちらの構成で、React公式のインストール手順もこの書き方を案内しています。

npm install -D @rolldown/plugin-babel @babel/core@7 @types/babel__core babel-plugin-react-compiler
import babel from '@rolldown/plugin-babel'
import react, { reactCompilerPreset } from '@vitejs/plugin-react'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [react(), babel({ presets: [reactCompilerPreset()] })],
})

@babel/core を7系に固定しているのには理由があります。npmのlatestは8.0.9で、@rolldown/plugin-babel 0.2.4のpeerもBabel 8を許すため、版を付けずに入れると8系が入ります。8.0.9の環境で function Def({ step = 1 }) のように既定値付きの分割代入でpropsを受けるコンポーネントは、警告なしでコンパイル対象から外れました。テンプレートと同じ7.29.7に戻すとコンパイルされ、Rust版はどちらでもコンパイルされます。react() と babel() の並び順はどちらにしても結果は同じでした。

実測:500コンポーネントのビルド時間と出力

useStateと配列の絞り込みを持つ小さなコンポーネントを500個作り、Vite 8.3.5・plugin-react 6.1.2で vite build を3回ずつ実行しました(Intel Core i9-9880H・Node.js 26.5.0)。

構成 ビルド時間 出力JS
Compilerなし 0.30〜0.34秒 378,232バイト
Rust版 compiler: true 0.49〜0.51秒 600,170バイト
Babel版(@babel/core 7.29.7) 6.77〜6.79秒 600,170バイト
Babel版(@babel/core 8.0.9) 8.65〜10.11秒 600,170バイト

今回の入力では、Rust版とBabel版の出力JSがSHA-1まで一致しました。メモ化のぶん出力は約1.6倍に増えますが、これはどちらの経路でも同じです。ビルド時間はBabel 7版がRust版の約13〜14倍でした。別の入力や設定で出力が一致する保証にはならない点は差し引いて読んでください。

Rust版とBabel版の選び方

実験的機能を評価できる新規プロジェクトなら、今回の入力で出力が一致し、ビルド時間が短かったRust版を先に試すことを勧めます。反対に、compiler: true を避けるべきなのは、本番のビルド結果を安定させたいプロジェクトで「実験的」の表記を受け入れられない場合と、React Compiler以外のBabelプラグインもどのみち通す構成の場合です。後者はBabelをすでに回しているので、プリセットを1つ足すほうが構成が単純になります。React Compilerがどのコードをメモ化しないかの規則はReact Compilerの仕組みと導入方法にまとめています。

@vitejs/plugin-react と plugin-react-swc の違いと選び方

SWC版の @vitejs/plugin-react-swc(最新4.3.3・2026-07-30)は、開発時の変換をOxcではなくRust製コンパイラのSWCで行う公式プラグインです。SWCはBabelの代わりとして作られたJavaScript/TypeScriptのコンパイラで、Next.jsの内部でも使われています。

項目 plugin-react plugin-react-swc
最新版 6.1.2 4.3.3
開発時の変換 Oxc SWC
対応Vite 8 4〜8
React Compiler compiler オプション リリース版には無し
週間DL(10/16〜22) 約6,334万 約593万

Vite 7以前は「Babelより速いFast Refresh」がSWC版を選ぶ理由でしたが、v6でplugin-reactもRust製のOxcで変換するようになり、この理由は無くなりました。vite.devはSWC版を「SWCプラグインを使うために、開発時にOxcをSWCへ置き換える」ものと説明しています。本番ビルドでSWCが動くのは、SWCプラグインを指定した場合と、4.2.0以降で useAtYourOwnRisk_mutateSwcOptions を指定した場合です。GitHubのmainブランチのREADMEは、ほとんどの用途は標準のplugin-reactで足りるとして、そちらを推奨しています。

結論として、新規プロジェクトは標準版です。SWC版を選ぶのは、@swc/plugin-* などのSWCプラグインを開発時にも通したい場合、useAtYourOwnRisk_mutateSwcOptions でSWC固有の変換オプション(デコレーターの版指定など)を変えたい場合、Vite 7以前に留めながらBabelを避けたい場合の3つです。もう1つの @vitejs/plugin-react-oxc は、plugin-react 5.0.0がrolldown-viteでOxcを使うようになった時点で非推奨になっており、対応Viteも6.3〜7のままです。Viteの次の形として出てきた統合ツールチェーンについてはVite+の使い方と既存Vite案件の移行手順を参照してください。

vanilla-extractと@vitejs/plugin-reactの併用設定

スタイルをTypeScriptで型付きに書く場合は、@vanilla-extract/vite-plugin(最新5.2.6・対応Vite 5〜8)を同じ plugins 配列に並べます。Vite 8.3.5・plugin-react 6.1.2の組み合わせでビルドが通ることを確認しました。

npm install -D @vanilla-extract/vite-plugin @vanilla-extract/css
import react from '@vitejs/plugin-react'
import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [react(), vanillaExtractPlugin()],
})

スタイルは .css.ts ファイルに書き、エクスポートしたクラス名をコンポーネントの className に渡します。

// src/styles.css.ts
import { style } from '@vanilla-extract/css'

export const button = style({
  padding: '8px 16px',
  backgroundColor: '#2563eb',
  color: '#fff',
})

ビルドすると ._3sgu7w0{color:#fff;background-color:#2563eb;padding:8px 16px} のような静的CSSになり、実行時のスタイル計算は残りません。クラス名はファイルごとに一意化されるので名前の衝突も起きません。小さな画面ならCSS Modulesで足り、デザイントークンを複数のパッケージで共有する規模になってから型の恩恵が効いてきます。Vite + ReactでWebアプリを作る段階から設計を相談したい場合は、一創のフルスクラッチ開発でも対応しています。

よくある質問

@vitejs/plugin-react のインストール方法は?

npm install -D @vitejs/plugin-react で入れ、vite.config.ts の plugins に react() を書きます。新規なら npm create vite@latest my-app -- --template react-ts で設定済みのプロジェクトができます。v6はVite 8系と、Node.js 20.19.0以降の20系または22.12.0以降が必要です。

@vitejs/plugin-react の最新バージョンはいくつですか?

2026年10月時点で6.1.2(2026-10-05公開)です。Vite 7以前を使っているなら、対応する最後の版は5.2.0です。npm view @vitejs/plugin-react version で手元から確認できます。

plugin-react と plugin-react-swc はどちらを使うべきですか?

新規なら標準の @vitejs/plugin-react です。v6の標準版はOxcで変換するため、Babelを避ける目的だけでSWC版を選ぶ必要はありません。SWC版は、SWCプラグインを開発時にも使いたい場合に選びます。

Vite 8にしたら react({ babel }) のBabelプラグインが効かないのはなぜですか?

v6で babel オプションが廃止されたためです。指定してもビルドはエラーなく通るので気づきにくく、tsc の型チェックでTS2353として出ます。Babelプラグインは @rolldown/plugin-babel へ、React Compilerは react({ compiler: true }) か reactCompilerPreset() へ書き換えます。

@vitejs/plugin-react-oxc は使う必要がありますか?

ありません。plugin-react 5.0.0がrolldown-viteでOxcを使うようになった時点で非推奨になり、対応Viteも6.3〜7のままです。Vite 8では標準のplugin-reactがOxcで変換します。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.27 テックブログ Brotli 脆弱性:CVE-2026-111497の影響確認とNode.js・Python・.NETの更新手順
  2. 2026.10.28 テックブログ リンツ不正アクセス:314万件の対象確認とパスワード強制リセット後の対処
  3. 2026.10.27 テックブログ Joshin(ジョーシン)不正アクセス:最大600万件の対象とサブスク初期パスワードの対処
  4. 2025.02.27 コラム トラッキングビーコン(Webビーコン)とは?仕組み・用途・確認と対策を徹底解説
  5. 2026.10.23 テックブログ Renta!はいつ再開?不正アクセスでメールアドレス等が流出したおそれ・再開時のパスワード再設定と運営側の対応

RELATED POSTS 関連記事

目次