使用node.js提供静态gzip文件服务。

14

我不想使用实时压缩的库,因为会有额外开销。

这个网站有一些动态组件是用node.js实现的。

我有一些静态js和css文件以及它们的压缩版本。我只想向支持它的浏览器提供压缩版本。

我考虑使用express中的static middleware来提供静态文件,并结合一些URL重写middleware有条件地提供压缩文件。但是,我找不到任何有条件的重写模块。

我不敢相信没有人这样做,或者需要那么多的解决方法。我错过了什么?

另外,通过node.js提供静态文件是否太昂贵?另一方面,使用Apache提供静态文件并在其后运行node.js似乎也不好。对于AWS EC2主机,最不愚蠢的配置是什么?

2个回答

17

这段代码适用于 Express 4

app.get('*.js', function(req, res, next) {
  req.url = req.url + '.gz';
  res.set('Content-Encoding', 'gzip');
  res.set('Content-Type', 'text/javascript');
  next();
});
app.get('*.css', function(req, res, next) {
  req.url = req.url + '.gz';
  res.set('Content-Encoding', 'gzip');
  res.set('Content-Type', 'text/css');
  next();
});

确保您设置了正确的内容类型,例如对于压缩文件,可以参考MIME 类型参考文档

res.set('Content-Type', 'text/css');

否则它将无法正常工作


我也在做同样的事情,但是对于 res.originalUrl += '.gz' 为什么不起作用呢? - master_dodo
2
不应该先有个条件语句吗?类似于检查浏览器是否接受gz版本的。 - Julix

15
如果您想为客户获得最佳性能,只需使用CDN。它将为您处理gzip压缩和许多其他内容。如果需要帮助,可以使用express-cdn模块。
如果出于某些原因您不喜欢CDN,则最好使用nginx。我在您的问题中看到了它的标签,但您没有提及任何相关信息。nginx比node.js快得多。对于nginx,您可以检查其gzip-static module
如果仍然想要使用node.js,则connect-gzip-static是最佳选择。它的工作方式与nginx-gzip-static模块几乎相同。如果有所请求文件的.gz文件副本,则会使用它,否则将回退到普通的connect-static模块。

如果你使用gulp,不要忘记预先编译文件,同时你也可以使用gulp-gzip。如果没有,只需使用gzip命令。

还有gzippo,它可以即时压缩,但也会将结果缓存在内存中。因此它只会被压缩一次。


非常感谢您的回复。我之前不知道connect-gzip-static和express-cdn,所以这对我很有帮助。我需要使用node.js,因为网站还有一个动态API组件。所以仅使用CDN是不够的。初步阅读表明,express-cdn只能帮助管理存储在S3中的资源,并不适用于具有动态组件的网站。我想尝试使用Nginx,希望它提供的功能足以替代我目前在htaccess中拥有的功能。 - pj_automata
你需要将静态资源放在CDN上,而不是动态资源。我认为任何不是实时生成(当请求到达服务器时)且不与特定请求相关联的内容都应被视为静态内容,并且可以托管在CDN上。在部署时,您只需将所有静态资源上传到CDN,它们将从那里提供服务。我相信nginx可以提供的任何静态服务都可以使用CDN来实现。 - Farid Nouri Neshat
如果您能接受我的答案,我将不胜感激:http://stackoverflow.com/help/someone-answers - Farid Nouri Neshat
我没有看到在CDN上托管静态部分、只有动态部分转向NGINX服务器的方法。这样的设置可能吗?对我来说,NGINX是唯一的选择,因为我们需要有东西来决定哪些查询是用于静态资源,哪些是用于动态资源。如果我漏掉了什么,请告诉我。再次感谢您的帮助! - pj_automata
使用单独的域名来存放静态资源,并将它们放在CDN上。 - Farid Nouri Neshat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接