カテゴリー: FrontEnd

Rails 7でフロントエンド開発が大きく変わる

はじめに

12月15日にRails 7.0がリリースされました。今回の変更の中でおそらく一番大きな変更になるのは、フロントエンド周りで、Node.jsが(標準で)使われなくなった点ではないでしょうか。

今回は、そのあたりの経緯と新たに追加されたGemについて紹介します。

脱Node.jsの経緯

DHH氏のブログ「Modern web apps without JavaScript bundling or transpiling」によると、3つの理由が挙げられています。

  1. 主要ブラウザがES6をサポート
  2. HTTP/2の普及
  3. Import Mapsの存在

まず1つ目の理由は、主要なブラウザが軒並みES6をサポートした事により、ES6で書かれたコードをトランスパイルすることなく、そのまま動作するようになったことです。
2つ目の理由は、HTTP/2が普及したことにより、Webpackでファイルを結合するメリットが薄れたことです。

3つ目の理由は、Import MapsによりインポートするES Modulesをモジュール名だけで記述できるようになったことにより、コード上での管理が容易になったことです。

Rails 7.0でのアセット管理

Rails 7.0では、新たに4つのGemが登場します。これまでとは異なり、開発者はこれらのGemを自分のプロジェクトに合う組み合わせで採用することになります。

新たに追加されるGemは、propshaftimportmap-railsjsbundling-railscssbundling-railsです。これらを簡単に説明すると、propshaftsprocketsに替わるアセットパイプラインライブラリ。importmap-railsRails 7.0からのJavaScriptアセット処理のデフォルトとして採用されたライブラリ。jsbundling-railscssbundling-railsはどちらも、JavaScript(またはCSS)を任意のbundlerで扱うためのライブラリです。

propshaftimportmap-railsについては、後ほどもう少し詳しく紹介します。

importmap-railsjsbundling-railscssbundling-railspropshaft(もしくはsprockets)と併用する必要があります。

一般的には以下のような組み合わせで使われるのではないでしょうか。

  • propshaft(もしくはsprockets)+importmap-rails
  • propshaft(もしくはsprockets)+jsbundling-rails(+cssbundling-rails)
  • propshaft(もしくはsprockets)+webpacker(従来どおり)

propshaft

前述のとおり、propshaftsprocketsの替わりになるアセット管理ライブラリです。

propshaftは、必要なES Modulesファイルをファイル名にダイジェストを付けて出力先にコピーします。その際、トランスパイル、バンドリング、圧縮などは行わないため、sprocketsと比べて高速に動作します。

assets:precompileを呼ぶと、config.assets.pathsに設定されたすべてのパスのアセットがpublic/assetsにコピーされます。この際、sprocketsと同様にソースファイルは探査され、ファイル名にはダイジェストが付与されます。

また、asset-path("ファイル名")というCSS関数が用意されており、プリコンパイル時にurl("/assets/image-f2e1ec14d6856e1958083094170ca6119c529a73.svg")のように変換されます。

importmap-rails

Rails 7.0よりJavaScriptアセット処理のデフォルトとして採用されているライブラリです。バージョン管理されたファイルやダイジェスト版に対応した論理名で、ブラウザから直接JavaScriptモジュールをインポートすることができます。

import mapsは現在ChromeやEdgeなどの一部のブラウザでのみサポートされています。これら以外のブラウザで使用するには、shimが必要です。

<%= javascript_importmap_tags %>タグを使用することで、es-module-shimが読み込まれて使用できるようになります(この他にも、JSON設定のセットアップやapp/javascript/application.jsとのマッピングも行われます)

JavaScript CDN経由でのnpmパッケージの利用

importmap-railsでは、npmパッケージをJavaScript CDNから取得するようになっています。ここではプリコンパイルされた配布用バージョンが利用可能になっており、それらを高速に配信します。

npmパッケージのピン留め・解除・更新は、./bin/importmapコマンドで行えます。このコマンドはJSPM.orgのAPIでパッケージの依存関係を解決し、config/importmap.rbにファイルをピン留めします。コマンドの実行例は以下のようになります。

./bin/importmap pin react react-dom
Pinning "react" to https://ga.jspm.io/npm:react@17.0.2/index.js
Pinning "react-dom" to https://ga.jspm.io/npm:react-dom@17.0.2/index.js
Pinning "object-assign" to https://ga.jspm.io/npm:object-assign@4.1.1/index.js
Pinning "scheduler" to https://ga.jspm.io/npm:scheduler@0.20.2/index.js

./bin/importmap json

{
  "imports": {
    "application": "/assets/application-37f365cbecf1fa2810a8303f4b6571676fa1f9c56c248528bc14ddb857531b95.js",
    "react": "https://ga.jspm.io/npm:react@17.0.2/index.js",
    "react-dom": "https://ga.jspm.io/npm:react-dom@17.0.2/index.js",
    "object-assign": "https://ga.jspm.io/npm:object-assign@4.1.1/index.js",
    "scheduler": "https://ga.jspm.io/npm:scheduler@0.20.2/index.js"
  }
}

これで、以下のようにapplication.jsのエントリポイントから利用できるようになります。

import React from "react"
import ReactDOM from "react-dom"

さいごに

Rails 7.0からのフロントエンド開発環境の変更点を紹介しました。この他にも、Hotwireの変更もありRailsだけでもフロントエンド開発がやり易くなっているようです。

おすすめ書籍

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: RubyRails

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前