但是,我仍然对autoload_paths和eager_load_paths之间的区别感到困惑:
我在新创建的Rails 4项目中测试了它们.它们似乎以相同的方式运行,即在开发模式下自动重新加载但在生产模式下.
这篇链接文章的作者.这是试图消除混乱,从@ fkreusch的答案开始.在Ruby中,您必须要求每个.rb文件才能运行其代码.但是,请注意在Rails中你从未特别要求app / dir中的任何模型,控制器或其他文件.这是为什么?那是因为在Rails中app / *在autoload_paths中.这意味着当您在开发中运行rails应用程序时(例如通过rails控制台) – ruby实际上并不需要任何模型和控制器. Rails使用ruby的特殊魔法功能实际上等到代码提到一个常量,比如Book,然后它才会运行需要’book’,它在autoload_paths中找到.这使您可以在开发过程中更快地启动控制台和服务器,因为启动它时不需要任何操作,只有在代码实际需要它时.
现在,这种行为有利于本地开发,但生产呢?想象一下,在生产中,您的服务器会执行相同类型的神奇恒定加载(自动加载).它真的不是世界末日,你在生产中启动你的服务器,人们开始浏览你的页面稍慢,因为有些文件需要自动加载.是的,这几个初始请求的速度较慢,而服务器“预热”,但并不是那么糟糕.除此之外,这不是故事的结局.
如果你在ruby 1.9.x上运行(如果我没记错的话),那么自动要求这样的文件不是线程安全的.因此,如果你使用像puma这样的服务器,你会遇到问题.即使您没有使用多线程服务器,您仍然可能更好地在启动时“主动”需要整个应用程序.这意味着在生产中,您希望在启动应用程序时完全需要每个模型,每个控制器等,并且您不介意更长的启动时间.这称为急切加载.所有ruby文件都被急切地加载,得到它?但是,如果你的rails应用程序没有单一的require语句,你怎么能这样做呢?这就是eager_load_paths的用武之地.无论你输入什么内容,在生产启动时都需要这些路径下所有目录中的所有文件.希望这清除它.
重要的是要注意eager_load_paths在开发环境中不活跃,因此在开发过程中不会急切地需要放入它们,只有在生产中才需要.
同样重要的是要注意,只需将某些东西放入autoload_paths就不会让它在生产中急于加载.不幸.您还必须将其明确地放入eager_load_paths中.
另一个有趣的怪癖是,在每个rails应用程序中,app /下的所有目录都自动在autoload_paths和eager_load_paths中,这意味着在那里添加目录不需要进一步的操作.