很早对tengine有一个concat模块可以用来做js、css合并就有所耳闻,当时也在taobao官网上看了相关的说明文档,但并未进行进一步的研究。近期在多公司站点做优化整理。发现站点上有太多的css和js请求。也就想到了tengine的这一功能。这便对tengine重新进行了认识。

首先,先走出一个误区 ,下面是tengine-cn邮件列表里的一篇邮件原文:“看了这个例子就了解了,这个所谓的合并请求只是把所有的CSS或JAVASCRIPT请求合并,必须是同一个文件类型的.我开始想多了,之前是以为CSS和JAVASCRIPT合并在一起,可以将这两种类型的文件请求合并到一个上面去”。

我以前也误以为该模块可以将css和js文件不分类型的合并,但细一想,确实这样的合并,意义并不大。不过从官方的参数上看,也提供了CSS与JS请求合并的功能。具体可以看concat_unique参数的用法,但不建议这样做,还是建议合并同类型的文件。

其次,第二个误区,该模块并不会对合并后的内容做压缩处理,其所做的只不过是将多个CSS请求(或JS请求)合并到一个请求里去。对请求的内容并不会做任何更改。

接下来,看下其使用示例。其官方也提供了相应的帮助文档。上面的说明也比较清楚了———— 该模块类似于apache中的mod_concat模块,用于合并多个文件在一个响应报文中。请求参数需要用两个问号(’??’),参数中某位置只包含一个‘?’,则’?’后表示文件的版本。

该模块默认是关闭的,不过可以在http, server, location三个位置通过设置concat on启用该模块功能。下面以一个js文件的合并为例:

1location ~ /js/ {
2    concat on; #启用合并
3    concat_max_files 20; #最多合并的文件数
4}

配置完成后,重载nginx.conf配置。而如果我原先的页面里的js调用假如像下面的一样:

1<script src="https://blog.361way.com/static/js/jquery.js"></script>
2<script src="https://blog.361way.com/static/js/jquery.cookie.js"></script>
3<script src="https://blog.361way.com/static/js/head.js"></script>
4<script src="https://blog.361way.com/static/js/home.js"></script>

但启用该功能,我们就可以写成下面的样式:

1<script src="http://etosun.com/static/js/??jquery.js,jquery.cookie.js,head.js,home.js"></script>