Stan Blog

學習過程中的一些記錄

[Source code] ActiveSupport::LazyLoadHooks

最近在看 Railtie, 在 initializer 的部分時, 翻了很多 source code

對裡面的 ActiveSupport.on_load 感到好奇

on_loadActiveSupport::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

railtieinitializer 這個階段時, 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

Comments

comments powered by Disqus