Node.js: Gzip sıkıştırması?


90

Node.js'nin gzip sıkıştırması yapmadığını ve dışarıda gzip sıkıştırması yapacak modül olmadığını bulmakta yanlış mıyım? Sıkıştırması olmayan bir web sunucusunu herkes nasıl kullanabilir? Burada neyi özlüyorum? Algoritmayı sunucu tarafında kullanmak için JavaScript'e aktarmayı denemeli miyim?

Yanıtlar:


74

Node v0.6.x'in şu anda çekirdekte kararlı bir zlib modülü var - bunun sunucu tarafında nasıl kullanılacağına dair bazı örnekler de dokümanlarda var.

Bir örnek (belgelerden alınmıştır):

// 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
'CreateDeflate' yerine 'createDeflateRaw' kullanarak çözdüğüm zlib başlığını beğenmeyen Internet Explorer ile ilgili bir sorunla karşılaştım
işaretleyin

60

Express kullanıyorsanız , yapılandırmanın bir parçası olarak sıkıştırma yöntemini kullanabilirsiniz:

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

Ve burada sıkıştırmayla ilgili daha fazla bilgi bulabilirsiniz: http://expressjs.com/api.html#compress

Ve Express kullanmıyorsanız ... Neden olmasın dostum ?! :)

NOT: (@ankitjaininfo'ya teşekkürler) Bu ara yazılım, tüm yanıtların sıkıştırıldığından emin olmak için "kullandığınız" ilk programlardan biri olmalıdır. Bunun rotalarınızın ve statik işleyicinizin üzerinde olduğundan emin olun (örneğin, yukarıda nasıl edindim).

NOT: (@ ciro-costa sayesinde) Ekspres 4.0'dan beri express.compressara katman yazılımı kullanımdan kaldırılmıştır. Connect 3.0'dan devralındı ​​ve express artık connect 3.0'ı içermiyor. Ara yazılım almak için Hızlı Sıkıştırma'yı kontrol edin .


3
Yorum yapmadan olumsuz oy mu verilsin? Nedenini bana bildirin ve umarım cevabı geliştirebilirim. Veya kendinizi düzenlemekten çekinmeyin.
Milimetric

2
This middleware should be placed "high" within the stack to ensure all responses may be compressed. Bunun rotalarınızın ve statik işleyicinizin üzerinde olduğundan emin olun
ankitjaininfo

14
Şu andan itibaren express.compressara yazılım (connect 3.0 <'dan miras alınmıştır) artık connect 3.0 <içermediğinden kullanımdan kaldırılmıştır (ekspres 4.0'dan beri). Ara yazılım almak için github.com/expressjs/compression adresini kontrol edin .
Ciro Costa

2
"Neden olmasın dostum ?!" sorusuna, bu sayfadaki ham http ve ifade çerçevesini karşılaştıran grafikler size bir neden verebilir. express bunu biraz yavaşlatır raygun.io/blog/2015/02/node-js-performance-node-js-vs-io-js
ejfrancis

:) Yanakta biraz dil olması gerekiyordu. Aslında express'i sevmiyorum, yapmasını dilediğim daha birçok şey var ve keşke daha da güzelleşsin. Ama sanırım yeterince iyi işliyor, ta ki başka bir şey onu gölgede bırakana kadar.
Milimetric

43

1- Sıkıştırma yükleyin

npm install compression

2- Kullanın

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

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

Github'da sıkıştırma


1
statik assestin gzip olup olmadığı nasıl kontrol edilir!
Rizwan Patel

resimlerim sıkıştırılmıyor
Jeson Dias

aslında büyük JS / CSS dosyaları veya büyük JSON dosyaları gönderirken bu ara yazılımı kullanmalısınız .. Bu ara yazılımı kullanmak size fayda sağlamayacak, bunun yerine daha fazla işlemci kaynağı tüketecektir. @JesonDias
Shyam

@JesonDias resimleri gziplememelisiniz çünkü JPEG zaten resimler için gzip'ten çok daha iyi çalışan bir sıkıştırma algoritması içeriyor. gzip daha çok metin tabanlı şeyler içindir.
user3413723

33

Genel olarak, bir üretim web uygulaması için, node.js uygulamanızı nginx veya lighttpd gibi hafif bir ters proxy'nin arkasına koymak isteyeceksiniz. Bu kurulumun pek çok avantajı arasında, ters proxy'yi, uygulama kaynak kodunuzu değiştirmek zorunda kalmadan http sıkıştırması veya hatta tls sıkıştırması yapacak şekilde yapılandırabilirsiniz.


düğümün statik dosyalar sunmasına izin vermeyin, proxy'nin sıkıştırmayı halletmesine izin verin, prod-env'de en iyi uygulama olduğunu bulun, kök usr düğümünüzün 80 numaralı bağlantı noktasında çalışmasını önlemek için nginx veya lighty kullanmak isteyebilirsiniz
ezmilhouse

Kullanıma bağlı olarak, bunun gerçekten doğru cevap olduğunu düşünürdüm.
prasanthv

Eğer bir vekil olsa bile @ezmilhouse, sizin node.js sunucu hala zorundadır hizmet proxy bu statik dosyalar ve hatta aynı makinenin içinde borularda bant genişliği boşa hiçbir neden yok.
BT

8

Nginx, lighttpd veya vernik gibi ters bir proxy kullanarak gzip yapabilirsiniz. Gzip'in hangi varlığın gzip olacağı konusunda daha ayrıntılı bir yaklaşıma sahip olabilmeniz için uygulama düzeyinde gzip gönderme gibi çoğu http optimizasyonuna sahip olmak yararlı olabilir.

Aslında, expressjs / connect için gzippo https://github.com/tomgco/gzippo adında kendi gzip modülümü oluşturdum, ancak yeni iş yapıyor. Ayrıca, unix gzip komutunu üretmek yerine node-compress kullanır.


3
Şimdi küçük bir node.js web sunucusunda gzippo kullanıyorum, iyi şeyler!
bosgood

1
gzip'in statik assestlere uygulanıp uygulanmadığı nasıl kontrol edilir?
Rizwan Patel

5

Ekspres kullanmasanız bile, yine de ara yazılımlarını kullanabilirsiniz. Sıkıştırma modülü kullanıyorum budur:

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

Diğerleri nginxbunu örtük olarak halledebilecek bir ön uç web sunucusu kullanarak haklı olarak belirttikleri gibi , başka bir seçenek de varlıklarınızı sunmak için nodejitsu'nun mükemmel node-http-proxy'sini kullanmaktır.

Örneğin:

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

Bu örnek kullanımı yoluyla gzip sıkıştırma desteği gösteren bağlantı katman modülü: connect-gzip.


3

Dosyayı sıkıştırmak için aşağıdaki kodu kullanabilirsiniz

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.");

Aynı dosyayı açmak için aşağıdaki kodu kullanabilirsiniz

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.");

Bu cevapta bir açıklama metni görmek isterim! Kod parçacıklarınız soruyu yanıtlasa da, soruyu neden yanıtladığını anlamak için TO ve dünyanın geri kalanı için bazı açıklamalar eklemek iyi bir uygulamadır .
Clijsters

2

Nasıl hakkında bu ?

node-compress
node.js
için bir akış sıkıştırma / gzip modülü Kurmak için, libz'yi kurduğunuzdan emin olun ve şunu çalıştırın:
node-waf configure
node-waf build
Bu, sıkıştır.node ikili modülünü build / default'a koyacaktır.
...



2

Bugün itibariyle, epxress.compress()bu harika bir iş çıkarıyor gibi görünüyor.

Herhangi bir ekspres uygulamada sadece arayın this.use(express.compress());.

Ben şahsen ekspresin üstünde lokomotif çalıştırıyorum ve bu çok güzel çalışıyor. Ekspres üzerine inşa edilmiş diğer kütüphaneler veya çerçevelerle konuşamam, ancak tam yığın şeffaflığını sağladıkları sürece iyi olmalısınız.


2
Bu gerçekten yeni bir bilgi içermiyor, bu cevabı
tekrarlıyor

1

Node ile birkaç güzel gün oldu ve gzip olmadan bir web sunucusu oluşturamayacağınızı söylemekte haklısınız.

Node.js Wiki'deki modüller sayfasında verilen oldukça fazla seçenek var. Çoğunu denedim, ama sonunda kullandığım şey bu -

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

v1.0 da çıktı ve şu ana kadar oldukça kararlı.


Yorumunuzun biraz yanıltıcı olduğunu düşünüyorum. Gzip modern web uygulamalarında yaygın olsa da, bu bir zorunluluk değildir . Bence bunu kullanmamanın tamamen iyi ve standartlara uygun olduğunu düşünüyorum.
Simon East

1

Gzip sıkıştırması kullan

Gzip sıkıştırması, yanıt gövdesinin boyutunu büyük ölçüde azaltabilir ve dolayısıyla bir web uygulamasının hızını artırabilir. Express uygulamanızda gzip sıkıştırması için sıkıştırma ara yazılımını kullanın. Örneğin:

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

Yanıt boyutunu istemci boyutunda açmamız gerekiyor mu?
Siddharth Sunchu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.