autoload_paths vs eager_load_paths

- 3 دقیقه

بصورت پیشفرض در Rails برای Load کردن فایل هایی که خارج از مسیر app وجود دارند بایست از autoload_paths یا eager_load_paths استفاده کنیم. اما تفاوت بین این دو تابع چیست؟ با هم مرور می کنیم:

پیش نیاز

فایلی را در مسیر lib/foo.rb با محتوای زیر ایجاد کنید.

class Foo
end

autoload_paths

روش استفاده

# config/application.rb
 
module Path
  class Application < Rails::Application
    config.autoload_paths += %W( #{config.root}/lib )
  end
end

نحوه عملکرد

در زمانی که کلاسی را فراخوانی می کنیم Rails در تمام مسیر هایی که در autoload_paths وجود دارد به دنبال کلاس مورد نظر می گردد و در صورتی که یافت شود آن را Load می کند.

آزمایش

Development Environment

# rails console -e development
 
Loading development environment (Rails 5.0.0.1)
irb(main):001:0> defined? Foo
=> nil
irb(main):002:0> Foo
=> Foo
irb(main):003:0> defined? Foo
=> "constant"

Production Environment

# rails console -e production
 
Loading production environment (Rails 5.0.0.1)
irb(main):001:0> defined? Foo
=> nil
irb(main):002:0> Foo
NameError: uninitialized constant Foo

eager_load_paths

روش استفاده

# config/application.rb
 
module Path
  class Application < Rails::Application
    config.eager_load_paths += %W( #{config.root}/lib )
  end
end

نحوه عملکرد

پس از Load شدن فریم ورک Rails، تمام فایل های rb. که در eager_load_paths ثبت شده اند Load می شوند. اما اگر استفاده از این روش در تنظیمات Rails غیر فعال باشد، autoload_paths بجای آن استفاده می شود.

آزمایش

Development Environment

# rails console -e development
 
Loading development environment (Rails 5.0.0.1)
irb(main):001:0> defined? Foo
=> nil
irb(main):002:0> Foo
=> Foo
irb(main):003:0> defined? Foo
=> "constant"

Production Environment

# rails console -e production
 
Loading production environment (Rails 5.0.0.1)
irb(main):001:0> defined? Foo
=> "constant"

نتیجه گیری

روش autoload_paths باعث می شود سرعت Load شدن Rails افزایش یابد و برای محیط Development مناسب است، اما eager_load_paths بخاطر Load کردن همه فایل ها همراه با Rails سرعت پاسخ دهی را بالا می برد، به همین سبب بصورت پیش فرض eager_load_paths در محیط Development غیرفعال و در محیط Production فعال است.

در نهایت می توان گفت: استفاده از eager_load_paths بخاطر اینکه می تواند در هر محیط، روش مناسب را بکار ببرد، گزینه بهتری است.

دانیال نیک‌نام

دانیال نیک‌نام

مسلط به تمام زبان های برنامه نویسی در کره زمین
تحلیل گر مسائل وبی در خاور میانه
یک غیر فعال وب
:laughing: :alien:

comments powered by Disqus
rssfacebooktwittergithubyoutubemailspotifylastfminstagramlinkedingooglegoogle-pluspinterestmediumvimeostackoverflowredditquoraquora