我读了一篇关于 Rails load_paths 的文章,这里是link http://hakunin.com/rails3-load-paths.
但是,我仍然对两者之间的区别感到困惑autoload_paths
and eager_load_paths
:
我已经在新创建的 Rails 4 项目中测试了它们。看起来它们的运行方式相同,即在开发模式下自动重新加载,但在生产模式下自动重新加载。
链接文章的作者在这里。这是试图消除困惑,摆脱@fkreusch的答案。
在 Ruby 中你必须要求每一个.rb
文件以便运行其代码。但是,请注意,在 Rails 中,您从不特别需要任何模型、控制器或其他文件app/
目录。这是为什么?那是因为在 Rails 中app/*
is in autoload_paths
。这意味着当您在开发中运行 Rails 应用程序时(例如通过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
and eager_load_paths
,这意味着在那里添加目录不需要进一步的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)