我发现Node.js没有gzip压缩并且没有模块可以执行gzip压缩我错了吗?如何使用没有压缩的Web服务器?我在这里错过了什么?我是否应该尝试将算法加载到JavaScript以供服务器端使用?
答案 0 :(得分:67)
Node v0.6.x现在在核心中有一个稳定的zlib module - 在文档中也有一些关于如何在服务器端使用它的例子。
一个例子(取自文档):
// 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 :(得分:40)
1-安装压缩
npm install compression
2-使用它
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
答案 2 :(得分:28)
一般来说,对于生产Web应用程序,您需要将node.js应用程序放在轻量级反向代理(例如nginx或lighttpd)之后。在此设置的众多优点中,您可以将反向代理配置为进行http压缩甚至压缩,而无需更改应用程序源代码。
答案 3 :(得分:8)
虽然你可以使用反向代理gzip,如nginx,lighttpd或清漆。在应用程序级别进行大多数http优化(例如gzipping)可能会有所帮助,这样您就可以对gzip的资产进行更细粒度的处理。
我实际上为expressjs / connect创建了我自己的gzip模块,名为gzippo https://github.com/tomgco/gzippo,尽管它确实是新的。另外,它使用node-compress而不是产生unix gzip命令。
答案 4 :(得分:3)
正如其他人有正确指出的那样,使用前端网络服务器(例如nginx
)可以隐式处理这个问题,另一个选择是使用nodejitsu's优秀node-http-proxy来提供资产。
例如:
httpProxy.createServer(
require('connect-gzip').gzip(),
9000, 'localhost'
).listen(8000);
此示例演示了如何使用connect middleware模块支持gzip压缩:connect-gzip
。
答案 5 :(得分: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.");
答案 6 :(得分:2)
this怎么样?
<强>节点压缩强>
node.js的流压缩/ gzip模块
要安装,请确保已安装libz,然后运行:
node-waf配置
node-waf build
这将使compress.node二进制模块处于build / default ...
答案 7 :(得分:2)
即使您没有使用快递,您仍然可以使用他们的中间件。我正在使用compression module:
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)
答案 8 :(得分:1)
节点已经过了好几天了,你说没有gzip就无法创建网络服务器。
Node.js Wiki上的模块页面上有很多选项。我尝试了大部分,但这是我最终使用的那个 -
https://github.com/donnerjack13589/node.gzip
v1.0也已经出局,到目前为止一直相当稳定。
答案 9 :(得分:1)
截至今天,epxress.compress()似乎做得非常出色。
在任何快递应用程序中只需调用this.use(express.compress());我亲自在快递上运行机车,这很漂亮。我不能谈论建立在快递之上的任何其他库或框架,但只要他们尊重完整的堆栈透明度,你应该没问题。
答案 10 :(得分:1)
Express,KOA等有多个Gzip中间件。例如: https://www.npmjs.com/package/express-static-gzip
然而,Node在执行像CPU解密,SSL终止等CPU密集型任务时非常糟糕。相反,使用像nginx或HAproxy这样的“真正的”中间件服务,请参阅此处的项目符号3: http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/
答案 11 :(得分:1)
Gzip压缩可以大大减小响应主体的大小,从而提高Web应用程序的速度。在Express应用程序中使用压缩中间件进行gzip压缩。例如:
var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())