我是否错了,发现Node.js没有gzip压缩功能,也没有可以用于执行gzip压缩的模块?怎么会有人使用没有压缩功能的Web服务器呢?我错过了什么?我应该尝试将该算法传输到JavaScript以供服务器端使用吗?
我是否错了,发现Node.js没有gzip压缩功能,也没有可以用于执行gzip压缩的模块?怎么会有人使用没有压缩功能的Web服务器呢?我错过了什么?我应该尝试将该算法传输到JavaScript以供服务器端使用吗?
现在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);
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 继承而来的,而 express 不再包含 connect 3.0。请查看Express Compression以获取该中间件。
express.compress
中间件(继承自 connect 3.0<)已经被废弃(自 express 4.0 起),因为它不再包含 connect 3.0<。请查看 https://github.com/expressjs/compression 获取该中间件。 - Ciro Costa1- 安装 压缩
npm install compression
2- 使用它
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
一般而言,对于生产级 Web 应用程序,您应该将 Node.js 应用程序放在类似 nginx 或 lighttpd 的轻量级反向代理后面。这种设置的许多好处之一是,您可以配置反向代理进行 HTTP 压缩甚至 TLS 压缩,而无需更改应用程序源代码。
你可以使用以下代码来压缩文件
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.");
即使您没有使用express,仍然可以使用他们的中间件。我正在使用compression模块:
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)
使用gzip压缩可以大幅减小响应体大小,从而提高Web应用程序的速度。在Express应用程序中使用压缩中间件进行gzip压缩。例如:
var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())
nginx
可以隐式地处理此问题,但另一种选择是使用nodejitsu的优秀node-http-proxy来提供您的资产。httpProxy.createServer(
require('connect-gzip').gzip(),
9000, 'localhost'
).listen(8000);
connect-gzip
。Express、KOA等框架都有多种Gzip中间件可用。例如: https://www.npmjs.com/package/express-static-gzip
然而,Node在执行CPU密集任务(如gzip压缩、SSL终止等)方面效率较低。相反地,使用类似nginx或HAproxy这样的“真正”的中间件服务,参见此处的第三条建议: http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/