先日インストールまで済んだので、今回は実際にjsファイルをtsxに編集したり、reactで出力させる設定をしてみます。
application.js
まず、app/javascript/配下にある「application.js」をみてみます。
# app/javascript/application.js // Entry point for the build script in your package.json import "@hotwired/turbo-rails" import "./controllers"
コメントにあるとおり、application.jsはビルドされる JS ファイルのエントリーポイントとなるファイルです。
既にコントローラーと紐づけされています。
import "@hotwired/turbo-rails"
Hotwireとは、Rails 7で導入されたSPA的なWebページを開発するためのフレームワークです。
SPAとは、読み込んだWebページ上のスクリプトがサーバとの通信を行い、ページを遷移させずに必要なデータのみを更新させる方式です。
参照:シングルページアプリケーション 【SPA】 Single Page Application
HotwireはHTML Over The Wireの略で、TurboやStimulusなどのJavaScriptライブラリから構成されています。
今回はこの application.js にReactを載せていきます。
ルーティングを確認
config/routes.rb を確認します。
rails g controller home index を実行しているので、get 'home/index' が定義されています。
Rails.application.routes.draw do get 'home/index' # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html # Defines the root path route ("/") # root "articles#index" end
上記のルーティングでは、ルート(/)にアクセスすると、home コントローラーの index メソッドが呼ばれます。
view は、app/views/home/index.html.erbが描画されます。
application.html.erb
続いて、application.html.erb を編集します。
application.html.erbファイルは、Railsアプリケーションの全てのビューで共通して表示されるHTMLの骨組みを定義します。
このファイルを使用することで、アプリケーション全体の外観や共通のコンポーネントを一括で管理できます。
bodyに <div id="root"></div> を追加します。
# app/views/layouts/application.html.erb <!DOCTYPE html> <html> <head> <title>ReactTestApp</title> <meta name="viewport" content="width=device-width,initial-scale=1"> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> <%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %> </head> <body> <div id="root"></div> <%= yield %> </body> </html>
<div id="root"></div> は通常、JavaScriptフレームワークやライブラリが利用するための特定の要素です。
特に、React.jsやVue.jsなどのフロントエンドのライブラリやフレームワークでよく見られます。
これにより、RailsアプリケーションがクライアントサイドのJavaScriptと統合され、動的なユーザーインターフェースやSPAの開発が容易になります。
ReactやVueなどのライブラリは、HTMLのこの特定の要素内でアプリケーションを描画することが一般的です。
この要素には通常、JavaScriptコードによって生成された動的なコンテンツが表示されます。
要するに、<div id="root"></div> はクライアントサイドのJavaScriptがアプリケーションのビューを描画するための場所を指定しています。
アプリケーションがReactやVueを使用している場合、この要素はそれらのフレームワークによって管理され、動的なコンテンツがここに描画されます。
application.jsをapplication.jsxに変更
最初に確認した application.js について、 拡張子を変更しapplication.jsx とします。
あわせて、ファイルの中身もjsxでの記述に変更します。
# 4行目まで削除 // Entry point for the build script in your package.json import "@hotwired/turbo-rails" import "./controllers" import React from 'react'; import { createRoot } from 'react-dom/client'; function App() { return ( <h1>Hello React!</h1> ) } const root = document.getElementById('root'); if (!root) { throw new Error('No root element'); } createRoot(root).render( <React.StrictMode> <App /> </React.StrictMode> );
Reactのレンダリングを確認したいので、index.html.erbの内容を削除します。
(デフォルト記述されている以下の2行を削除し、空の状態にします。)
# app/views/home/index.html.erb <h1>Home#index</h1> <p>Find me in app/views/home/index.html.erb</p>
上記まで修正すると、root(/)へのアクセスでReactで作成されたページが表示されるようになります。
以降は、エンドポイントとなる application.jsx を起点にファイルを作成していくと良いそうです。
今回は以下の記事を参考に施策させていただきました。
とても勉強になりました、感謝いたします。
参照:Railsにesbuildを使ってReactを導入する(Dockerで構築)