2012-06-17 66 views
8

注:我對如何使用,以GZIP數據另一個類似的問題Ruby的zlib技術上得到的回答是,我並沒有感覺,因爲它已回答所以雖然我可以開始發展的問題這個問題是相關的,它是不一樣的...在西納特拉使用gzip壓縮使用Ruby

下面的代碼(我相信)是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以及等於31的windowBits參數來啓動gzip流。

但是,當我運行此代碼時,我實際上不知道如何處理result變量及其內容。互聯網上沒有關於如何將GZIP編碼的靜​​態資源(如JavaScript,CSS,HTML等)發送到瀏覽器的信息,這使得頁面加載速度更快。看來,我閱讀的每篇Ruby文章都是基於某人使用Ruby on Rails !!?

任何幫助真的很感激。

回答

13

壓縮文件後,您只需返回結果並確保爲響應設置標頭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

感謝您的詳細回覆和示例代碼。我採納了您的意見,並使用了「Rack :: Deflater」。在我的應用程序文件頂部的一行代碼,它的工作原理是:'使用Rack :: Deflater' – Integralist

+0

對於nginx選項爲 –

+0

Downvoted,因爲這將提供gzip內容,無論客戶指定了什麼,他們都可以接受'Accept-Encoding'頭。這當然是不好的做法,應該避免。 – aidan

3

只是爲了突出「機架:: Deflater」的方式作爲一個「答案」 - >

如上評論中提及,只是把壓縮config.ru

use Rack::Deflater 

這就是相當多它!

+0

這是更好的答案,因爲Rack :: Deflate會協商並使用客戶端支持的最佳壓縮算法 – aidan