Node.js: сжатие Gzip? - PullRequest
       64

Node.js: сжатие Gzip?

83 голосов
/ 09 октября 2010

Я ошибаюсь, обнаружив, что Node.js не выполняет сжатие gzip и не существует модулей для выполнения сжатия gzip? Как можно использовать веб-сервер без сжатия? Что мне здесь не хватает? Стоит ли пытаться & quot; задыхаться? Переносить алгоритм на JavaScript для использования на стороне сервера?

Ответы [ 13 ]

68 голосов
/ 11 февраля 2012

Node 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);
58 голосов
/ 15 января 2013

Если вы используете Express , то вы можете использовать его метод сжатия как часть конфигурации:

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

А о компрессе вы можете узнать здесь: http://expressjs.com/api.html#compress

А если вы не используете Экспресс ... Почему бы и нет, чувак ?! :)

ПРИМЕЧАНИЕ: (спасибо @ankitjaininfo) Это промежуточное программное обеспечение должно быть одним из первых, которое вы «используете» для обеспечения сжатия всех ответов. Убедитесь, что это выше ваших маршрутов и статического обработчика (например, как у меня это выше).

ПРИМЕЧАНИЕ: (благодаря @ ciro-costa) Начиная с Express 4.0, промежуточное программное обеспечение express.compress устарело. Он был унаследован от connect 3.0 и более не включает connect 3.0. Проверьте Express Compression для получения промежуточного программного обеспечения.

40 голосов
/ 06 июля 2014

1 - установка сжатие

npm install compression

2- Используйте его

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

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

сжатие на Github

29 голосов
/ 09 октября 2010

Вообще говоря, для производственного веб-приложения вы захотите поместить свое приложение node.js за облегченный обратный прокси-сервер, такой как nginx или lighttpd.Среди многих преимуществ этой настройки вы можете настроить обратный прокси-сервер для выполнения сжатия http или даже сжатия tls без необходимости изменения исходного кода приложения.

8 голосов
/ 24 июня 2011

Хотя вы можете gzip использовать обратный прокси, такой как nginx, lighttpd или в лаке. Может быть полезно иметь большинство http-оптимизаций, таких как gzip на уровне приложения, чтобы вы могли иметь более детальный подход к тому, что актив gzip.

Я на самом деле создал свой собственный модуль gzip для expressjs / connect с именем gzippo https://github.com/tomgco/gzippo, хотя новый он делает свою работу. Кроме того, он использует сжатие узлов вместо порождения команды unix gzip.

3 голосов
/ 11 мая 2017

Для сжатия файла вы можете использовать код ниже

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.");
3 голосов
/ 15 января 2013

В то время как другие прямо указали, что использование внешнего веб-сервера, такого как nginx, может неявно обрабатывать это, другой вариант заключается в использовании nodejitsu превосходного node-http-proxy для обслуживания ваших активов.

например:

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

В этом примере демонстрируется поддержка сжатия gzip с помощью модуля connect middleware : connect-gzip.

2 голосов
/ 22 ноября 2016

Даже если вы не используете экспресс, вы все равно можете использовать их промежуточное ПО.Модуль сжатия - это то, что я использую:

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)
2 голосов
/ 09 октября 2010

Как насчет этого ?

узел-компресс
Модуль потокового сжатия / gzip для node.js
Для установки убедитесь, что у вас установлен libz, и запустите:
настройка узла-waf
сборка node-waf
Это поместит двоичный модуль compress.node в build / default.
...

1 голос
/ 27 октября 2018

Использовать сжатие gzip

Сжатие Gzip может значительно уменьшить размер тела ответа и, следовательно, увеличить скорость веб-приложения. Используйте промежуточное программное обеспечение для сжатия gzip в вашем приложении Express. Например:

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