我读了一篇关于rails load_paths的帖子,这里是链接.
但是,我仍然困惑的之间的区别autoload_paths和eager_load_paths:
我在新创建的Rails 4项目中测试了它们.它们似乎以相同的方式运行,即在开发模式下自动重新加载但在生产模式下.
Max*_*yak 153
这篇链接文章的作者.这是试图消除混乱,从@ fkreusch的答案开始.
在Ruby中,您必须要求每个.rb文件才能运行其代码.但是,请注意在Rails中你从未特别要求在app/dir中使用任何模型,控制器或其他文件.这是为什么?那是因为在Rails app/*中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和eager_load_paths,这意味着增加一个目录下有不需要采取进一步行动.
fkr*_*sch 11
基本上,autoload_paths路径Rails将用于尝试自动加载您的类.例如,当您调用时Book,如果该类尚未加载,它将通过autoload_paths并在这些路径中查找它.
在生产中,最好先加载这些以避免自动加载并发问题.为此,它提供了eager_load_paths.应用程序启动时,将首先需要该列表中的路径.
| 归档时间: |
|
| 查看次数: |
16556 次 |
| 最近记录: |