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

时间:2014-05-31 06:48:59

标签: node.js express nginx static

由于开销,我不想使用动态gzip的库。

该网站有一些动态组件,在node.js中实现。

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

我考虑过使用express中的静态中间件来提供静态文件,以及一些URL重写中间件来有条件地提供gzip压缩文件。但是,我找不到任何条件重写模块。

我无法相信没有人这样做,或者它需要这么多的工作。我错过了什么?

另一方面,通过node.js提供静态文件太贵了吗?另一方面,使用Apache作为静态文件并运行node.js似乎也很糟糕。 AWS EC2托管的最不傻的配置是什么?

2 个答案:

答案 0 :(得分:13)

如果您想为您的客户提供最佳性能,请使用CDN。它将为您和许多其他东西照顾gzipping。如果您需要帮助,可以使用express-cdn模块。

如果您因某些原因不喜欢CDN,最好的办法就是使用nginx。我在你的问题中看到它被标记了,但是你没有提到它。 nginx比node.js快。对于nginx,您可以查看gzip-static module

如果您仍想使用node.js,那么connect-gzip-static是您最好的选择。它的工作方式与nginx-gzip-static模块几乎相同。如果所请求文件的.gz文件对应,那么它将使用该文件,否则它将回退到正常的连接静态模块。

不要忘记事先编译文件,如果你正在使用gulp,那么你也可以使用gulp-gzip。如果不只是使用gzip命令。

还有gzippo,它会动态gzips,但它也会将结果缓存到内存中。所以它只会被gzipped一次。

答案 1 :(得分:9)

此代码正在使用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-types reference

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

或它无效