Ruby on Rails 7 Alpha 1、Alpha 2が立て続けにリリースされました。
Rails 7.0 Alpha 1: New JavaScript Answers, At-Work Encryption, Query Origin Logging, Zeitwerk Exclusively
https://t.co/P6kq1baBjl— Ruby on Rails (@rails) September 15, 2021
今回のRails 7 Alphaでは、GItHubのリリースタグ↓にChangelogがありません。代わりにRails 7 Alpha 1リリースノートの翻訳を掲載いたします。
- Release v7.0.0.alpha1 · rails/rails(2021/09/16 06:55 -- 日本時間)
- Release v7.0.0.alpha2 · rails/rails(2021/09/16 08:14 -- 日本時間)
詳しくは以下のコミットリストやAlphaプレビュー動画をご覧ください。
- コミットリスト: Comparing v6.1.4.1...v7.0.0.alpha2 · rails/rails
- YouTubeチャンネル: David Heinemeier Hansson - YouTube
Rails 7.0 Alpha 1: JavaScriptへの新回答、実行時暗号化、クエリ生成元のログ出力、Zeitwerk一元化
Rails 7の最初のAlpha版リリースにようこそ。このリリースには、JavaScriptの扱いに関するきわめてエキサイティングな新回答、Active Recordの実行時暗号化への目覚ましいアプローチ、SQLクエリ生成元のログ出力、非同期クエリ読み込み、オートローディングのZeitwerk一元化、他にも多くの機能が盛り込まれています。
通常であればRailsのAlpha版をリリースすることはありませんが、フロントエンドの新しいアプローチが非常に抜本的な変更を伴うことを考慮し、通常の「Beta版->リリース候補版->最終版」というフローに乗せる前にもう少し検証を進めておくのがベストと考えました。
今年中にRails 7最終版をリリースできるよう、新機能のテストにどうかご協力をお願いいたします。
フロントエンドに関する新しい回答のすべて
これまで5年近くに渡り、RailsでモダンなJavaScriptを書くためのデフォルトの回答はWebpackerでしたが、次の段階に進むときが来ました。ブラウザでのES6やESMサポート強化、HTTP/2の普及、そしてimport mapsというエキサイティングな新標準が登場したことによって、Rails 7のJavaScriptをNodeに依存しないアプローチへの道が開かれました。しかもnpmパッケージの利用を諦めずにです。
従来のTurbolinksとRails UJSが、StimulusとTurboを組み合わせたHotwireに置き換えられたことで、優れたRailsアプリケーションを書くためのかつてないほど完成度の高いフロントエンド向け詰め合わせセットアップを実現しました。node_modules
ディレクトリに数千個ものnode依存関係を置く必要もモジュールバンドラーの設定で苦しむこともなくなり、JavaScript開発にありがちな困難から解放されます。
それと同時に、Railsで「JavaScript + CSSバンドラー」を必要とする方向けに、両者の統合も劇的に改善されました。rails new
で2つの新しいコンパニオンgemを-javascript [bundler]
オプションや-css [bundler]
オプションで有効にすることで、import mapsを用いた新規アプリケーションの作成時や変更時に、esbuild、rollup.js、Webpack、Tailwind CSS、PostCSS, Dart Sass、Bootstrapを簡単に使えるようになります。
Active Recordの実行時暗号化機能
HEYから切り出されたActive Recordの属性暗号化機能を追加しました。これにより、従来の保存時(at-rest)および通信時(in-transit)の暗号化に加えて、実行時(at work)1の暗号化機能もアプリケーションで提供できるようになります。
これによってただちに得られる実用上のメリットのひとつは、機密属性の暗号化によるセキュリティレイヤを追加できることです。たとえば、攻撃者がデータベースやデータベースのスナップショットやアプリケーションログにアクセスできたとしても、暗号化済みの情報を理解できなくなります。そうした犯罪者たちを考慮しないとしても、正当な理由でアプリケーションログを確認するときに顧客の個人情報が露出せずに済みます。
しかしより重要な点は、Active Record暗号化を用いてアプリケーション内の機密情報をコードレベルで定義できることです。これにより、機密情報へのアクセス方法をコントロールすることも、その周辺にサービスを構築することも可能になります。例として、暗号化済みデータを保護する「監査可能な」Railsコンソールや、コントローラのparamsを自動的にフィルタする組込みシステムのチェックを想像してみてください。
詳しくはedgeguidesで暗号化属性の利用法に関する完全なガイドを参照してください。
Marginalia gem方式のタグ付けによるクエリ生成元のトレース
10年ほど前にBasecampから切り出されたMarginalia gemは、SQLコメントにタグ付けすることでクエリ生成元をトレースします。この外部gemがQueryLogs
クラスに昇格してActive Recordに取り込まれました。
非同期クエリ読み込み
コントローラのアクションで、互いに関連のない2つのクエリを読み込む必要があるときに、Relation#load_async
で同時に実行できるようになりました。実行に100msかかる複雑なクエリが3つある場合、これまでは300msかけて1つずつ実行していました。これらのクエリがパラレル実行可能になり、3つのクエリにかかる時間は合計100msで済みます。
Zeitwerk一元化
Railsのオートローディング機能は魔法のようなクオリティオブライフ(QOL)を実現する機能のひとつであり、あるのが当然と思われがちなほどです。かつて信頼を寄せられていたconst_missing
によるアプローチは、動作が気まぐれで機能も不足していましたが、Zeitwerkコードローダーへの一元化という形で置き換えが完了しました。特に古いアプリケーションではアップグレード時に注意しておきたい問題点がいくつかありますが、アップグレードガイドを読めばすぐにでも対応を開始できるでしょう。
その他のハイライト
- spring gemがデフォルトから外されました(コンピュータが高速になったことで大規模アプリケーション以外での必要性が下がったため)。
ActionController::Live#send_stream
は、コントローラのアクションでオンザフライ生成されるファイルを手軽にストリーミングできます。- パラレルテストが、CPUコア数とテスト数を比較した結果に応じてパラレル化をスケールするようになりました。
- Active Storageで、より高速かつセキュアな
libvips
がデフォルトのvariantプロセッサとして使われるようになりました。
私たちから皆さんへのメッセージ
昨年Rails 6.1をリリースして以来、3,000件を超えるコミットがRails 7に取り込まれました。これは数百人にのぼるコントリビュータたちによる成果です。その中には今年初めてコントリビュートした200人以上の新コントリビュータたちも含まれており、長年Railsのコードベースに手を加え続けてきた約6,000人のコントリビュータリストに彼らも名を連ねました。
関連記事
- at-work encryptionはHEY独自の用語のようです。詳しくはhttps://www.hey.com/security/を参照してください。本記事では「実行時」をat-workの仮訳としています。 ↩
概要
MITライセンスに基づいて翻訳・公開いたします。