JavaScriptランタイムBunのサポート
RailsにおけるJavaScriptランタイムといえば、Node.jsが定番でした。Rails 7.0においてフロントエンド開発環境が刷新されて、非Node.jsなアプリケーション開発が可能になりましたが、全てが置き換えられるわけはなく、依然としてJavaScriptランタイム環境が必要な状況は残っています。
このJavaScriptランタイムに、Rails 7.1では新たにBunを選択できるようになりました。Bunとは、Node.jsの代替を目指したJavaScriptランタイム環境とツールキットです。公式サイトによると、以下のような特長を備えているとされています。
- 高速である(公式サイトによるとDenoの2倍以上、Node.jsの5倍以上、高速)
- APIが充実している(Node.jsのAPIなど)
- 完全なツールキット(パッケージマネジャー、テストランナー、バンドラーを含む)
基本的には、Bunは既存のランタイムを置き換えるためのものであるので、その速度が最大のメリットと言えそうです。本稿作成時点でバージョン1.0.8がリリースされており、安定リリースに入っています。
[NOTE]Bunの名称の由来
Bunの名称は、バンドラー(Bundler)から来たといわれています。また、ロゴにもなっている中華まん(Bun)から来たともいわれています。なぜ中華まんかというと、さまざまなライブラリやツールを全て包み込むからということのようです。
Bunを使ってアプリケーションを動作させるには、まずはオペレーティングシステムにBunがインストールされている必要があります。サポートされるOSはmacOS、Linux、WSL(Windows Services for Linux)ということなので、Windows環境で利用したければWSLのインストールが必要です。公式ページにインストール用のコマンドがありますので、それをターミナル等で実行してインストールしてください。
アプリケーションの作成時には、-jあるいは--javascriptオプションを与えます。このオプションはJavaScriptアプローチを指定するもので、既定値はポートマッパーであるportmapです。これにbunを指定することで、アプリケーションがBunを使うように構成されます。
% rails new bun_app --javascript=bun
アプリケーション作成で、アプリケーションのルートにはエントリポイントや出力ディレクトリが記載される設定ファイルであるbun.config.jsが作成されます。また、package.jsonファイルにはビルド時に実行されるbuildコマンドとパッケージの依存関係が記述されます。node_modulesディレクトリも依然として存在し、パッケージのインストールもbun installコマンドで行えるなど、利用感はNode.js等と大きく変わることなく移行もスムーズに行えそうです。
自動読み込みのための拡張メソッドの追加
Rails 7.1では、config.autoload_libメソッドが導入されました。このメソッドは、デフォルトではアプリケーションの自動読み込みパスに含まれていないlibディレクトリを、config.autoload_pathsとconfig.eager_load_pathsに追加するために利用されます。
自動読み込みとは、アプリケーションのクラスやモジュールをrequireなしに行えるようにする仕組みで、コードの簡略化に役立ちます。例えばモデルのPostクラスを使うからといって、require Postとソースの先頭に記述する必要はないのです。
この自動読み込みパスの既定は、app下の全てのサブディレクトリ(assets、javascript、viewsは除く)などですが、ライブラリのディレクトリであるlibは含まれていません。autoload_libメソッドによってlibディレクトリを自動読み込みパスに含めることができ、自作したクラスや、サードパーティー製のライブラリなどもrequireなしに使えるようになります。
autoload_libメソッドは、config/application.rbに以下のように既定で記述されています。config/environments/*.rbにも記述できます。なお、エンジン(ミニチュア版のRailsアプリでプラグインのように機能する)には記述できません。
config.autoload_lib(ignore: %w(assets tasks))
ignoreパラメーターは、lib内で除外するディレクトリです。この場合は、assetsとtasksをそれぞれ除外します。いずれも.rbファイルを含まないので、読み込み対象にしても意味がないからです。このように、lib内にあるが.rbファイルを含まないディレクトリは、このリストに明示的に加える必要があります。
この他にconfig.autoload_lib_onceメソッドも使えるようになりました。このメソッドはautoload_libメソッドと似ていますが、libディレクトリをconfig.autoload_once_pathsに追加する点が異なります。config.autoload_once_pathsは、自動読み込みするが再読み込みはしないコードの保存場所を保持します(既定では指定なし)。再読み込みすると不都合なコード(ActiveJobのジョブ登録など)を含むディレクトリは、config.autoload_pathsではなくconfig.autoload_once_pathsに含むことになっています。
