使用许多小得JS、CSS文件代替一个庞大的JS或CSS文件来让代码获得更好的可维护性,这是一个很好的实践。但这样做反过来却损失了网站的性能。虽然你应该将你的Javascript代码写在小文件中并且将大的CSS文件分割到小文件中,当一个浏览器请求那些JS以及CSS文件,它却将为每一个文件产生一个请求。每一个HTTP请求将导致从你的浏览器到服务器上的一次“往返”,从响应服务器到客户端浏览器之间的等待时间称之为“延时”。因此,如果你有四个JS文件以及三个CSS文件需要被页面加载,你将要等待七次网络上的“往返”。在本国内,延时平均为70ms。所以总延时为490ms,大概半秒钟。而来自国外的访问,平均延时大概在200ms左右。因此,那意味着1400ms的时间浪费。而直到CSS与JS文件被完全加载,页面才会被完全地显示出来。所以,越长时间的延时,页面加载地越慢。
延时有多糟糕
这里有一张图片显示了,每一个请求怎样产生了“延时”,这些“延时”累加起来显著地影响了页面的加载:
你可以通过使用CDN(Content Delivery Network)来减少等待时间。然而,一个更好的解决方案是使用HttpHandler提供多个文件的一次请求,该HttpHandler整合了数个文件并且提供了一次输出。所以,代之以许多的<scropt>或者<link>标签,你只需要写一个<scropt>以及<link>标签,并将它们标记在HttpHandler中。由你来告诉handler哪些文件需要被整合,并且它提供了哪些文件的一次输出。这省去了从浏览器发出许多请求产生的延时。
这里你能看到如果你把多个JS文件以及CSS文件整合到一个输出里,有怎样的性能提升。
在通常的网页中,你将看到很多的JS引用:
而我们可以仅用一个<script>标签请求整个JS文件的集合,来代替这里的每一个<script>标签:
HttpHandler读取定义在一个配置文件中的文件名,整合所有的那些文件,并将它们一次响应到客户端。它通过gzip来压缩响应内容以此节约带宽。另外它提供一个带有cache的响应请求头来缓存响应到浏览器的Cache里,使得浏览器对之后的访问不需要再次请求它。
在请求参数中,你可以用“S”参数标识文件集合的名称,然后用“t”参数来标识content type,然后使用“v”参数来标识一个版本。因为响应被缓存了,如果你修改了文件集合中的任何一个,你将不得不增加参数“v”的值来让浏览器再次下载响应。
使用该HttpHandler,你可以这样来请求CSS文件:这里列出了你将需要怎样来定义请求的集合,在web.config中: