2012-06-17 15 views
8

नोट: मैं का उपयोग कर डेटा gzip करने के बारे में एक और इसी तरह सवाल था रूबी के zlib जो तकनीकी रूप से जवाब था और मैं महसूस नहीं किया था मैं सवाल विकसित हो रहा शुरू कर सकता है, क्योंकि यह इतना हालांकि उत्तर दिया गया था यह सवाल संबंधित है यह वही नहीं है ...रूबी के साथ सिनात्रा में gzip संपीड़न का उपयोग

निम्नलिखित कोड (मुझे विश्वास है) एक स्थिर सीएसएस फ़ाइल GZIP'ing है और result चर में परिणाम संग्रहीत कर रहा है। लेकिन मैं इस अर्थ में इसके साथ क्या कर सकता हूं: मैं इस डेटा को ब्राउज़र पर वापस कैसे भेज सकता हूं ताकि इसे मूल फ़ाइल आकार के बजाय GZIP'ed के रूप में पहचाना जा सके (उदाहरण के लिए जब मेरे वाईएसएलओ स्कोर की जांच हो तो मैं इसे सही ढंग से चिह्नित करना चाहता हूं मुझे यह सुनिश्चित करने के लिए कि मैं जीजेआईपी स्थिर संसाधन)।

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-encoded डेटा उत्पन्न करेगा और इसलिए मुझे का उपयोग windowBits के साथ एक gzip स्ट्रीम शुरू करने के लिए 31 के बराबर तर्क के साथ करना होगा।

लेकिन जब मैं इस कोड को चलाता हूं तो मुझे वास्तव में नहीं पता कि result चर और इसकी सामग्री के साथ क्या करना है। ब्राउज़र पर GZIP एन्कोडेड स्थैतिक संसाधन (जैसे जावास्क्रिप्ट, सीएसएस, एचटीएमएल इत्यादि) भेजने के बारे में इंटरनेट पर कोई जानकारी नहीं है (जो मुझे मिल सकती है), इससे पेज लोड तेज हो जाता है। ऐसा लगता है कि मैंने पढ़ा हर रूबी लेख रेल पर रूबी का उपयोग कर किसी पर आधारित है !!

किसी भी मदद की वास्तव में सराहना की।

उत्तर

13

फ़ाइल को ज़िप करने के बाद आप परिणाम वापस कर देंगे और प्रतिक्रिया के लिए हेडर Content-Encoding: gzip सेट करना सुनिश्चित करेंगे। Google को संपीड़न करने के लिए एक अच्छा, छोटा introduction है और आपको क्या देखना है। सिनात्रा में आप यह कर सकते हैं:

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 संपीड़न सक्षम करने के लिए है, तो यह आपके कोड को प्रदूषित करने के बजाय पहले से ही आपके वेब सर्वर द्वारा समर्थित समर्थन पर निर्भर करने का एक बेहतर समाधान होगा इस विस्तार के साथ। एक अच्छा मौका है कि आप कुछ विन्यास सेटिंग्स के साथ gzip संपीड़न सक्षम कर सकते हैं। Here's यह एक उदाहरण है कि यह nginx के लिए कैसे किया जाता है।

एक और विकल्प Rack::Deflater मिडलवेयर का उपयोग करना होगा।

+1

विस्तृत प्रतिक्रिया और उदाहरण कोड के लिए धन्यवाद। मैंने आपकी टिप्पणियों को बोर्ड पर ले लिया और इसके बजाए 'रैक :: डिफ्लेटर' का इस्तेमाल किया। सचमुच मेरी आवेदन फ़ाइल के शीर्ष पर कोड की एक पंक्ति और यह काम करता है: nginx विकल्प – Integralist

+0

+1 का उपयोग करें क्योंकि यह क्लाइंट ने निर्दिष्ट किया है कि वे क्या स्वीकार कर सकते हैं, इस पर ध्यान दिए बिना यह gzipped सामग्री की सेवा करेगा 'स्वीकृति-एन्कोडिंग' हेडर। यह निश्चित रूप से, बुरा अभ्यास है और इससे बचा जाना चाहिए। –

+0

के लिए रैक :: Deflater' – aidan

3

बस 'रैक :: Deflater' जिस तरह से एक 'जवाब' के रूप में उजागर करने के लिए ->

ऊपर टिप्पणी में उल्लेख किया है, सिर्फ

use Rack::Deflater 

thats काफी config.ru में संपीड़न डाल यह!

+0

यह बेहतर जवाब है क्योंकि 'रैक :: डिफ्लेट' बातचीत करेगा और क्लाइंट का समर्थन करने वाले सर्वोत्तम संपीड़न एल्गोरिदम का उपयोग करेगा – aidan

संबंधित मुद्दे