如何在Rails 4中压缩CSS?

13

我尝试了以下方法,但是查看CSS源代码并没有压缩!我重启了服务器数十次。我关闭了浏览器中的缓存。我还尝试了'yui-compressor'宝石。

config/environments/development.rb

  config.assets.debug = false
  config.assets.css_compressor = :sass
  config.assets.compile = true

Gemfile

group :assets do
  # Add any compass extensions here
  # Use SCSS for stylesheets
  gem 'sass-rails', '~> 4.0.0'

参考资料

http://edgeguides.rubyonrails.org/asset_pipeline.html#customizing-the-pipeline

版本信息

WEBrick 1.3.1, ruby 2.0.0(2013年6月27日)[i386-mingw32],Rails 4.0.3


1
如果您处于开发环境中,这是正常的:资产应在部署期间进行压缩,并在生产环境中使用压缩。 - Benj
我已经部署了它,但仍无法压缩。CSS中有注释!我在production.rb中设置了config.assets.css_compressor = :sass。我使用git push heroku进行部署。 - Chloe
你是如何部署的?使用Capistrano还是手动方式? - Benj
6个回答

24

我在生产环境中遇到了同样的问题,发布到Heroku时,无法缩小CSS。 在启用以下压缩后:

production.rb

config.assets.css_compressor = :sass
Gemfile
gem 'sass-rails', '~> 4.0.0'    

我通过更新资产版本将其压缩成功:

production.rb

config.assets.version = '1.1' # was '1.0'

进行了一些测试后,我发现更新源CSS/SASS具有相同的效果。因此,请尝试更新样式表(而不仅仅是配置文件),这样在你推送后Heroku预编译资产时应该会“启动”缩小过程,而无需更新资产版本。


7

预编译

在使用it技术时,您需要预编译资产

Rails将会在预编译资产时压缩它们。这仅用于生产环境,但意味着您可以使用像application.jsapplication.css这样的文件,并且代码已经被压缩了。

请尝试以下操作:

$ rake assets:precompile RAILS_ENV=production
$ git add .
$ git commit -a -m "Precompiled Assets"
$ git push heroku master

这将预编译(并压缩)您的资源,使您可以在生产环境中使用已编译的文件。

1
Heroku不是已经自动编译资产了吗?为Rails资产管道准备应用程序 运行:rake assets:precompile 资产预编译完成(3.64秒) 清理资产 运行:rake assets:clean。我如何在开发中查看缩小版本,以测试一切是否正常?JS已经被缩小了。有没有一种方法可以缩小CSS而无需每次都记得将其检入GIT,并且每次部署时都会使文件系统混乱? - Chloe

0
如果您想使用Rails内部机制来压缩CSS,可以这样做。
minified = Sass::Engine.new(content, syntax: :scss, style: :compressed).render
AutoprefixerRails.process(minified).css

0
如果您正在寻找一种不需要资产管道来压缩CSS的方法,那么这里有两个选择。 Ruby YUI Compressor 但要注意此gem依赖于Java
compressor = YUI::CssCompressor.new
compressor.compress(<<-END_CSS)
  div.error {
    color: red;
  }
  div.warning {
    display: none;
  }
END_CSS
# => "div.error{color:red;}div.warning{display:none;}"

CSS Minify gem带有Ruby本地支持,如果你问我,这要好得多。

require 'cssminify'

CSSminify.compress('/* a comment */ .test { display: block; }')
# => minified CSS

CSSminify.compress(File.read('path/to/styles.css'))
# => minified CSS

不确定Rails在底层是如何实现的。但我遇到了一些访问Sprockets内部逻辑的问题。如果有人能帮忙,我将非常感激。


0

3
根据作者自己的说法,这种方法不应使用,因为它会对每个请求都增加重大开销。 - Benjamin

-3
这个问题出在我使用了image-url("/img/header/gradient.png")而不是image-url("img/header/gradient.png")。教训是:路径开头不要加斜杠。

2
这与问题有什么关系? - cimmanon
我花了几个小时来调试一个缺少斜杠的情况,这导致指纹识别无法正常工作。我想让其他人知道为什么CSS会被压缩而指纹识别无法正常工作。 - Dan Kohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接