eager_load=true の影響は何ですか?
概要
非運用環境では、eager_load が false であることが好ましい理由を知りたいのですが?私が聞いた議論の 1 つは、eager_load は Rails とアプリケーションのほとんどをメモリに熱心にロードするというものです。したがって、個々のテストにeager_loadを使用すると、実行が遅くなります。ただし、これにより、Rails やアプリケーション関連のコードをロードせずにテストをどのように実行するのかなど、いくつかの疑問が生じます。熱心にロードされている Rails およびアプリケーション関連のコードは何ですか? config.eager_load_namespaces は次のクラスを提供します。
ActiveSupport
ActionDispatch
ActiveModel
ActionView
ActionController
ActiveRecord
ActionMailer
Jquery::Rails::Engine
MyApp::Application
これらのクラスとそのサブクラスはすべて積極的にロードされていますか?
開発環境またはテスト環境でeager_load = falseを使用することの明らかな欠点は何ですか?
解決策
テストは、必要なコードを使用しようとするときに、オンデマンドで必要なコードをロードします。 たとえば、あるコード行では、テストで ActiveRecord クラスを使用したいとします。 eager_load を false に設定すると、このクラスはまだ必要ないため、バニラの Ruby プログラムでは例外が発生します。ただし、Rails プロジェクト内では、テストで使用する ActiveRecord がオンデマンドで必要になります。したがって、必要なコード部分のみが必要になるため、最終的には 1 つのテストがより高速に実行されます。
この手法は積極的な読み込みの逆であり、自動読み込みと呼ばれます。
https://github.com/rails/rails を確認してください。それはたくさんのものです。
はい
開発環境では、起動時間が短縮されるため、これは利点であり、ベスト プラクティスです (スプリングなどのプリローダーを使用する場合は無視されます)。おそらく、cache_classes=false オプションを使用すると、リロードの回数が減るため、変更のリロードも容易になります (単なる推測)。
テスト環境では、コードのメトリクスを推定したい場合に、eager_load=false を使用できない場合があります。 コードカバレッジやスタイルチェックなど。例えば。 simple_cov では、テストを開始する前にすべてのコードを一括ロードする必要があります。
また、一般に、一部のライブラリは、メソッドを呼び出す前であってもすでに使用可能である必要があるクラスのロード時に初期化を行うため、積極的なロードでは使用できないことが発生する可能性があります。ただし、これはまれなケースです。そうは言っても、neo4j.rb gem でこのようなことが起こりました。