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...注意すべきことの 1 つは、私の前の質問で、回答者が gzip でエンコードされたデータを生成しないことを明らかにしたことです。これは zlib でエンコードされたデータのみを生成するため、gzip ストリームを開始するには 31 に等しい引数を使用Zlib::Deflate.newする必要があります。windowBits

resultしかし、このコードを実行すると、実際には変数とその内容をどうするかわかりません。GZIP でエンコードされた静的リソース (JavaScript、CSS、HTML など) をブラウザーに送信する方法に関する情報 (私が見つけることができる) がインターネット上にないため、ページの読み込みが速くなります。私が読んだ Ruby の記事はすべて、Ruby on Rails を使用している誰かに基づいているようです!?

どんな助けでも本当に感謝しています。

4

3 に答える 3

19

Content-Encoding: gzipファイルを圧縮した後、結果を返し、応答のヘッダーを設定するだけです。Google では、gzip 圧縮と注意すべき点について、簡単に紹介しています。シナトラでできることは次のとおりです。

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

ただし、最後に 1 つの注意事項があります。おそらく、このアプローチは、その場で作成したコンテンツに対してのみ、またはいくつかの場所で gzip 圧縮を使用したい場合にのみ選択する必要があります。

ただし、gzip 圧縮を有効にしてほとんどまたはすべての静的リソースを提供することが目標である場合は、この詳細でコードを汚染するのではなく、Web サーバーで既にサポートされているものに依存する方がはるかに優れたソリューションになります。いくつかの構成設定で gzip 圧縮を有効にできる可能性は十分にあります。これが nginx でどのように行われるかの例です。

別の方法として、Rack::Deflaterミドルウェアを使用することもできます。

于 2012-06-17T18:40:46.213 に答える
0

ユーザーがcssファイルなどの Web 関連データを圧縮しようとしていることがわかります。brotliの使用をお勧めします。そのような目的のために大幅に最適化されました。今日の最新の Web ブラウザーはすべてそれをサポートしています。

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

メソッドを使用することもできます。 ruby​​-brs のnonblock詳細をお読みください。

于 2020-06-27T09:10:49.163 に答える