缺少gzip版本的css和js资产

时间:2015-04-17 13:19:07

标签: ruby-on-rails asset-pipeline

我正在使用Rails 4.2进行一个非常简单的项目。当我运行rake assets:precompile(用于开发和生产环境)时,我会在公共/资产中获得application-xyz.jsapplication-xyz.css文件。但是没有创建gzip版本,即没有application-xyz.js.gz和没有application-xyz.css.gz。我不知道有任何禁用此功能的选项。我错过了什么吗?

3 个答案:

答案 0 :(得分:11)

Sprockets 3不再生成gzip压缩版本的资产。根据{{​​3}},很大程度上是因为它们很少被实际使用。

您可以在预编译后通过gzipping资源自行恢复此功能,例如Xavier Noria使用this issue使用find迭代资产文件夹中的所有css和js文件,然后使用{ {1}}将其传递给xargs

gzip

答案 1 :(得分:3)

我更喜欢

namespace :assets do
  desc "Create .gz versions of assets"
  task :gzip => :environment do
    zip_types = /\.(?:css|html|js|otf|svg|txt|xml)$/

    public_assets = File.join(
      Rails.root,
      "public",
      Rails.application.config.assets.prefix)

    Dir["#{public_assets}/**/*"].each do |f|
      next unless f =~ zip_types

      mtime = File.mtime(f)
      gz_file = "#{f}.gz"
      next if File.exist?(gz_file) && File.mtime(gz_file) >= mtime

      File.open(gz_file, "wb") do |dest|
        gz = Zlib::GzipWriter.new(dest, Zlib::BEST_COMPRESSION)
        gz.mtime = mtime.to_i
        IO.copy_stream(open(f), gz)
        gz.close
      end

      File.utime(mtime, mtime, gz_file)
    end
  end

  # Hook into existing assets:precompile task
  Rake::Task["assets:precompile"].enhance do
    Rake::Task["assets:gzip"].invoke
  end
end

Source

答案 2 :(得分:3)

从Sprockets 3.5.2开始,再次启用gzip压缩并生成gz资产。您必须配置服务器才能正确提供服务。对于Nginx:

location ~ ^/(assets)/ {
  gzip_static on;
}

然后在application.rb中:

  config.middleware.insert_before(Rack::Sendfile, Rack::Deflater)

  # Compress JavaScripts and CSS.
  config.assets.compress = true
  config.assets.js_compressor = Uglifier.new(mangle: false)