はじめに
Rails 7を始めると、importmapやesbuildといった新しい言葉が出てきて、「一体何が違うの…?🤔」と混乱しがちです。
さらに、Viewで使うjavascript_importmap_tagsとjavascript_include_tag、どちらが正解なのか分からなくなることも。
今回は、この2つのJS管理方法の違いを、料理に例えながら、誰でも分かるように解説します。この記事を読めば、もう迷うことはありません!
例えるなら「料理」の提供方法の違い
importmapとesbuildの違いは、レストランでお客さんに料理を出すまでの段取りの違いと考えるとスッキリします。
🍽 importmap は「ビュッフェ方式」
importmapは、お客さん(ブラウザ)に「メニュー表」を渡すようなものです。
-
お店(Rails): 「メニュー表(
config/importmap.rb)に、うちで使えるJSライブラリの一覧と、それが置いてある場所(URL)を書いておきますね」 -
お客さん(ブラウザ): 「なるほど。じゃあこのメニュー表(
importmap)を見て、僕が必要なJSを、必要なタイミングで直接取りに行きますわ」
つまり、JSファイルを事前に一つにまとめたりはせず、ブラウザが直接JSを読み込みに行きます。
-
Viewで使うタグ:
= javascript_importmap_tags(メニュー表を渡すための命令) - メリット: 事前の調理(ビルド)が不要なので、手軽でシンプル。
- デメリット: 色々なJSを頼むと、ブラウザがたくさん通信しないといけない。
🍱 esbuild は「お弁当箱方式」
一方のesbuildは、凄腕の料理人(esbuild)が、事前に最高の「お弁当箱」を作ってくれるようなものです。
-
料理人(esbuild): 「お客さんから注文が入る前に、サイトで使うJSやCSSを全部集めて、最適化しながら一つのファイル(お弁当箱)に詰めておきますね! これが
app/assets/builds/application.jsです」 - お店(Rails): 「ありがとう!じゃあお客さん(ブラウザ)には、この完成品のお弁当箱をドンと渡すだけで済むね」
-
お客さん(ブラウザ): 「このお弁当箱(
application.js)一つ受け取るだけで、全部入ってて助かる〜!」
BootstrapやReactなど、色々なJSライブラリ(おかず)を事前に調理・箱詰め(バンドル)して、完成品をブラウザに渡します。
-
Viewで使うタグ:
= javascript_include_tag "application"(完成したお弁当箱を渡すための命令) - メリット: 事前に最適化されているので高速。通信も1回で済む。多くのJSライブラリに対応できる。
- デメリット: 事前に調理(ビルド)する一手間が必要。
まとめ
プロジェクトにpackage.jsonがあり、BootstrapやReactのようなnpmパッケージを管理している場合、それは高機能な**esbuild(お弁当箱方式)**を採用している可能性が高いです。その場合、Viewで使うべき命令はjavascript_include_tag "application"です。
逆に、config/importmap.rbでライブラリを管理しているなら、javascript_importmap_tagsを使います。
この2つを混在させてしまうとエラーの原因になるので、自分のプロジェクトがどちらの方式なのかを理解しておくことが重要です。
| 項目 | importmap-rails | jsbundling-rails (esbuild) |
|---|---|---|
| 例えるなら | ビュッフェ方式 | お弁当箱方式 |
| 処理方法 | ブラウザが直接JSを取得 | 事前にJSを一つのファイルにまとめる |
| 設定ファイル | config/importmap.rb |
package.json の build スクリプト |
| Viewのタグ | javascript_importmap_tags |
javascript_include_tag "application" |
| 特徴 | ビルド不要でシンプル | 高速で高機能。npmパッケージと相性◎ |
おわりに
Rails 7のJavaScript周りは少し複雑に見えますが、この「ビュッフェ」と「お弁当箱」のイメージを持っておけば、エラーが出た時も原因を特定しやすくなるはずです。
この違いを理解することは、モダンなRails開発を乗りこなすための大きな一歩になるでしょう!