10

注意:我有另一个类似的问题,关于如何使用 Ruby 的 GZIP 数据在zlib技术上得到了回答,我觉得我不能开始发展这个问题,因为它已经得到了回答,所以虽然这个问题是相关的,但它并不相同......

以下代码(我相信)是对静态 CSS 文件进行 GZIP 压缩并将结果存储在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 编码的数据,因此我需要使用等于 31Zlib::Deflate.new的参数来启动 gzip 流。windowBits

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

任何帮助都非常感谢。

4

3 回答 3

19

压缩文件后,您只需返回结果并确保Content-Encoding: gzip为响应设置标题。Google对 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 压缩。这是一个如何为 nginx 完成的示例。

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

于 2012-06-17T18:40:46.213 回答
9

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

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

use Rack::Deflater

差不多就是这样!

于 2016-07-05T22:47:02.333 回答
0

我们可以看到用户将压缩css文件等与 Web 相关的数据。我想推荐使用brotli。它为此目的进行了大量优化。今天的任何现代网络浏览器都支持它。

您可以为 ruby​​ 使用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 的更多信息。

于 2020-06-27T09:10:49.163 回答