このページは原文を AI が翻訳したものです。

最近、個人のRailsプロジェクトの1つをHotwireからViteとReact(Inertia.js経由)に移行しました。

Hotwireは純粋なRailsアプリケーションには最適ですが、この特定のプロジェクトでは、UIの反復作業とAIツールの活用が移行の決め手となりました。ここでは、その理由と実際のトレードオフについてお話しします。

移行した理由

1. 既製のコンポーネントライブラリ(shadcn/ui)

私はゼロからCSSを書くのが得意ではありません。Railsエコシステムで、洗練されたアクセシブルなUIコンポーネント(ダイアログ、ドロップダウン、コンボボックス)を構築するには、通常、カスタムのStimulusコントローラーとCSSを書くか、ViewComponentやPhlexのようなgemを使う必要があります。

Reactでは、shadcn/uiがRadix UIとTailwind CSSをベースにした、美しくデザインされたアクセシブルなコンポーネントを提供してくれます。必要なものをプロジェクトにコピーすれば、スタイリングはそのまま機能します。デザインに割ける時間が限られている個人開発では、CSSの試行錯誤に費やす時間を大幅に節約できます。

2. チャットでのライブAIプレビュー

最新のAIアシスタント(ChatGPT、Claude)は、Reactコンポーネントの生成と更新を、即座にインタラクティブなプレビュー付きで行うことに優れています。

HotwireとERBを使っていた頃の私の反復サイクルは次の通りでした:

  1. AIにERBとStimulusのコードを書いてもらう
  2. Railsプロジェクトにコピーする
  3. ブラウザをリフレッシュしてテストする
  4. 繰り返す

Reactとshadcn/uiを使うと:

  1. チャットでコンポーネントを説明する
  2. AIインターフェース内でレンダリングされたコンポーネントを直接確認する
  3. リアルタイムで反復・改良する
  4. 完成したコンポーネントをコードベースにコピーする

このより密なフィードバックループにより、フロントエンドのプロトタイピングが著しく高速化しました。

3. Viteによるキビキビした開発体験

Viteをvite-plugin-rubyと一緒に使うと、サーバーの起動が瞬時で、サブミリ秒のホットモジュールリプレイスメント(HMR)が実現します。Reactコンポーネントの変更は、ページ全体のリロードなしで即座にブラウザに反映されるため、フロントエンド開発中はかなりキビキビした感覚になります。

Inertia.jsが移行を容易にした理由

別のGraphQLやREST APIバックエンドを構築する代わりに、Inertia.js Railsを使いました。

Inertiaは接着層として機能します:Railsのルートとコントローラーはこれまで通り使い、ERBテンプレートをレンダリングする代わりにrender inertia: "Users/Index", props: { users: @users }を返します。これにより、アプリケーションのアーキテクチャをゼロから作り直すことなく、ページ単位で段階的に移行できました。

実際のトレードオフ

この切り替えにはデメリットもありました:

  • デプロイのオーバーヘッドimportmapsから移行するということは、DockerイメージやCI/CDパイプラインにNode.jsとビルドステップを導入することを意味します。
  • メンタルなコンテキスト切り替え:RubyのバックエンドオブジェクトとReactのフロントエンドコンポーネントの間で、状態管理を橋渡しする必要があります。
  • 増える可動部品:Vite、React、Tailwind、Inertiaの間で、単純に更新が必要な依存関係が増えます。

まとめ

Rails + Inertia + React + shadcn/uiは、私の最大の個人的ボトルネックを解決してくれました。それは、カスタムCSSに何日も苦労せずに、きれいでアクセシブルなUIを素早く作成することです。すでにCSSに精通している方や、バニラのHotwireで満足している方には、追加のビルド複雑性は価値がないかもしれません。しかし、リッチなUIコンポーネントを使った迅速なプロトタイピングには、この組み合わせは驚くほどよく機能します。

Epona
執筆Epona

There's nothing wrong with having a little fun

x.com/simura_epona

コメントを読み込み中…