在Ruby中使用Sinatra中的gzip压缩

时间:2012-06-17 15:55:17

标签: ruby sinatra gzip zlib

注意:我有另一个类似的问题,关于如何使用Ruby的zlib获取GZIP数据技术得到了解答,我觉得我不能开始改进这个问题,因为它已被回答所以尽管这个问题是相关的,但它不一样......

以下代码(我相信)是GZIP的静态CSS文件并将结果存储在result变量中。但是我在这个意义上怎么做呢:如何将这些数据发送回浏览器,以便将其识别为GZIP而不是原始文件大小(例如,当检查我的YSlow分数时,我想要正确地看到它我确保我GZIP静态资源。)

z = Zlib::Deflate.new(6, 31)
z.deflate(File.read('public/Assets/Styles/build.css'))
z.flush
@result = z.finish # could also of done: result = z.deflate(file, Zlib::FINISH) 
z.close

...有一点需要注意的是,在我之前的问题中,受访者澄清说Zlib::Deflate.deflate不会产生gzip编码的数据。它只会生成zlib编码的数据,所以我需要使用Zlib::Deflate.new windowBits参数等于31来启动gzip流。

但是当我运行此代码时,我实际上并不知道如何处理result变量及其内容。互联网(我可以找到)上没有关于如何将GZIP编码的静​​态资源(如JavaScript,CSS,HTML等)发送到浏览器的信息,这使得页面加载速度更快。我读过的每篇Ruby文章似乎都是基于使用Ruby on Rails的人!!?

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:15)

压缩文件后,您只需返回结果并确保为响应设置标题Content-Encoding: gzip。谷歌有一个很好的,introduction到gzip压缩,你需要注意什么。以下是您在Sinatra可以做的事情:

get '/whatever' do
  headers['Content-Encoding'] = 'gzip'
  StringIO.new.tap do |io|
    gz = Zlib::GzipWriter.new(io)
    begin
      gz.write(File.read('public/Assets/Styles/build.css'))
    ensure
      gz.close
    end
  end.string
end

但最后要小心谨慎。您应该只为您在运行中创建的内容选择此方法,或者只是想在几个地方使用gzip压缩。

但是,如果您的目标是在启用gzip压缩的情况下为大多数甚至所有静态资源提供服务,那么依靠Web服务器已经支持的内容而不是使用您的代码来污染您的代码将是一个更好的解决方案。这个细节。您可以使用某些配置设置启用gzip压缩。 Here's一个关于nginx如何完成的例子。

另一种选择是使用Rack::Deflater中间件。

答案 1 :(得分:6)

只是为了突出' Rack :: Deflater'作为答案的方式' - >

正如上面的评论所述,只需将压缩放在config.ru

use Rack::Deflater
几乎就是这样!

答案 2 :(得分:0)

我们可以看到用户将压缩与Web相关的数据,例如css文件。我想建议使用brotli。为此,它进行了优化。当今任何现代的Web浏览器都支持它。

您可以将ruby-brs绑定用于红宝石。

gem install ruby-brs
require "brs"
require "sinatra"

get "/" do
  headers["Content-Encoding"] = "br"
  BRS::String.compress File.read("sample.css")
end

您可以改用流式传输界面,它类似于Zlib界面。

require "brs"
require "sinatra"

get "/" do
  headers["Content-Encoding"] = "br"

  StringIO.new.tap do |io|
    writer = BRS::Stream::Writer.new io
    begin
      writer.write File.read("sample.css")
    ensure
      writer.close
    end
  end
  .string
end

您也可以使用nonblock方法,请阅读有关ruby-brs的更多信息。