JavaScript

Rust製ビルドツールFarm(farm-fe)とは?Vite 8と速度を実測比較・使い方と2.0の状況

Rust製ビルドツールFarm(farm-fe)とは?Vite 8と速度を実測比較・使い方と2.0の状況

この記事のFarmは、英単語の「農場」ではなく、フロントエンド開発で使うRust製のビルドツール「Farm(farm-fe)」です。ViteやWebpackと同じく、TypeScriptやReactのコードをブラウザで動く形にまとめます。2026年はVite 8がRust製バンドラRolldownへ移り、さらにVite 8.1で開発時にもバンドルするモードが実験的に入りました。Farmが売りにしてきた速さと部分的バンドリングがどこまで差になるのかを、Farm 1.7.11・2.0.0-beta.11・Vite 8.3.5を同じアプリで動かして確かめました。

まとめ:Farm(farm-fe)の要点と2026年の採否

  • Farmは、Rustで書かれたVite互換のWebビルドツールです。npmの安定版は @farmfe/core 1.7.11(2025年8月4日)のままで、2.0は2.0.0-beta.11(2026年5月28日)が最新のベータです。
  • 1,000コンポーネントのReactアプリで計測すると、本番ビルドはVite 8.3.5が451〜1,130ミリ秒、Farm 1.7.11が1,969〜3,305ミリ秒でした。Farm 2.0 betaは517〜690ミリ秒まで縮みましたが、8回中2回は応答が止まりました。
  • Farmが明確に勝ったのは開発サーバーの初回表示です(Farm 540〜745ミリ秒、Vite既定3,377〜3,763ミリ秒)。ただしViteの experimental.bundledDev を有効にすると424〜482ミリ秒になり、差は消えました。
  • Viteプラグインは vitePlugins に入れれば動くものがありますが、vite-plugin-svgr 5.2.0 はesbuildを別途入れないとビルドが失敗しました。
  • 新規プロジェクトの既定はVite 8で足ります。Farmを選ぶのは、Vite既定の開発サーバーで数千モジュールの初回表示が遅く、かつ実験的機能に頼りたくないときに限られます。

Farm(farm-fe)とは:Rust製でVite互換のビルドツール

Farmは、GitHubの farm-fe 組織が開発するMITライセンスのWebビルドツールです。開発用のTypeScript・JSX・CSSを変換・結合する処理をRustで実装し、プラグインの仕組みはViteに合わせています。リポジトリのスター数は2026年10月27日時点で5,601です。利用者がRustを書く必要はなく、設定は farm.config.ts(TypeScript)で行います。

2026年10月時点の状況は次のとおりです。いずれもnpmレジストリとGitHubで確認しました。

項目 内容
安定版(latest) @farmfe/core 1.7.11(2025-08-04)
1.0.0の公開 2024-03-14
2.0系 2.0.0-beta.0(2025-09-01)〜beta.11(2026-05-28)
mainの最終コミット 2026-06-14
Node.js要件 docs:16.18.0以上/engines:16.15.1以上
開発サーバーの既定ポート 9000

Node.jsの要件は、公式のQuick Startが「Node 16.18.0 and above」、1.7.11のpackage.jsonのenginesが「>=16.15.1」と食い違っています。どちらもFarm本体の下限です。本記事で併用するVite 8はNode.js 20.19以上の20系または22.12以上を要求するため、依存ツール全体の要件を満たすNode.jsを選んでください。安定版の更新は1年以上止まっており、開発の中心は2.0のベータに移っています。

Farmの仕組み:部分的バンドリング・遅延コンパイル・永続キャッシュ

部分的バンドリング(Partial Bundling)の既定値

Viteの既定の開発サーバーは、モジュールを1ファイルずつブラウザに配ります。変更の反映は速い一方、数千モジュールのページではリクエスト数が初回表示を遅くします。Farmは部分的バンドリングで、開発時も本番時もモジュールを複数の出力ファイルにまとめます。まとめ方はcompilation.partialBundlingで決まり、既定は同時リクエスト数の目標 targetConcurrentRequests が25、1ファイルの最小サイズ targetMinSize が20KB、最大サイズ targetMaxSize が1,500KBです。

実際に1,000コンポーネントのアプリを本番ビルドすると、Farm 1.7.11はコンポーネント群を500・393・107個の3ファイルに分け、React本体などを含めてJSを6ファイル出力しました。Vite 8.3.5は1ファイル(372,077バイト)にまとめました。

遅延コンパイルと永続キャッシュ

遅延コンパイル(Lazy Compilation)は、動的 import の先を実際に読み込まれるまでコンパイルしない機能で、開発時は既定で有効、本番ビルドでは常に無効です。永続キャッシュはREADMEのとおりv0.14から既定で有効で、compilation.persistentCache に false を指定すると切れます。永続キャッシュの既定の保存先は node_modules/.farm/cache です。

キャッシュの効き目は計測ではっきり出ました。1,000コンポーネントのアプリで開発サーバーの「Ready in」は、キャッシュを消した状態で933〜1,155ミリ秒、キャッシュありで399〜423ミリ秒でした。CIのようにキャッシュが残らない環境では前者の数字で見積もってください。

Farmのインストールと開発サーバーの起動

create-farmによるReactプロジェクトの作成

公式のひな形ツール create-farm(2026年10月時点の latest は0.0.21)でプロジェクトを作ります。テンプレート名とパッケージマネージャーは引数で渡せます。

npm create farm@latest my-app -- -t react -m npm
cd my-app
npm install
npm run dev

生成された package.json は dev と start がどちらも farm start、build が farm build で、開発サーバーは http://localhost:9000/ で起動しました。注意点として、0.0.21のReactテンプレートは react と react-dom を18に固定し、@farmfe/core も ^1.6.7 指定です。React 19で始めるなら、作成直後に npm install react@19 react-dom@19 @types/react@19 @types/react-dom@19 を実行してください。React 19.3.1に上げても、@farmfe/plugin-react 1.2.6でビルドと開発サーバーは問題なく動きました。

farm.config.tsの入出力・キャッシュ・バンドリング設定

設定ファイルはプロジェクト直下の farm.config.ts(.js・.mjsも可)です。入力と出力、キャッシュ、部分的バンドリングを明示すると次のようになります。値は公式のCompiler Optionsに載っている既定値です。

import { defineConfig } from '@farmfe/core';

export default defineConfig({
  compilation: {
    input: { index: './index.html' },
    output: {
      path: 'dist',
      targetEnv: 'browser-es2017',
      format: 'esm',
    },
    persistentCache: true,
    partialBundling: {
      targetConcurrentRequests: 25,
      targetMinSize: 20 * 1024,
      targetMaxSize: 1500 * 1024,
    },
  },
  plugins: ['@farmfe/plugin-react'],
});

FarmはESMとCommonJSを扱えます。両形式のパッケージが混在する構成では、ESMとCommonJSの違いと相互運用を押さえておくと、読み込みエラーの切り分けが早くなります。

ViteプラグインをFarmで使う:vitePluginsの書き方と落とし穴

Farm 1.xでは、Vite・Rollup・UnpluginのプラグインをトップレベルのvitePlugins(既定は空配列)に入れます。Farm用のプラグインを入れる plugins とは別の欄です。SVGをReactコンポーネントとして読み込む vite-plugin-svgr 5.2.0 で試しました。以下の設定例を動かす場合は、先に npm install -D [email protected] [email protected] [email protected] を実行してください。

import { defineConfig } from '@farmfe/core';
import svgr from 'vite-plugin-svgr';

export default defineConfig({
  plugins: ['@farmfe/plugin-react'],
  vitePlugins: [svgr()],
});

この設定で farm build を実行すると、Farm 1.7.11でも2.0.0-beta.11でも「Failed to load transformWithEsbuild. It is deprecated and it now requires esbuild to be installed separately.」で失敗しました。vite-plugin-svgr は、実行中のビルドツールがRolldownを持つ(Vite 8)と判定できれば transformWithOxc を、できなければ transformWithEsbuild を呼びます。Farmの上ではVite 8と判定されないため後者に進み、Vite 8.3.5がesbuildを同梱していないので落ちます。開発依存に esbuild(今回は0.28.2)を足すと、ビルドが通りSVGがコンポーネントとして出力されました。

もう1つの落とし穴は置き場所です。同じ svgr() を plugins 配列に入れると、エラーメッセージではなくRust側のpanic(「filters should be checked in js side」)でプロセスが止まりました。Viteプラグインは必ず vitePlugins に入れてください。

この2件から言えるのは、「Vite互換」はプラグインAPIの互換であって、Vite 8の実行環境まで再現しているわけではないということです。今回のようにVite側の実行環境を判定して処理を分けるプラグインもあるため、移行前に使っているプラグインを1つずつ farm build で通してください。Vite側のプラグインの土台はRollupとツリーシェイキングの仕組みで、Vite 8が変換に使うOxcはOxcの構成と使い方で解説しています。

Vite 8・Farmのビルド時間・初回表示・HMRの実測比較

2026年10月27日に、同じ合成アプリをFarmの安定版・ベータ版とViteの既定・bundledDevの4構成で動かしました。アプリは、1,000個のReactコンポーネントが二分木状に互いを import し、全部が1ページに描画されるものです。環境はIntel Core i9-9880H(macOS)、Node.js 26.5.0、npm 11.17.0、React 19.3.1。本番ビルドは各ツールが表示する所要時間を採りました。初回表示とHMRは別のブラウザ操作スクリプトで測り、複数回測定した項目は最小〜最大を載せています。同じMacで別の処理も動いていたため、数値には揺れがあります。これらは各構成で得られた参考値であり、出力ターゲットやソースマップなどを統一した性能比較ではありません。

本番ビルドの時間と出力

構成 ビルド時間 JSの出力
Vite 8.3.5 451〜1,130ms(3回) 1ファイル・372KB
Farm 1.7.11(キャッシュなし) 1,969〜3,305ms(3回) 6ファイル・529KB
Farm 1.7.11(キャッシュあり) 1,216〜1,670ms(3回) 同上
Farm 2.0.0-beta.11 517〜690ms(成功6回) 8ファイル・437KB

安定版のFarm 1.7.11は、キャッシュがあってもVite 8.3.5より遅い結果でした。Farm 1.7.11は実行時に使うランタイムを index.html に埋め込むため、index.html が82,019バイトになります。2.0 betaではランタイムが別ファイルになり、index.html は737バイトでした。

2.0 betaはビルド時間でViteと並びましたが、8回の実行のうち2回は「Using config file」を表示したまま60秒以上CPUを使わずに止まり、強制終了するしかありませんでした。ベータ版を本番のCIに入れられない理由としては十分です。

開発サーバーの初回表示とHMR

開発サーバーを起動し、ヘッドレスChromeでページを開いて1,000個目のコンポーネントが描画されるまでの時間と、ファイルを書き換えてから画面に反映されるまでの時間(HMR)を測りました。

構成 初回表示 リクエスト数 HMR
Vite 8.3.5(既定) 3,377〜3,763ms 1,011 97〜203ms
Vite 8.3.5(bundledDev) 424〜482ms 4 78〜173ms
Farm 1.7.11 540〜745ms 7 115〜257ms
Farm 2.0.0-beta.11 397ms(1回) 9 160〜283ms

Vite既定の開発サーバーは1,000コンポーネントを1,011リクエストで配り、初回表示に3秒以上かかりました。Farmが部分的バンドリングで解こうとしてきたのは、まさにこの問題です。ところがVite 8.1(2026年6月23日)で入った bundled dev mode(vite.config.ts の experimental.bundledDev: true)を有効にすると、リクエストは4本、初回表示は424〜482ミリ秒になり、Farm 1.7.11を上回りました。今回測った末端コンポーネントのHMRは、どの構成も0.3秒以内でした。体感差や、依存範囲の広いファイルを変更した場合の速度は、この測定では評価していません。

bundled dev mode は、Vite自身が「highly experimental」と型定義に書いている機能で、Vite 8.1の告知も「サードパーティのプラグインは動かない場合がある」としています。今回の合成アプリでは @vitejs/plugin-react と組み合わせて問題なく動きましたが、使っているプラグインが多い現場では個別の確認が要ります。それでも、初回表示の遅さだけを理由にViteからFarmへ移る判断は、2026年には成り立ちにくくなりました。

公式ベンチマークの読み方

FarmのREADMEにある「Viteより10倍速い」といった数字は、farm-fe/performance-compareの結果です。2026年10月時点のREADMEの表はFarm 1.3.22、Rsbuild 1.0.5、Vite 6.0.0-alpha、Webpack 5.91.0の比較で、ViteがRolldownを採用する前の版です。表ではFarm 1.3.22のbuildTimeが651ミリ秒、Vite 6.0.0-alpha(SWC)が1,260ミリ秒ですが、上の実測(Farm 1.7.11とVite 8.3.5)では順位が逆でした。過去の紹介記事では現在と異なる版を比較している場合があるため、速度の主張は比較相手の版を確かめてから読んでください。

Vite・Rspack・Rolldownとの違い

Rust製のビルドツールは、互換性の軸がそれぞれ違います。版と日付は2026年10月27日時点のnpmと各公式告知によります。

ツール 最新の安定版 互換の軸 向く現場
Farm 1.7.11 Viteプラグイン 部分的バンドリングを使いたい
Vite 8.3.5 Vite・Rollupプラグイン 新規プロジェクトの既定
Rolldown 1.2.15 Rollupプラグイン Viteの中核・ライブラリのビルド
Rspack 2.2.9 Webpack Webpack資産の移行

Vite 8.0(2026年3月12日)は、Rolldownを単一の統合バンドラとして採用しました。それまで開発時はesbuild、本番はRollupと分かれていた構成が一本になり、Farmが掲げてきた「開発と本番の挙動をそろえる」利点も、Vite側で縮まっています。Viteの導入手順と8系の変更点はVite + Reactの環境構築手順にまとめています。

Rspack 2.0(2026年4月22日)はコアパッケージをpure ESMにし、CommonJSビルドを削除しました。Webpackの設定とローダーを持ち越したい現場ではRspackが第一候補で、Farmの出番はありません。Next.jsならTurbopackが既定なので、Turbopackの設定と移行判断を先に読んでください。

Farm 2.0では、公式のv1からv2への移行ガイドが、開発サーバーのミドルウェアをKoaからconnect形式へ置き換えることと、出力形式にumd・iife・system・amdを足すことを挙げています。Koaのミドルウェアを書いている場合は、2.0の正式版で書き直しが要ります。

Farmを選ぶ条件と避ける場面

Farmを選んでよいのは、次の条件が全部そろうときです。Vite既定の開発サーバーで数千モジュールのページの初回表示が遅い。Viteの bundled dev mode が使っているプラグインと組み合わせて動かない、または実験的機能に頼る判断が社内で通らない。使っているViteプラグインが vitePlugins で全部ビルドを通る。この3つを満たすなら、Farm 1.7.11の部分的バンドリングは初回表示の遅さに効きます。

避けるべきなのは、ビルド時間の短縮が目的の場合です。今回の計測では安定版のFarm 1.7.11はVite 8.3.5よりビルドが遅く、速い2.0はベータで停止が起きました。安定版の更新が1年以上無いツールに長期保守のプロダクトを載せると、Node.jsやReactの更新に追随できなくなるリスクも抱えます。迷ったらVite 8で始め、初回表示が問題になってから bundled dev mode を試す順番が合理的です。Viteの周辺ツールを一本化したい場合はVite+のvpコマンドと移行手順も選択肢になります。

よくある質問

Farmとは何ですか?英語の「farm(農場)」とは違いますか?

ここでのFarmは、Rust製のWebビルドツールのプロジェクト名(farm-fe)で、読み方は英単語と同じ「ファーム」です。英語のfarm(農場)や、ビジネス用語のファームとは関係がありません。検索では一般語と混ざるため、ツールを調べるときは「farm-fe」や「@farmfe/core」で探すと公式情報に当たりやすくなります。

「Rust ファーム」はRust言語の機能ですか?

いいえ。Rustはプログラミング言語で、FarmはそのRustで書かれたビルドツールです。Farmを使う側はRustを書く必要がなく、npmでインストールして farm.config.ts をTypeScriptで書けば動きます。Rust製のJavaScriptツールには、ほかにコンパイラのSWCやOxc、バンドラのRolldown・Rspack・Turbopackがあります。

ViteもRust製になったのですか?

Vite 8.0(2026年3月12日)からは、バンドラにRust製のRolldownを使っています。Vite本体はJavaScript(TypeScript)で書かれたままで、重い処理をRolldownとOxcが担う形です。Go製のesbuildは任意のpeer依存に変わり、自動では入らなくなったので、Viteの transformWithEsbuild を呼ぶプラグインを使うときは esbuild を別途インストールします。esbuild自体の使い方はesbuildの使い方と採用判断で扱っています。

Farm 2.0の正式版はいつ出ますか?

2026年10月27日時点で、npmの latest タグは1.7.11(2025年8月4日)のままです。2.0はbeta.0が2025年9月1日、beta.11が2026年5月28日に公開されましたが、正式版はまだです。今回の計測では2.0.0-beta.11のビルドが8回中2回止まったため、正式版が出るまでは検証用にとどめるのが安全です。

Viteのプラグインはそのまま使えますか?

Farm 1.xではトップレベルの vitePlugins に入れれば使えるものが多いですが、そのまま動く保証はありません。vite-plugin-svgr 5.2.0は、esbuildを別途インストールするまでビルドが失敗しました。plugins 配列に入れるとpanicで止まるので、置き場所も間違えないでください。

関連記事

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

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

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

資料請求

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

  1. 2026.11.03 テックブログ クラブツーリズム不正アクセス:約432万件の対象確認と偽メールの見分け方・流出検知の設計
  2. 2026.11.04 テックブログ CVE-2026-119977:WordPress更新中のRCEと安全な更新手順
  3. 2026.10.29 テックブログ ソニー生命の情報漏洩38.5万件|ログインできない理由、再開状況と窓口の電話番号
  4. 2026.10.31 テックブログ 松屋の不正アクセス:237万件の対象確認と窓口、漏れたパスワードの守り方
  5. 2026.11.05 テックブログ Linuxカーネルの脆弱性CVE-2026-98432:修正版の見分け方とnftablesの緩和策

RELATED POSTS 関連記事

目次