Node.js:Gzip压缩?

Sni*_*ave 87 compression gzip node.js

我错误地发现Node.js没有gzip压缩,并且没有模块可以执行gzip压缩吗?如何使用没有压缩的Web服务器?我在这里错过了什么?我是否应该尝试将算法加载到JavaScript以供服务器端使用?

hug*_*hsk 69

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);
Run Code Online (Sandbox Code Playgroud)


Mil*_*ric 59

如果您使用的是Express,那么您可以将其compress方法用作配置的一部分:

var express = require('express');
var app = express.createServer();
app.use(express.compress());
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到更多关于压缩的内容: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 <)已被弃用(因为快递4.0)因为它不包括connect 3.0 <anymore.获取https://github.com/expressjs/compression以获取中间件. (14认同)
  • 对于“为什么不呢,伙计?!”,此页面上比较原始 http 和 express 框架的图表可能会给您一个原因。express 会减慢速度 https://raygun.io/blog/2015/02/node-js-performance-node-js-vs-io-js/ (3认同)
  • 投票没有评论?让我知道为什么,希望我能改进答案.或者随意编辑自己. (2认同)
  • `这个中间件应该放在堆栈中"高",以确保所有响应都可以被压缩.`确保它位于路由和静态处理程序之上 (2认同)

Coy*_*Bit 42

1-安装压缩

npm install compression
Run Code Online (Sandbox Code Playgroud)

2-使用它

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

var app = express()
app.use(compression())
Run Code Online (Sandbox Code Playgroud)

在Github上压缩

  • 如何检查静态资源是否是gzip! (2认同)

yfe*_*lum 31

一般来说,对于生产Web应用程序,您需要将node.js应用程序放在轻量级反向代理(例如nginx或lighttpd)之后.在此设置的众多优点中,您可以将反向代理配置为进行http压缩甚至压缩,而无需更改应用程序源代码.


小智 10

要压缩文件,您可以使用下面的代码

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.");
Run Code Online (Sandbox Code Playgroud)

要解压缩同一文件,您可以使用以下代码

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.");
Run Code Online (Sandbox Code Playgroud)


tom*_*gco 8

虽然你可以使用反向代理gzip,如nginx,lighttpd或清漆.在应用程序级别进行大多数http优化(例如gzipping)可能会很有用,这样您就可以对gzip的资产进行更细粒度的处理.

我实际上已经为expressjs/connect创建了我自己的gzip模块,名为gzippo https://github.com/tomgco/gzippo,虽然它确实是新的.另外,它使用node-compress而不是产生unix gzip命令.

  • 我现在在一个小node.js网络服务器上使用gzippo,好东西! (3认同)

B T*_*B T 5

即使您不使用 express,您仍然可以使用他们的中间件。该压缩模块是我使用的是什么:

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)
Run Code Online (Sandbox Code Playgroud)


Jai*_*ani 5

使用gzip压缩

Gzip 压缩可以大大减小响应正文的大小,从而提高 Web 应用程序的速度。在 Express 应用程序中使用压缩中间件进行 gzip 压缩。例如:

var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())
Run Code Online (Sandbox Code Playgroud)


Sha*_*men 2

这个怎么样?

node-compress
用于 node.js 的流式压缩 / gzip 模块
要安装,请确保已安装 libz,然后运行:
node-waf configure
node-waf build
这会将 compress.node 二进制模块放入 build/default 中。
...