2011-06-16 131 views
36

快速和连接似乎已经删除了他们的gzip功能,因为它们效率太低。目前有没有可靠的解决方案来使用express-j进行gzip?快速gzip静态内容

+0

使用的nginx的gzip的 – dumitru 2015-05-21 07:10:20

+0

如果这仍然是相关的人:因为我想成为gziped静态文件,但不希望在这样的开销fly,我在express.static之上写了一个小包装,它允许提供已经准备好的gziped文件。如果您将gzipping html/css/js文件集成到您的构建过程中,这将非常有用。模块可以在npm上找到:[express-static-gzip](https://www.npmjs.com/package/express-static-gzip) – Tobi 2016-11-02 07:32:44

回答

31

Connect 2.0增添基础上,new zlib stuff与在节点核心API刚出来的compress()中间件的支持。

您可以通过添加依赖连接2.0在package.json文件在您的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的依赖

-----> 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: [email protected]'>=2.0.0- <3.0.0-' 

正如你可以看到,他们还在使用旧版本节点(0.4.7):在通过git的部署时,pre-commit钩子。


UPDATE:

其实,我能得到的Heroku通过增加在package.json相应engines部分部署此:

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

而且这些都是使用时的结果HTTP压缩测试仪:

enter image description here

UPDATE 2014年6月

你好,如果你正在阅读这一点。不要忘记,上面的东西只与Express 2.0相关。

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

+0

我无法使其在Express 2.5.1上工作。 – 2012-05-21 17:36:24

+2

@AndreyLushnikov:你必须在**'static'之前使用()''compress' **。 'compress' [替换](https://github.com/senchalabs/connect/blob/2.3.9/lib/middleware/compress.js#L77-91)'res.write'和'res.end',这样它可以通过zlib代理数据。如果'static'在'compress'之前,它会在'compress'中间件有机会运行并修补'res'方法之前处理整个请求。史蒂文,我已经更新了你的答案,以交换'use()'调用。 – josh3736 2012-07-22 01:49:51

+3

@gasolin表示Express 3.0现在具有'compress()'支持。如果您正在阅读本文,请您更新您的答案? – HyderA 2013-03-10 15:26:12

1

如果你已经搜索了npm,你可能会遇到node-compress

把它作为中间件注入express应该不会太难。

+0

有很多压缩库可用,但我想知道人们是否在生产中成功地使用它们。 – HyderA 2011-06-16 11:54:10

+0

@gAMBOOKa我个人正在使用该产品,但不仅仅用于开发生产。 – Raynos 2011-06-16 12:03:11

5

我也搜索NPM,发现例如:

Gzippo最近开发(2天前)我认为这是一件好事。我无法告诉你有关生产的用法。你应该自己测试/基准测试。我也可能使用CDN作为活动站点或Nginx来托管我的静态文件,而不是一些nodejs模块。

+5

我们正在使用gzippo制作大型英国报纸。在节点层配置内容压缩的好处在于,您可以简单地将Varnish,Squid或CDN放在上游,它将遵守http标头,并在代理/ CDN上为所有后续请求保留一个缓存压缩副本。这使得您的节点代码和您的git/svn等缓存配置。 – serby 2011-07-03 16:28:42

3

连接将支持节点的新zlib的东西在下一个版本

+0

它现在被添加,请参阅下面的帖子.. – 2012-03-18 00:32:43

77

快车3.0现在已经压缩()的支持:

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

编辑 的快递4.0,压缩成为单独的中间件。所以,你必须安装和进口使用它:

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

Express'4.x'几乎删除了所有中间件,包括'compress'。您现在可以使用Connect的'compression'中间件:https://github.com/expressjs/compression。 – 2014-04-18 01:55:34

+1

是否需要在heroku中执行额外的步骤 – 2015-03-22 14:42:19

+0

在什么情况下压缩触发器?我刚刚添加了它,但写了'res.send',没有压缩的内容出来。它是否需要'res.end'或其他触发器? – CMCDragonkai 2015-04-26 05:01:25