我读了一篇关于rails load_paths的文章,这里是link。
但是,我仍然对autoload_paths和eager_load_paths之间的区别感到困惑
我在一个新创建的Rails 4项目中对它们进行了测试。它们的运行方式似乎是一样的,即在开发模式下自动重新加载,但在生产模式下自动重新加载。
发布于 2013-11-08 14:24:40
链接文章的作者在这里。这里尝试着从@fkreusch的答案出发,来澄清这个困惑。
在Ruby语言中,你必须要有每个.rb文件才能运行它的代码。但是,请注意,在Rails中,您从未明确需要app/目录中的任何模型、控制器或其他文件。为什么会这样呢?这是因为在Rails中,app/*是在autoload_paths中。这意味着当您在开发中运行rails应用程序时(例如通过rails console) - ruby实际上还不需要任何模型和控制器。Rails使用ruby的特殊魔力特性来实际等待,直到代码提到一个常量,比如Book,然后它才会运行在其中一个autoload_paths中找到的require 'book'。这使您在开发过程中可以更快地启动控制台和服务器,因为在启动它时不需要任何东西,只有在代码真正需要它时才需要它。
现在,这种行为对当地的发展是有好处的,但是生产呢?想象一下,在生产环境中,您的服务器执行相同类型的神奇常量加载(自动加载)。这真的不是世界末日,你在生产环境中启动服务器,人们开始浏览你的页面时会稍微慢一点,因为有些文件需要自动加载。是的,在服务器“预热”的同时,对于那些为数不多的初始请求,它是比较慢的,但这并不是那么糟糕。不过,这还不是故事的结尾。
如果你在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中,这意味着在其中添加目录不需要进一步的操作。
发布于 2013-11-05 01:43:59
基本上,autoload_paths是Rails尝试自动装入类的路径。例如,当你调用Book时,如果那个类还没有装入,它将遍历autoload_paths并在这些路径中查找它。
在生产中,预先加载这些可能会更好,以避免自动加载并发问题。为此,它提供了eager_load_paths。当您的应用程序启动时,该列表中的路径将是必需的。
https://stackoverflow.com/questions/19773266
复制相似问题