在Ruby中使用Sinatra中的gzip压缩

Int*_*ist 9 ruby gzip zlib sinatra

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

下面的代码(我相信)是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
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助真的很感激.

emb*_*oss 16

压缩文件后,您只需返回结果并确保设置Content-Encoding: gzip响应的标头.谷歌有一个很好的,很少介绍 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
Run Code Online (Sandbox Code Playgroud)

但最后要提醒一句.您应该只为您在运行中创建的内容选择此方法,或者只是想在几个地方使用gzip压缩.

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

另一种方法是使用Rack :: Deflater中间件.


Ris*_*shi 6

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

正如上面的评论中提到的,只需将压缩放在config.ru中

use Rack::Deflater
Run Code Online (Sandbox Code Playgroud)

那几乎就是它!