为什么heroku上的rails应用程序通过all.css和本地通过单个文件提供资源

Ben*_*gan 13 css haml ruby-on-rails heroku

我是一个铁杆新手,我一直试图弄清楚heroku上的stylesheets_link_tag是怎么回事.

如果我使用

= stylesheet_link_tag "style", :cache => true
Run Code Online (Sandbox Code Playgroud)

heroku使用"all.css"并且没有拿起样式表,但是如果我使用的话

= stylesheet_link_tag "style", :cache => false
Run Code Online (Sandbox Code Playgroud)

它使用名称"style.css"为样式表提供服务.为什么?

btw*_*btw 17

这是在样式表链接标记上调用:cache => true的结果.

:cache => true获取所提供的所有样式表,并将它们连接到一个名为all.css的文件中.

你只在Heroku部署中看到这个的原因是因为只有当Rails应用程序在生产模式下运行时它才会调用连接的all.css.

例如,假设我有三个样式表,并将其包含在我的标题中:

= stylesheet_link_tag "application", "jquery-ui", "style", :cache => true
Run Code Online (Sandbox Code Playgroud)

在开发中,这将包括application.css,jquery-ui.css和style.css(按此顺序).

在生产中,它会将三个文件中的所有CSS(按提供的顺序)连接成一个名为"all.css"的文件,这个文件将是唯一包含的CSS文件.

这样做的好处是可以减少生产中的HTTP请求,理想情况下,包含CSS的文件大小更小,这有望加快页面加载速度.

编辑正如Casper在评论中指出的那样,Heroku有一个只读文件系统.您可能希望查看Heroku Asset Packager以获取Heroku特定的解决方案.

  • Heroku是一个只读部署环境.因此,Rails无法将all.css写入/ public/stylesheets /并且无声地失败.只要你使用cache => true,stylesheet_link_tag仍会链接到all.css,因此快速修复不会在Heroku上缓存样式表.在这里阅读更多内容:http://docs.heroku.com/constraints#read-only-filesystem (4认同)
  • `:cache => true`现在可以在heroku上运行.它将生成一个带有正确内容的`all.css`.但是,正常的`File.open`操作仍然被阻止.很奇怪. (2认同)