我读了一篇关于 rails load_paths 的帖子,这里是链接。
但是,我仍然对autoload_paths
and之间的区别感到困惑eager_load_paths
:
我在一个新创建的 Rails 4 项目中测试了它们。似乎它们以相同的方式运行,即在开发模式下自动重新加载但在生产模式下。
我读了一篇关于 rails load_paths 的帖子,这里是链接。
但是,我仍然对autoload_paths
and之间的区别感到困惑eager_load_paths
:
我在一个新创建的 Rails 4 项目中测试了它们。似乎它们以相同的方式运行,即在开发模式下自动重新加载但在生产模式下。
此处链接文章的作者。这是消除@fkreusch 回答的困惑的尝试。
在 Ruby 中,您必须要求每个.rb
文件才能运行其代码。但是,请注意在 Rails 中,您从不特别需要app/
目录中的任何模型、控制器或其他文件。这是为什么?那是因为在 Railsapp/*
中是在autoload_paths
. 这意味着当您在开发中运行您的 rails 应用程序时(例如 via rails console
) - ruby 实际上还不需要任何模型和控制器。Rails 使用 ruby 的特殊神奇特性来实际等到代码提到一个常量,比如说Book
,然后它才会运行require '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
andeager_load_paths
中,这意味着在那里添加目录不需要进一步的操作。
基本上,autoload_paths
是 Rails 用来尝试自动加载类的路径。例如,当您调用 时Book
,如果该类尚未加载,它将通过autoload_paths
并在这些路径中查找它。
在生产中,最好预先加载这些以避免自动加载并发问题。为此,它提供了eager_load_paths
. 当您的应用程序启动时,该列表中的路径将是必需的。