はじめに
ふとjavascriptのディレクトリについていろいろいじっているときに「あれなんか2つある?」と不思議に思ったのでそれぞれどんな違いがあるのか気になったので調べてみたことをアウトプットしようと思います。
どんな状況だったのか
はい。上の画像のようにapplication.js
という名称のフォルダがjavascript
ディレクトリに2つ存在しているのがわかるかと思います。
はじめ、この2つの違いが判らず、GPTから「●●というコードをapplication.js
に追加することをおすすめします」というような提案?をえたときとりあえずでjavascript/application.jsにコードを追記していました。
application.jsが2つある理由
Railsが提供するアセットパイプライン1と、StimulusJS2を使ったモダンなJavaScript3の管理を分けているからになり、具体的に次のような違いが挙げられます。
1. app/javascript/application.js
- 役割: アプリケーション全体で使うJavaScriptの設定を行う場所で、UJSなどのライブラリをインポートして、アプリケーション全体のJavaScriptの初期化を行う
- 追加する内容: jQuery4やRails UJS5をここに加えるのが一般的
2. app/javascript/controllers/application.js
- 役割: StimulusJSのコントローラーを管理する場所で、特定のDOM要素6に対して動作するJavaScriptのコードを追加することができる
- 追加する内容: Stimulusのコントローラーをここに定義して、特定の機能を持たせることが主な目的
どちらに加えればいいか
-
UJSやjQueryは
app/javascript/application.js
に加えるのが正しい使い方。このファイルは、アプリ全体で共通して使う設定を行うための場所だから
さいごに
今回改めて調べてみて、まだ100%完全理解とまではいかないものの「アプリ全体に共通のJavaScriptはapplication.js
で定義し、特定の機能やインタラクションはcontrollers/application.js
で管理する感じ」というのがつかめました。まだまだみつのりは長い!!
-
アセットパイプライン:Railsで使用される仕組みで、JavaScriptやCSS、画像などのアセットを効率的に管理・配信するためのもの。これにより、アセットを結合、圧縮、キャッシュ可能にして、ページの読み込み速度を向上させることができる ↩
-
StimulusJS:Railsアプリケーションに特化した軽量のJavaScriptフレームワークで、HTMLのデータ属性を使って、簡単にインタラクティブな機能を追加できるように設計されている。これにより、JavaScriptのコードをHTMLに近い形で記述できる ↩
-
StimulusJSを使ったモダンなJavaScript:StimulusJSの機能を利用して、HTMLとJavaScriptを組み合わせて、クリーンでメンテナンスしやすいインターフェースを構築する方法のこと。これにより、アプリケーションの動的な部分を簡単に管理できるようになる。 ↩
-
jQuery:JavaScriptのライブラリで、DOM操作、イベント処理、Ajax通信などを簡単に行うためのもの。簡潔な文法で、ブラウザ間の互換性を意識せずにプログラミングできる点が特徴。 ↩
-
Rails UJS:Railsで使用されるUnobtrusive JavaScriptの略で、RailsアプリケーションにおけるAjaxや非同期通信を簡単に実装するための仕組み。これにより、ページをリロードせずにデータのやり取りが可能になる。 ↩
-
特定のDOM要素:HTML文書内の特定の要素のことを指す。たとえば、
div
やp
などのタグを使って、特定の位置に配置された要素のことを言う。 ↩