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

时间:2014-08-16 13:25:30

标签: node.js express compression gzip http-compression

我已经在这几个小时了......

我做的第一件事是关注this教程,其中包含以下代码:

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);

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

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

所以我将代码更新为:

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

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

app.listen(3333);

工作得很好..但我没有看到压缩的证据(我怎么知道?通过查看chrome dev工具响应头:

enter image description here

它没有像教程中那样的gzip content-encoding标题:

enter image description here

所以尝试使用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);

但是那也没有成功..而且我现在几乎没有秃头......任何帮助?

P.S。压缩docs表示您可以提供zlib选项,但无法提供任何示例/解释。


更新 这个问题已经得到了充分的回答和标记(我讨厌移动目标问题)..但是我无法帮助但是问:那么如何验证由于gzip压缩而修剪了多少原始有效负载?由于压缩/解压缩自然会在幕后发生,因此chrome dev工具将在其网络选项卡中报告文件的原始大小:

enter image description here

4 个答案:

答案 0 :(得分:4)

zlib.createGunzip()用于解压缩。

我认为使用标题和流可以正常工作。

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

答案 1 :(得分:3)

我相信您使用compression模块进行的设置是正确的。我只是觉得它在开发过程中不会压缩文件。

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

$ NODE_ENV="production" $ node server.js

修改 关于你的后续问题。

基本上你在Chrome开发工具中看到的是压缩gzip压缩的结果。这个answer比我更好地描述了它:

  

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

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

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

答案 2 :(得分:2)

另外,为小文件压缩(1kb以下)指定阈值值:

app.use(compression({ threshold: 0 }));

答案 3 :(得分:0)

我也遇到了同样的问题,使用了compression模块,就像这样:

const app = express();
app.use(compression({threshold : 0}));
app.use(express.static(path));

我通过devtools测试了它,以在响应头上寻找Content-Encoding: gzip,但没有成功。

显然,chrome在第一个请求之后缓存了文件,因此再次刷新时,我看不到Content-Encoding: gzip导致它从缓存中检索了文件。

因此,我硬刷新页面(Chrome会忽略缓存,并会再次从网页加载所有资源。)通过执行Ctrl + Shift + R 或从用户界面通过右键单击刷新图标并选择硬刷新。 然后,我设法看到了Content-Encoding: gzip响应标头。