Неужели я ошибаюсь в том, что Node.js не выполняет сжатие gzip и нет модулей для выполнения сжатия gzip? Как можно использовать веб-сервер без сжатия? Что мне здесь не хватает? Должен ли я попытаться перейти к алгоритму JavaScript для использования на стороне сервера?
Node.js: сжатие Gzip?
Ответ 1
Ниже приведен список modules для сжатия:
Ответ 2
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);
Ответ 3
Если вы используете Express, вы можете использовать его метод сжатия как часть конфигурации:
var express = require('express');
var app = express.createServer();
app.use(express.compress());
И здесь вы можете найти больше здесь: http://expressjs.com/api.html#compress
И если вы не используете Express... Почему бы и нет, мужчина?!:)
ПРИМЕЧАНИЕ: (благодаря @ankitjaininfo) Это промежуточное программное обеспечение должно быть одним из первых, которое вы "используете" для обеспечения сжатия всех ответов. Убедитесь, что это выше ваших маршрутов и статического обработчика (например, как у меня оно выше).
ПРИМЕЧАНИЕ: (благодаря @ciro-costa). Начиная с express 4.0, промежуточное программное обеспечение express.compress
устарело. Он был унаследован от connect 3.0, и выражение больше не включает connect 3.0. Проверьте Экспресс-сжатие для получения промежуточного программного обеспечения.
Ответ 4
1- Установить сжатие
npm install compression
2- Используйте его
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
Ответ 5
Вообще говоря, для производственного веб-приложения вы захотите поместить ваше приложение node.js за легкий обратный прокси-сервер, такой как nginx или lighttpd. Среди многих преимуществ этой настройки вы можете настроить обратный прокси-сервер для сжатия http или даже сжатия tls, не изменяя исходный код приложения.
Ответ 6
Хотя вы можете использовать gzip с помощью обратного прокси-сервера, такого как nginx, lighttpd или в лаке. Может быть полезно иметь большинство оптимизаций HTTP, таких как gzipping на уровне приложения, так что вы можете иметь очень гранулированный подход к тому, какой актив для gzip.
Я действительно создал свой собственный gzip-модуль для expressjs/connect, называемый gzippo https://github.com/tomgco/gzippo, хотя новый он выполняет эту работу. Плюс он использует node -compress вместо того, чтобы развернуть команду unix gzip.
Ответ 7
Пока, как указали другие, использование веб-сервера с внешним интерфейсом, такого как nginx
, может обрабатывать это неявно, другой вариант - использовать nodejitsu's отлично node-http-proxy, чтобы обслуживать ваши активы.
например:
httpProxy.createServer(
require('connect-gzip').gzip(),
9000, 'localhost'
).listen(8000);
В этом примере демонстрируется поддержка сжатия gzip с помощью подключить промежуточное программное обеспечение: connect-gzip
.
Ответ 8
Для сжатия файла вы можете использовать код ниже
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.");
Ответ 9
Как насчет this?
node -compress
Модуль потокового сжатия /gzip для node.js
Чтобы установить, убедитесь, что у вас установлен libz, и выполните:
node -waf configure
node -waf build
Это поместит двоичный модуль compress.node в build/default.
...
Ответ 10
Даже если вы не используете экспресс, вы все равно можете использовать их промежуточное программное обеспечение. модуль сжатия - это то, что я использую:
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)
Ответ 11
Прошло несколько дней с node, и вы правы, что не можете создать веб-сервер без gzip.
На странице модулей на странице Node.js Wiki имеется множество опций. Я опробовал большинство из них, но это тот, который я, наконец, использую -
https://github.com/donnerjack13589/node.gzip
v1.0 также отсутствует, и до сих пор он был довольно стабильным.
Ответ 12
На сегодняшний день, epxress.compress()
, кажется, делает блестящую работу в этом направлении.
В любом экспресс-приложении просто позвоните this.use(express.compress());
.
Я лично управляю паровозом, и это прекрасно работает. Я не могу говорить ни с какими другими библиотеками или фреймворками, построенными поверх экспресса, но пока они соблюдают полную прозрачность стека, у вас все будет хорошо.
Ответ 13
Существует несколько Gzip middlewares для Express, KOA и других. Например: https://www.npmjs.com/package/express-static-gzip
Тем не менее, Node ужасно плохо выполняет такие интенсивные задачи, как gzipping, завершение SSL и т.д. Вместо этого используйте "настоящие сервисы промежуточного программного обеспечения, такие как nginx или HAproxy", см. bullet 3 здесь: http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/
Ответ 14
Использовать сжатие gzip
Сжатие Gzip может значительно уменьшить размер тела ответа и, следовательно, увеличить скорость веб-приложения. Используйте промежуточное программное обеспечение для сжатия gzip в вашем приложении Express. Например:
var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())