Node.js: Gzip संपीड़न?


90

क्या मैं यह खोजने में गलत हूं कि Node.js कोई gzip कम्प्रेशन नहीं है और gzip कम्प्रेशन करने के लिए कोई मॉड्यूल नहीं हैं? वेब सर्वर का उपयोग कोई कैसे कर सकता है जिसमें कोई संपीड़न नहीं है? मुझे यहां क्या समझ नहीं आ रहा है? क्या मुझे सर्वर-साइड के उपयोग के लिए जावास्क्रिप्ट को पोर्ट करने की कोशिश करनी चाहिए?

जवाबों:


74

नोड v0.6.x में एक स्थिर zlib मॉड्यूल है अब कोर में है - डॉक्स में भी सर्वर-साइड का उपयोग करने के तरीके पर कुछ उदाहरण हैं।

एक उदाहरण (डॉक्स से लिया गया):

// server example
// Running a gzip operation on every request is quite expensive.
// It would be much more efficient to cache the compressed buffer.
var zlib = require('zlib');
var http = require('http');
var fs = require('fs');
http.createServer(function(request, response) {
  var raw = fs.createReadStream('index.html');
  var acceptEncoding = request.headers['accept-encoding'];
  if (!acceptEncoding) {
    acceptEncoding = '';
  }

  // Note: this is not a conformant accept-encoding parser.
  // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
  if (acceptEncoding.match(/\bdeflate\b/)) {
    response.writeHead(200, { 'content-encoding': 'deflate' });
    raw.pipe(zlib.createDeflate()).pipe(response);
  } else if (acceptEncoding.match(/\bgzip\b/)) {
    response.writeHead(200, { 'content-encoding': 'gzip' });
    raw.pipe(zlib.createGzip()).pipe(response);
  } else {
    response.writeHead(200, {});
    raw.pipe(response);
  }
}).listen(1337);

1
मैं इंटरनेट एक्सप्लोरर के साथ एक ऐसे मुद्दे पर भाग गया जिसमें zlib हेडर पसंद नहीं था जिसे मैंने 'createDeflateRaw' के बजाय 'createDeflate' के उपयोग से हल किया था
चिह्नित करें

60

यदि आप एक्सप्रेस का उपयोग कर रहे हैं , तो आप कॉन्फ़िगरेशन के भाग के रूप में इसकी संपीडन विधि का उपयोग कर सकते हैं:

var express = require('express');
var app = express.createServer();
app.use(express.compress());

और आप यहाँ सेक पर अधिक पा सकते हैं: http://expressjs.com/api.html#compress

और अगर आप एक्सप्रेस का उपयोग नहीं कर रहे हैं ... क्यों नहीं, आदमी ?! :)

नोट: (@ankitjaininfo के लिए धन्यवाद) यह मिडलवेयर उन सभी प्रतिक्रियाओं में से सुनिश्चित करने वाले पहले "उपयोग" में से एक होना चाहिए। सुनिश्चित करें कि यह आपके मार्गों और स्थिर हैंडलर से ऊपर है (जैसे कि मेरे पास यह कैसे है)।

नोट: (@ ciro-costa के लिए धन्यवाद) एक्सप्रेस 4.0 के बाद से, express.compressमिडलवेयर को हटा दिया गया है। यह कनेक्ट 3.0 से विरासत में मिला था और एक्सप्रेस अब कनेक्ट 3.0 भी शामिल नहीं है। मिडलवेयर प्राप्त करने के लिए एक्सप्रेस संपीड़न की जाँच करें ।


3
एक टिप्पणी के बिना वोट नीचे? मुझे पता है क्यों और उम्मीद है कि मैं जवाब में सुधार कर सकता हूं। या खुद को संपादित करने के लिए स्वतंत्र महसूस करें।
मिलीमीटर

2
This middleware should be placed "high" within the stack to ensure all responses may be compressed. सुनिश्चित करें कि यह आपके मार्गों और स्थिर हैंडलर से ऊपर है
ankitjaininfo

14
अब से express.compressमिडलवेयर (जिसे कनेक्ट 3.0 <से विरासत में मिला था) को पदावनत किया गया है (एक्सप्रेस 4.0 से) क्योंकि इसमें कनेक्ट 3.0 <अब शामिल नहीं है। मिडलवेयर प्राप्त करने के लिए github.com/expressjs/compression की जाँच करें ।
सिरो कोस्टा

2
"Why not, man ?!", इस पेज पर कच्चे http और एक्सप्रेस फ्रेमवर्क की तुलना करने वाले ग्राफ़ आपको एक कारण दे सकते हैं। एक्सप्रेस यह धीमा कर देती है थोड़ा नीचे raygun.io/blog/2015/02/node-js-performance-node-js-vs-io-js
ejfrancis

:) जो कि गाल में थोड़ी सी जीभ होना था। मैं वास्तव में एक्सप्रेस से प्यार नहीं करता, कई और चीजें हैं जो मैं चाहता हूं कि यह किया जाए और बहुत अधिक पॉलिश की इच्छा हो। लेकिन यह अच्छी तरह से मैं पर्याप्त लगता है, जब तक कुछ और इसे ग्रहण करता है।
मिलीमीटर

43

1- कंप्रेशन स्थापित करें

npm install compression

2- इसका प्रयोग करें

var express     = require('express')
var compression = require('compression')

var app = express()
app.use(compression())

Github पर संपीड़न


1
कैसे जांच करने के लिए कि स्थैतिक assest gzip हैं या नहीं!
रिजवान पटेल

मेरी तस्वीरें गज़ब नहीं हो रही हैं
जेसन डायस

जब आप बड़ी JS / CSS फाइलें या बड़ी JSON फाइल भेज रहे हैं तो वास्तव में आपको यह मिडिलवेयर चाहिए। इस मिडलवेयर का उपयोग करने से आपको लाभ नहीं मिलेगा, इसके बजाय यह अधिक सीपीयू संसाधनों का उपभोग करेगा। @ जेजोंडियास
श्याम

@JesonDias आपको छवियों को gzip नहीं करना चाहिए क्योंकि JPEG में पहले से ही एक संपीड़न एल्गो शामिल है जो कि gzip की तुलना में छवियों के लिए बहुत बेहतर काम करता है। gzip टेक्स्ट आधारित सामान के लिए अधिक है।
user3413723

33

सामान्यतया, प्रोडक्शन वेब एप्लिकेशन के लिए, आप अपने नोड.जेएस ऐप को हल्के रिवर्स प्रॉक्सी जैसे कि नेग्नेक्स या लाइटटैप के पीछे रखना चाहते हैं। इस सेटअप के कई लाभों में से, आप अपने एप्लिकेशन स्रोत कोड को बदलने के बिना, HTTP संपीड़न या यहां तक ​​कि tls संपीड़न करने के लिए रिवर्स प्रॉक्सी को कॉन्फ़िगर कर सकते हैं।


नोड को स्थिर फ़ाइलों की सेवा न करने दें, प्रॉक्सी को संपीड़न का ख्याल रखने दें, इसे prod-env में सर्वोत्तम अभ्यास
मानें

उपयोग के आधार पर, मैं वास्तव में इसे सही उत्तर मानूंगा।
प्रशान्त

@ezmilhouse यहां तक कि अगर आप एक प्रॉक्सी है, तो अपने Node.js सर्वर अभी भी करने के लिए है की सेवा प्रॉक्सी के लिए उन स्टैटिक फ़ाइलें, और वहाँ एक ही मशीन के अंदर पाइप में भी बैंडविड्थ बर्बाद करने के लिए कोई कारण नहीं है।
बीटी

8

यद्यपि आप रिवर्स प्रॉक्सी का उपयोग कर सकते हैं जैसे कि nginx, lighttpd या वार्निश में। यह सबसे अधिक http ऑप्टिमाइज़ेशन के लिए फायदेमंद हो सकता है जैसे कि आवेदन स्तर पर gzipping ताकि आपके पास gzip के लिए संपत्ति के बारे में एक बहुत बारीक दृष्टिकोण हो सके।

मैंने वास्तव में एक्सप्रेस के लिए अपना स्वयं का gzip मॉड्यूल बनाया है / जिसे gzippo https://github.com/tomgco/gzippo कहा जाता है, हालांकि नया यह काम करता है। इसके अलावा यह यूनिक्स gzip कमांड को स्पॉन्ग करने के बजाय नोड-सेक का उपयोग करता है।


3
मैं एक छोटे नोड पर gzippo का उपयोग कर रहा हूँ। अब वेबसर्वर, अच्छा सामान!
बोसगूड

1
कैसे जाँचें कि क्या gzip स्थैतिक हत्यारों पर लागू होता है?
रिजवान पटेल

4

यहां तक ​​कि अगर आप एक्सप्रेस का उपयोग नहीं कर रहे हैं, तब भी आप उनके मिडलवेयर का उपयोग कर सकते हैं। संपीड़न मॉड्यूल मैं क्या उपयोग कर रहा हूँ है:

var http = require('http')
var fs = require('fs')
var compress = require("compression")
http.createServer(function(request, response) {
  var noop = function(){}, useDefaultOptions = {}
  compress(useDefaultOptions)(request,response,noop) // mutates the response object

  response.writeHead(200)
  fs.createReadStream('index.html').pipe(response)
}).listen(1337)

3

जबकि अन्य लोगों ने फ्रंट एंड वेबसर्वर का उपयोग करके सही इंगित किया है जैसे कि nginxयह स्पष्ट रूप से संभाल सकता है, एक और विकल्प है, नोडजित्सु के उत्कृष्ट नोड-http- प्रॉक्सी का उपयोग करना का उपयोग करके अपनी संपत्ति की सेवा करना है।

उदाहरण के लिए:

httpProxy.createServer(
 require('connect-gzip').gzip(),
 9000, 'localhost'
).listen(8000);

यह उदाहरण कनेक्ट मिडलवेयर मॉड्यूल के उपयोग के माध्यम से gzip संपीड़न के लिए समर्थन प्रदर्शित करता है connect-gzip:।


3

फ़ाइल को संपीड़ित करने के लिए आप नीचे दिए गए कोड का उपयोग कर सकते हैं

var fs = require("fs");
var zlib = require('zlib');
fs.createReadStream('input.txt').pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
console.log("File Compressed.");

उसी फाइल को डिकम्पोज करने के लिए आप नीचे दिए गए कोड का उपयोग कर सकते हैं

var fs = require("fs");
var zlib = require('zlib');
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));
console.log("File Decompressed.");

इस उत्तर में कुछ वर्णनात्मक पाठ देखना पसंद करेंगे! हालांकि आपका कोड स्निपेट प्रश्न का उत्तर दे सकता है, लेकिन टीओ और बाकी दुनिया के लिए कुछ स्पष्टीकरणों को शामिल करना अच्छा है, यह समझने के लिए कि यह प्रश्न का उत्तर क्यों देता है।
क्लेस्टर्स

2

इस बारे में कैसे ?

नोड-सेक। नोड के लिए
स्ट्रीमिंग स्ट्रीमिंग / gzip मॉड्यूल ।js
स्थापित करने के लिए, सुनिश्चित करें कि आपके पास libz स्थापित है, और चलाएं:
नोड-वफ़ कॉन्फ़िगर
नोड-वाफ़ बिल्ड
यह कम्प्रेस.नोड बाइनरी मॉड्यूल को बिल्ड / डिफ़ॉल्ट में डाल देगा।
...


2

एक्सप्रेस, KOA और अन्य के लिए कई Gzip बिचौलिये हैं। उदाहरण के लिए: https://www.npmjs.com/package/express-static-gzip

हालाँकि, सीपीयू गहन कार्यों जैसे कि गिपिंग, एसएसएल टर्मिनेशन, आदि करने में नोड बुरी तरह से खराब है, इसके बजाय, निगंक्स या HAproxy जैसी 'वास्तविक' मिडलवेयर सेवाओं का उपयोग करें, यहां बुलेट 3 देखें: http://goldbergyoni.com/checklist-best- अभ्यास के-नोड js में उत्पादन /


2

आज से, epxress.compress() यह एक शानदार काम कर रहा है।

किसी भी एक्सप्रेस ऐप में बस कॉल करें this.use(express.compress());

मैं व्यक्तिगत रूप से एक्सप्रेस के शीर्ष पर लोकोमोटिव चला रहा हूं और यह खूबसूरती से काम कर रहा है। मैं एक्सप्रेस के शीर्ष पर निर्मित किसी भी अन्य पुस्तकालयों या रूपरेखाओं से बात नहीं कर सकता, लेकिन जब तक वे पूर्ण स्टैक पारदर्शिता का सम्मान करते हैं, आपको ठीक होना चाहिए।


2
यह वास्तव में कोई नई जानकारी नहीं है, यह इस उत्तर को डुप्लिकेट करता है: stackoverflow.com/a/14341423/1355166
gcochard

1

नोड के साथ कुछ अच्छे दिन आ गए हैं, और आपका कहना सही है कि आप बिना gzip के वेबसर्वर नहीं बना सकते।

Node.js Wiki पर मॉड्यूल पृष्ठ पर बहुत सारे विकल्प दिए गए हैं। मैंने उनमें से अधिकांश को आज़माया, लेकिन यह वही है जिसका मैं अंत में उपयोग कर रहा हूं -

https://github.com/donnerjack13589/node.gzip

v1.0 भी बाहर है और यह अब तक काफी स्थिर है।


मुझे लगता है कि आपकी टिप्पणी थोड़ी भ्रामक है। जबकि gzip आधुनिक वेब अनुप्रयोगों में आम है, यह एक आवश्यकता नहीं है । मुझे लगता है कि यह पूरी तरह से ठीक है और मानकों का उपयोग नहीं करने के लिए आज्ञाकारी है।
साइमन ईस्ट

1

गज़िप संपीड़न का उपयोग करें

Gzip compressing प्रतिक्रिया शरीर के आकार को काफी कम कर सकता है और इसलिए एक वेब ऐप की गति बढ़ाता है। अपने एक्सप्रेस एप्लिकेशन में gzip संपीड़न के लिए संपीड़न मिडलवेयर का उपयोग करें। उदाहरण के लिए:

var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())

क्या हमें ग्राहक के आकार पर प्रतिक्रिया आकार को कम करने की आवश्यकता है?
सिद्धार्थ सुंचु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.