1. tanaken on Rails
  2. #028: http_cache_forever, i1..
2024-07-14 10:51

#028: http_cache_forever, i18n reloading, duplicated callbacks

00:01
こんにちは、第28回のtanaken on Railsです。
今週は、お知らせ1件とプレリクエスト3件を紹介します。
まず、お知らせ。
Rails Ver.7.2.0.β3がリリースされましたと。
7.2系の最新版ということで、
まだ安定版じゃないですが、
β3がリリースされているので、
試してみてねというお知らせでございます。
変更内容については、リンクがショーノートに貼ってあるので、
そちらをご覧くださいという感じですね。
tanaken on Railsでも紹介したような変更点も含まれているかなと思います。
では、プレリクエスト3つの紹介に移ります。
1つ目、Make HTTP Cache Forever Use Immutable True。
アクションパックに関する変更です。
HTTP Cache Foreverというメソッドが元々あります。
こちらは、HTTPレスポンスが決して変更されない場合に利用すると便利な
キャッシュのメソッドですね。
今回のプレリクエストでは、このメソッドの内部の実装で、
イミュータブルトゥルーというオプションを利用するようになったよというお知らせですね。
このイミュータブルトゥルーについては、第26回のエピソードでも取り上げました。
イミュータブルトゥルーを指定することによって、
明示的にブラウザにこのリソースは変更されないよというのが伝えることができるようになったよという話をしましたね。
今回のプレリクエストの以前は、
このHTTP Cache Foreverというメソッドでは、
内部的には、Expires in 100 Years、100年後に有効期限が切れるよというので、
遠い未来の有効期限が設定されたキャッシュだよという実装になっていたんですけど、
それに加えて、ちゃんとイミュータブルトゥルーというのを指定するようにしたよと。
これでブラウザがこのリソースは変更されないんだなということが分かるので、
いいんじゃないのということですね。
イミュータブルディレクトリに保存されるので、
パフォーマンスが良くなるという観点があるのかなと思っています。
続いて2つ目。
i18n Do Not Watch Translations From James When Reloading Is Enabled。
アクティブサポートに関する変更です。
03:02
i18nを初期化する際の読み込み時間の高速化をしているというプレリクエストですね。
具体的には何をしているかというと、
翻訳ファイルの変更時に翻訳をロケル、YAMLを自動再読み込みする機能が有効になっているときに、
ジェム内の翻訳ファイルは監視の対象外にするという変更をしています。
ジェムを利用するアプリケーションにおいては、
ジェム内の翻訳ファイルは書き換えることはないですよね。
なので、ジェム内の翻訳ファイルが変更されたかどうかなという監視をするという意味はないので、
監視の対象外にしましょうねと。
これによって監視の対象外のファイルが減ることによって高速化しますよねということを、
実験もたくさんのパターンで示してくれているというプレリクエストでしたね。
そもそもRailsアプリケーションのファイルの更新の検出および再読み込みというのは、
どういう設定になっているのかなというのを改めてチェックしました。
設定項目としては、Config.EnableReloadingというやつと、
Config.ReloadClassesOnlyOnChange、この2つがあります。
EnableReloadingがTrueの場合にリクエスト間でクラスやモジュールの再読み込みをするというふうになっています。
デフォルトでは、デベロップメントモードでは、つまり開発環境ではTrue、プロダクションではフォルス。
プロダクションで毎回クラスをリロードしていたりしたらもったいないんでね。
プロダクションではフォルスになっていて、開発環境ではTrueになっているというEnableReloadingという設定があります。
ReloadClassesOnlyOnChangeは、このEnableReloadingがTrueの場合のみ参照されるオプションで、
このReloadClassesOnlyOnChangeがTrueになっていると、
トラッキングしているファイルが変更された場合のみクラスの再読み込みをします。
フォルスになっている場合はトラッキングしているファイルが変更されていない場合もクラスの再読み込みをするというふうに解釈しました。
動作確認していないけど。
もともとEnableReloadingというのがTrueの時は、リクエストのたびにクラスやモジュールを再読み込みするという設定だと思うんですよね。
この書いてある通りだと。
ReloadClassesOnlyOnChangeというのがTrueだと、リクエストのタイミングでクラストラッキングしているファイルの変更があった場合だけ必要なクラスを再読み込みするというふうになっていると。
06:13
このReloadClassesOnlyOnChangeはデフォルトではTrueになっています。
基本は開発環境であればEnableReloadingがTrueだし、ReloadClassesOnlyOnChangeがTrueなんで、
つまりトラッキングしているファイルパスに指定したファイルが変更された時にリクエストのタイミングで必要なクラスだけ再読み込みするというのがデフォルトの挙動ですね。
という感じになっています。
EnableReloadingがフォルスの時はもちろんリローディングはしない、再読みしないという設定ですね。
になっているよという感じなんで、それがRailsアプリケーションのファイルの更新検出と再読み込みに関するものですね。
なので今回のi18nに関してはもちろんEnableReloadingがTrueで動いている場合の話が前提になっていますね。
という感じで、このi18nの今回のプレディックではジェムファイルの余計な翻訳ファイルは毎回リローディングしなくていいよねという対応になっています。
最後。
タイトルがFix and Deprecate Callback Execution
When Child Autosaves Parent With Has One and Belongs Toというタイトルです。
こちらはアクティブレコードに関する変更です。
親子関係のあるモデルについて子供モデルのレコードと同時に親モデルのレコードを作成するということもあると思うんですね。
そういう時に子供のモデルに対して同じコールバックが2回ずつ呼ばれているという具合があったということです。
対象のコールバックは4つで、1つ目がBefore Validation、2つ目がAfter Validation、3つ目がBefore Save、4つ目がAfter Save。
この4つですね。
Before AfterのValidationとBefore AfterのSave。
この4つのコールバックが2回ずつ呼ばれているよというのを発見して修正したという対応になっています。
具体例は一周に書かれていたものの実装を小ノートに貼り付けています。
親のクラスとしてPostというモデルがあったと。
09:01
子供のクラスとしてコメントモデルがあるという前提で。
コメントモデルをクリエイトすると同時に親のPostモデルもクリエイトすると。
例えばコメントモデルにAccept Nested Attributes for Postという形で指定している状態で。
コメント.Create括弧、コメントのネームが例えばWhoで。
コメントにアトリビュートとしてPost Unscored Attributesコロンでネームバーみたいなね。
つまり親モデルのPostのネームがバーでコメントのネームがWhoみたいな感じで。
コメントのレコードと同時に親モデルであるPostのレコードも作るよという処理をペコッとやったとしましょうと。
そういう時にコメントに対するBefore Validation, After Validation, Before Save, After Saveというのが
2回ずつ呼ばれているんだけどということが分かったよと。
こういうコールバックが2回も呼ばれていると無駄な処理なんで。
無駄な処理、無駄なコールバックを呼ばないように修正したよというのが今回のプレイクエストでございます。
ということで今回は3つのプレイクエストを紹介しましたという感じです。
こんなところで今週の田中園ですは以上とします。
ではまた来週。バイバイ。
10:51

コメント

スクロール