如何创建一个使用 gzip 压缩静态文件的简单节点服务器

abb*_*ood 5 compression gzip http-compression node.js express

我一直在这几个小时..

我做的第一件事是按照教程进行操作,其中包含以下代码:

var express = require('express');
var app = express();

// New call to compress content
app.use(express.compress());    
app.use(express.static(__dirname + '/public'));
app.listen(3333);
Run Code Online (Sandbox Code Playgroud)

自然代码已经过时了..我收到了这个错误:

Error: Most middleware (like compress) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
Run Code Online (Sandbox Code Playgroud)

所以我将代码更新为:

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

app.use(compression());
app.use(express.static(__dirname + '/_public' ));    

app.listen(3333);
Run Code Online (Sandbox Code Playgroud)

效果很好..但我没有看到压缩的证据(我怎么知道?通过查看 chrome 开发工具响应标头:

在此处输入图片说明

它没有content-encoding教程中的 gzip标头:

在此处输入图片说明

所以尝试改用zlib库:

var express = require('express');
var app     = express();
var maxAge  = 31557600000;
var zlib = require('zlib');
app.use(express.static(__dirname + '/_public' ));

app.get('/*', function(req,res)
{
  res.sendFile(__dirname + '/_public/index.html').pipe(zlib.createGunzip()).pipe(output);
});

app.listen(3333);
Run Code Online (Sandbox Code Playgroud)

但这也没有解决..此时我几乎秃了..有什么帮助吗?

ps压缩文档说你可以提供zlib选项,但没有提供任何例子/解释。


更新: 该问题已被完全回答并标记为这样(我讨厌移动目标问题)..但我不禁要问:那么您如何验证由于 gzip 压缩而减少了多少原始有效负载? 由于压缩/解压缩自然发生在幕后,因此 chrome 开发工具将在其网络选项卡中报告文件的原始大小:

在此处输入图片说明

小智 5

zlib.createGunzip() 用于解压。

我认为使用标题和流是有效的。

app.get('/', function(req,res){
  res.writeHead(200, {
  'Content-Encoding': 'gzip' });
 fs.createReadStream('_public/index.html').pipe(zlib.createGzip()).pipe(res);
});
Run Code Online (Sandbox Code Playgroud)


Kyl*_*ley 3

我相信您使用该compression模块的设置是正确的。我只是不认为它在开发过程中压缩文件。

尝试将其设置NODE_ENV为“生产”,例如

$ NODE_ENV="production" $ node server.js

编辑 你的后续问题。

本质上,您在 Chrome 开发工具中看到的是 gzip 压缩的结果。这个答案比我能更好地描述它:

“Size”是线路上的字节数,“content”是资源的实际大小

gzip 压缩减少了资源的“在线”大小。

因此,在您的示例中,最终用户将有 450 KB 下载。