[Source code] ActiveSupport::LazyLoadHooks
最近在看 Railtie, 在 initializer
的部分時, 翻了很多 source code
對裡面的 ActiveSupport.on_load
感到好奇
on_load
是 ActiveSupport::LazyLoadHooks 內的一個方法
可以使 component 延遲載入, 而不是在啟動時就全部載入
對 rails app 提升速度很有幫助
從 source code 可以看到一開始定義了三個 hash 的 instance variable @load_hooks
, @loaded
, @run_once
這裡以 activerecord/lib/active_record/railtie.rb 當範例
initializer "active_record.logger" do
ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
end
在 railtie
的 initializer
這個階段時, ActiveSupport.run_load_hooks
還沒執行, @loaded[:active_record]
是空的, 所以迴圈內的 execute_hook
還不會執行
這個階段 railtie
所有的 on_load
的 block 都會先塞進 @load_hooks[:active_record]
最後在 activerecord/lib/active_record/base.rb 最下面才會呼叫ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
去執行剛剛存放在 @load_hooks[name]
內的所有 block