【问题标题】:how to create a simple node server that compresses static files using gzip如何创建一个使用 gzip 压缩静态文件的简单节点服务器
【发布时间】:2014-10-10 00:38:49
【问题描述】:

我已经做了好几个小时了..

我做的第一件事是遵循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 开发工具响应标头:

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

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

但这也没有成功..我现在几乎秃顶了..有什么帮助吗?

附言压缩docs 说您可以提供 zlib 选项,但无法提供任何示例/说明。


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

【问题讨论】:

  • index.html 的确切文件大小是多少?

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


【解决方案1】:

我也遇到了同样的问题,使用了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 或从 UI通过右键单击刷新图标并选择硬刷新。 然后我设法看到了Content-Encoding: gzip 响应头。

【讨论】:

    【解决方案2】:

    另外,为小文件压缩(小于 1kb)指定 threshold 值:

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

    【讨论】:

      【解决方案3】:

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

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

      $ NODE_ENV="production" $ node server.js

      编辑 对于您的后续问题。

      基本上,您在 Chrome 开发工具中看到的是压缩 gzip 压缩的结果。这个answer 描述得更好:

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

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

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

      【讨论】:

      • 有趣.. 所以npm startsame 运行node %nodefile%.js.. b/c 上面的脚本在server.js 文件中.. 我将运行$NODE_ENV='produciton';node server.js
      • 成功了!但简单地运行node server.js 其中server.js 上面的所有代码都不起作用.. 我必须实际更新我的package.json 并放入`“scripts”:{“start”:“node server.js”}`然后它起作用了!既然你回答了我上面的问题,我会奖励你正确的答案.. 但如果你不介意,我也会添加一个小后续问题
      • 当然,接下来是什么?我将修改答案以使用node server.js
      【解决方案4】:

      zlib.createGunzip() 用于解压缩。

      我认为使用标头和流是可行的。

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

      【讨论】:

        猜你喜欢
        • 2016-11-06
        • 2017-12-06
        • 2017-10-11
        • 2020-12-11
        • 1970-01-01
        • 2014-05-20
        • 2011-03-21
        • 1970-01-01
        • 2011-08-08
        相关资源
        最近更新 更多