在 Rails 3 应用程序中使用 require_dependency 对性能有何影响?

Posted

技术标签:

【中文标题】在 Rails 3 应用程序中使用 require_dependency 对性能有何影响?【英文标题】:What are the performance implications of using require_dependency in Rails 3 applications? 【发布时间】:2011-11-24 20:43:13 【问题描述】:

我觉得我理解 require 和 require_dependency 之间的区别(来自How are require, require_dependency and constants reloading related in Rails?)。

但是,我想知道如果我使用其中一些不同的方法(请参阅http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/ 和Best way to load module/class from lib folder in Rails 3?)来加载所有文件会发生什么,所以我们:

    不需要在应用程序中到处使用 require_dependency 并且 当 lib 目录中的文件发生变化时,不必重新启动开发服务器。

似乎开发性能会受到轻微影响,这对我来说没什么大不了的。在生产环境中性能会受到怎样的影响?如果您在生产中,所有文件通常只加载一次吗?有没有更好的方法我没有看到?

如果您能提供一些我可以阅读更多相关信息的资源,我们将不胜感激。一些博客文章说,这种行为最近在 Rails 3 中发生了变化,用于自动重新加载 lib/* 文件,并且存在争议,但我没有看到任何指向这些讨论的链接。这将有助于考虑利弊。谢谢!

【问题讨论】:

【参考方案1】:

在生产环境中默认禁用代码重新加载器。因此,如果您在文件顶部调用 require_dependency,它将只执行一次。

您提到的 Rails 3 更改非常小。您通常可以调用Foo,它会自动从app/models/foo.rb 加载。在它也可以从lib/foo.rb 加载之前。 (这些目录app/modelslib 被称为自动加载路径。)Rails 团队决定在第三版中从自动加载路径中删除 lib。你仍然可以把它放回去。但鼓励将更改频率较低且特定于项目的文件留在 lib 中。如果您有不属于任何默认应用程序子目录的内容,例如 app/models 或 app/controllers,则不必将其放入 lib。您可以添加自己的子目录。例如,我有app/presenters。如果您想了解更多信息,旧问题跟踪器上有a discussion。

【讨论】:

以上是关于在 Rails 3 应用程序中使用 require_dependency 对性能有何影响?的主要内容,如果未能解决你的问题,请参考以下文章

require_tree 参数必须是 Rails 5 升级应用程序中的目录

如何在 Rails 中正确使用 params.require

rails:3 设计注册过滤器链停止为 :require_no_authentication 呈现或重定向

Rails 3.1 Sprockets 需要指令 - 有没有办法排除特定文件?

在 Rails 4 中,`params.require(:person).permit(:name, :age)` 是做啥的?

Rails 5.1 中是不是还需要`require jquery_ujs`?