【问题标题】:Express gzip static content快递 gzip 静态内容
【发布时间】:2011-09-16 06:17:26
【问题描述】:

Express 和 connect 似乎已经删除了它们的 gzip 功能,因为它们效率太低。目前是否有可靠的 gzip 与 express-js 解决方案?

【问题讨论】:

  • 如果这仍然与某人相关:因为我想提供 gzip 压缩的静态文件,但不希望在运行时这样做的开销,我在 express.static 之上编写了一个小包装器,它允许提供已经压缩过的文件。如果您将 gzipping html/css/js 文件集成到构建过程中,这将很有用。模块可以在 npm 上找到:express-static-gzip

标签: javascript node.js express gzip


【解决方案1】:

如果您搜索过 npm,您可能会遇到 node-compress

将其作为中间件注入 express 应该不会太难。

【讨论】:

  • 有很多可用的压缩库,但我想知道人们是否在生产中成功使用它们。
  • @gAMBOOKa 我个人使用的是那个,但不是为了开发而用于生产。
【解决方案2】:

我也搜索了npm,发现例如:

Gzippo 最近开发了(2 天前),我认为这是一件好事。我不能告诉你生产使用情况。您应该自己对其进行测试/基准测试。我也可能会使用 CDN 作为实时站点或 Nginx 来托管我的静态文件,而不是一些 nodejs 模块。

【讨论】:

  • 我们正在为一家大型英国报纸制作 gzippo。在节点层配置内容压缩的美妙之处在于,您可以简单地将 Varnish、Squid 或 CDN 放在上游,它将遵循 http 标头并在代理/CDN 上为所有后续请求保留一个缓存的压缩副本。这会将缓存配置与您的节点代码和您的 git/svn 等一起保存。
【解决方案3】:

Connect 将在下一版本中支持 Node 中的新 zlib 内容

【讨论】:

    【解决方案4】:

    Connect 2.0 添加了对基于 new zlib stuffcompress() 中间件的支持,该中间件刚刚出现在 Node Core API 中。

    您可以通过在 package.json 文件中添加连接 2.0 的依赖项来在您的 express 服务器中使用它:

    {
        ...
        dependencies: {
            "connect" : "2.x",
            "express" : "2.x",
            // etc..
        }
    }
    

    然后将以下逻辑应用到您的快速应用配置中:

    // Create static file server with gzip support
    var app = express.createServer(express.logger());
    app.use(connect.compress());
    app.use(express.static(__dirname + '/public'));
    app.listen(80);
    

    请注意,这些东西还是很新,虽然我可以让它在本地工作,但我的 Heroku 云应用程序抱怨在预提交挂钩期间对 Compress 2.x 的依赖通过 git 部署时:

    -----> Heroku receiving push
    -----> Node.js app detected
    -----> Resolving engine versions
           Using Node.js version: 0.4.7
           Using npm version: 1.0.106
    -----> Fetching Node.js binaries
    -----> Vendoring node into slug
    -----> Installing dependencies with npm
           npm ERR! Error: No compatible version found: connect@'>=2.0.0- <3.0.0-'
    

    如您所见,他们仍在使用旧版本的节点 (0.4.7)。


    更新:

    实际上,我可以通过在package.json 中添加相应的engines 部分来让Heroku 部署它:

    {
        ...
        "engines": {
            "node": ">= 0.6.0 < 0.7.0"
        }
    }
    

    这些是使用 http 压缩测试器时的结果:

    2014 年 6 月更新

    嗨,如果你现在正在阅读这篇文章。不要忘记上面的内容只与 Express 2.0 相关。

    Express 3.0 和 4.0 使用不同的语法来启用 http 压缩,请参阅下面 gasolin 的帖子。

    【讨论】:

    • @AndreyLushnikov:你必须use() compress 之前 staticcompress replaces res.writeres.end 以便它可以通过 zlib 代理数据。如果staticcompress 之前,它会在compress 中间件有机会运行和修补res 方法之前处理整个请求。史蒂文,我已经更新了你的答案以交换 use() 电话。
    • @gasolin 在下方声明 Express 3.0 现在支持 compress()。如果您正在阅读本文,能否更新您的答案?
    • http压缩测试仪你是怎么做的?
    • 上面提供的压缩测试器链接似乎不再起作用。这是另一种选择:gidnetwork.com/tools/gzip-test.php
    【解决方案5】:

    Express 3.0 现在支持 compress():

    var app = express();
    // gzip
    app.use(express.compress());
    // static
    app.use("/public", express.static(__dirname + '/public'));
    // listen
    app.listen(80);
    

    编辑 对于 Express 4.0,压缩成为单独的中间件。所以你必须安装并导入才能使用它:

    var compress = require('compression');
    app.use(compress()); 
    

    【讨论】:

    • Express 4.x 删除了几乎所有的中间件,包括compress。您现在可以使用 Connect 的 compression 中间件:github.com/expressjs/compression
    • 在heroku中是否需要额外的步骤
    • 压缩在什么情况下触发?我刚刚添加了它,但写了res.send 并且没有出现压缩内容。是否需要res.end 或其他触发器?
    • 当你想用 Express 4.x 压缩静态文件时不要忘记添加 { threshold: 0 }
    • 除了运行时模板->html,如果我们可以压缩它们,对.js和.css使用压缩是不是很好?因为在流量大的情况下使用 SSR 并不是一个好主意,所以它必须为每个请求的文件进行压缩。你能告诉我如何将 compress 用于 .html 吗?我将.ejs 用于模板。@Spawnrider 另外,我没有为我的 .css 或 .js 文件添加阈值:0,它立即起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多