🤖

Rust製のビルドツール【Farm】が気になる

に公開

はじめに

Bun に入門した際、ついでに気になっていた Farm にも手を出してみようと思い調べてみました。

なにやら、viteよりも高速だとか…

Farmとは

Farmは、webpackやViteのような極めて高速なRustベースのWebビルドツールです。JavaScriptやCSS、HTMLなどの各種アセットを解決・読み込み・変換し、デプロイ可能なファイルにバンドルします。

主な特徴

⚡ ビルドが高速

  • webpackより25倍以上速い
  • viteより4倍以上速い

Farmの公式でベンチマークが紹介されていました。

ちなみに「Rspack」なるバンドラーもRust製で結構速いみたい。
Rspack は、あの TikTok を運営している ByteDance 社が開発しているようです。

🔄 インクリメンタルビルド

  • 永続的キャッシュをサポート、デフォルトでモジュールレベルキャッシュが有効
  • 変更されていないモジュールは再コンパイルされない

🧰 プラグイン

  • Viteプラグインをそのまま使用可能
  • RustとJavaScriptの両方のプラグインをサポート

📦 部分的バンドリング

  • 依存関係とリソースサイズに応じて20-30個の小さなリソースにバンドル
  • キャッシュの粒度を失うことなく、最適なリソース読み込みパフォーマンスを実現

従来ツールとの比較

webpackとの違い

webpack

  • 豊富な機能と成熟したエコシステム
  • 大規模プロジェクトでのビルド時間が長い(10分以上)
  • HMR更新に10秒以上かかることも

Farm

  • Rust製で圧倒的に高速
  • 同等の機能をより短時間で提供
  • 一貫性のある開発・本番環境

Viteとの違い

Vite

  • 開発時は高速(ESMベース)
  • 大規模プロジェクトで大量のモジュールリクエストが発生
  • 開発と本番環境の不整合(esbuildとrollupの使い分け)

Farm

  • 開発・本番で一貫した動作
  • 部分的バンドリングによる効率的なリソース管理
  • モジュールリクエスト数の最適化

実際の使い方

プロジェクトの作成

# Reactプロジェクトの作成
bun create farm farm-app --template react

ここでは Bun でプロジェクトを作成していますが、他にも npm, yarn, pnpm でも作成できます。

基本的な設定

Farm の設定はfarm.config.tsで行います。
プロジェクトを作成すると勝手に生成されます。

farm.config.ts
import { defineConfig } from '@farmfe/core';

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

開発サーバーの起動

# 開発サーバー起動
bun run dev

# 本番ビルド
bun run build

プラグインエコシステム

公式プラグイン

  • @farmfe/plugin-react - React サポート
  • @farmfe/plugin-vue - Vue.js サポート
  • @farmfe/plugin-sass - Sass/SCSS サポート
  • @farmfe/plugin-less - Less サポート
  • @farmfe/plugin-postcss - PostCSS サポート

Viteプラグインの互換性

Farm v0.13以降、ViteプラグインをFarmで直接使用可能

// Viteプラグインの使用例
import { defineConfig } from '@farmfe/core';
import someVitePlugin from 'some-vite-plugin';

export default defineConfig({
  vitePlugins: [
    someVitePlugin()
  ]
});

対応フォーマット

FarmはHTML、CSS、CSS Modules、Js/Jsx/Ts/Tsx、JSON、静的アセットを標準でサポート

  • JavaScript/TypeScript (ES5〜最新)
  • React JSX/TSX
  • Vue SFC
  • CSS/Sass/Less
  • HTML
  • 静的アセット(画像、フォントなど)

Farmを採用すべきケース

適している場面

  • 大規模なWebアプリケーション
  • ビルド時間が課題となっているプロジェクト
  • 開発・本番環境の一貫性を重視する場合
  • モダンな開発体験を求める場合

慎重に検討すべき場面

  • 非常に小規模なプロジェクト
  • 既存のwebpack設定が複雑で移行コストが高い場合
  • チームがRustベースのツールに不慣れな場合

まとめ

調べてみた内容を簡単にまとめてみました。

  • 圧倒的な高速性: Rust製による高速なビルドとHMR
  • 一貫性: 開発・本番環境で同じ動作
  • 効率的なバンドリング: 部分的バンドリングによる最適化
  • 高い互換性: Viteプラグインの利用が可能

パフォーマンスが良いのはもちろん、viteとの互換性があるのは導入のハードルが低くて良いなと思いました。viteで作成した既存プロジェクトも簡単に移行できるのであれば検討の余地はありそう。

フロントエンド開発の生産性向上を求める方は、ぜひFarmを検討してみてください。

参考リンク

Discussion