JavaScript/CSS 压缩与 IIS 压缩





1.00/5 (1投票)
压缩或最小化组件的方法
引言
有很多时候,我们都在努力提高网站的性能,因为在实际情况中,应用程序会变得非常复杂,包含大量的 JavaScript 和庞大的 CSS 文件,在低带宽的情况下下载这些信息需要花费很长时间。在这里,我们可以不修改任何代码,仅通过以下想法来提高性能。
背景
在这里,我将介绍一些当今常用的想法,但仍然有很多人不知道。我将涵盖两种压缩 Web 应用程序内容的方法。
- JavaScript 和 CSS 的压缩/最小化
- IIS 压缩
我还提供了一些我获取信息的链接,在这里我将简要介绍一下。
1. JavaScript 和 CSS 的压缩/最小化
改进页面或 Web 应用程序的工程设计通常会带来最大的效益,这应该始终是首要策略。在具备正确设计的基础上,还有许多改进性能的次要策略,例如代码的最小化。
JavaScript 和 CSS 最小化的目标始终是在保留代码功能特性的同时,减小其整体字节大小(包括原始大小和 gzip 压缩后的大小,因为大多数从生产 Web 服务器提供的 JavaScript 和 CSS 在 HTTP 协议中都会被 gzip 压缩)。YUI Compressor 是一个 JavaScript 最小化工具,旨在实现 100% 安全,并比大多数其他工具提供更高的压缩率。
YUI Compressor 是用 Java 编写的(需要 Java >= 1.4),并依赖 Rhino 来分词源 JavaScript 文件。它首先分析源 JavaScript 文件以了解其结构。然后,它输出词元流,尽可能多地省略空白字符,并在适当的情况下将所有局部符号替换为 1(或 2,或 3)个字母的符号(面对诸如 with
之类的 危险功能时,YUI Compressor 会采取防御性措施,不会混淆包含危险语句的任何作用域)。CSS 压缩算法使用一组经过精密调整的正则表达式来压缩源 CSS 文件。YUI Compressor 是开源的,因此请随时查看其代码以确切了解其工作原理。
下面的命令行将最小化文件 myfile.js 并输出文件 myfile-min.js。
java -jar yuicompressor.jar myfile.js -o myfile-min.js
由于这是一个命令行工具,您始终可以创建一个 Nant 目标,并通过编写以下脚本来自动化压缩过程
<target name="yuicompress"
description="compresses all CSS and JS resources for the specified directory">
<foreach item="File" in="${arg.dir.in}" property="file">
<echo message="Compressing: ${file}"/>
<exec program="java" if="${string::ends-with(file, '.js') or
string::ends-with(file, '.css')}">
<arg value="-jar"/>
<arg value="yuicompressor-2.3.5.jar"/>
<arg value="${file}"/>
<!-- dump to output directory if specified -->
<arg value="-o" if="${property::exists('arg.dir.out')}"/>
<arg value="${arg.dir.out}\${path::get-file-name(file)}"
if="${property::exists('arg.dir.out')}"/>
</exec>
</foreach>
</target>
2. IIS 压缩
如果您的网站使用大量带宽,或者您希望更有效地使用带宽,请考虑启用 HTTP 压缩。无论您的内容是从本地存储还是从 UNC 资源提供,HTTP 压缩都能提供 IIS 和支持压缩的浏览器之间更快的传输速度。如果您的网络带宽受限,HTTP 压缩会很有益,除非您的处理器使用率已经非常高。
IIS 提供以下压缩选项:
- 仅静态文件
- 仅动态应用程序响应
- 静态文件和动态应用程序响应均启用
动态处理可能会影响 CPU 资源,因为 IIS 不会缓存动态输出的压缩版本。如果为动态响应启用了压缩,并且 IIS 收到对包含动态内容的文件的请求,则 IIS 发送的响应每次请求时都会被压缩。由于动态压缩会消耗大量的 CPU 时间和内存资源,因此仅在网络连接缓慢但 CPU 时间充足的服务器上使用。
压缩的静态响应可以缓存,因此不会像动态响应那样影响 CPU 资源。
压缩文件下载速度更快,这使得它们对于任何使用带宽受限网络连接(例如,拨号连接)的浏览器的性能尤其有益。
更改静态文件或动态文件的压缩级别。压缩级别从 0 到 10。较高的压缩级别会生成更小的压缩文件,但会使用更多的 CPU 和内存。较低的压缩级别会生成稍大的压缩文件,但对 CPU 和内存使用的影响较小。要配置除静态文件的 10 和动态文件的 0 以外的压缩级别,请编辑 HcOnDemandCompLevel
和 HcDynamicCompressionLevel
元数据库属性。
对于动态压缩,提高压缩级别可能会显著增加 CPU 使用率。零的默认压缩级别使用的 CPU 资源最少,如果网络带宽足够,可以提高性能。仅当您需要更多网络带宽并有足够的 CPU 容量来处理额外负载时,才将动态压缩级别提高到零以上。
当 Web 服务器处理带有“Accept-Encoding:
”请求头的请求时,它可以选择发送一个压缩页面或一个标准的非压缩页面。如果 Web 服务器决定发送一个压缩页面,它会响应一个名为“Content-Encoded:
”的响应头,其值为编码类型。例如,“Content-Encoded: gzip
”。浏览器使用此头来确定内容是否已编码,并在呈现给用户之前对其进行解压缩。

压缩策略
当服务器的 CPU 负载不高时,最简单的压缩策略是为服务器上的所有站点和站点元素(目录和文件)启用静态和动态压缩。这被称为全局 HTTP 压缩。但是,当服务器的 CPU 负载很高时,您可能不想为服务器上的所有站点和站点元素启用压缩。
根据 CPU 使用情况,有两种策略可以微调哪些站点和站点元素将被压缩:
- 全局启用压缩,然后有选择地为特定站点或站点元素禁用压缩。
- 保持全局压缩禁用状态,然后有选择地为特定站点或站点元素启用压缩。
以下是 IIS 压缩的最佳设置:
<IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/deflate"
HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"
HcCreateFlags="0"
HcDoDynamicCompression="TRUE"
HcDoOnDemandCompression="TRUE"
HcDoStaticCompression="TRUE"
HcDynamicCompressionLevel="9"
HcFileExtensions="htm html xml css txt rdf js"
HcOnDemandCompLevel="9"
HcPriority="1"
HcScriptFileExtensions="asp cgi exe dll aspx asmx" >
</IIsCompressionScheme>
<IIsCompressionScheme Location "/LM/W3SVC/Filters/Compression/gzip"
HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"
HcCreateFlags="1"
HcDoDynamicCompression="TRUE"
HcDoOnDemandCompression="TRUE"
HcDoStaticCompression="TRUE"
HcDynamicCompressionLevel="9"
HcFileExtensions="htm html xml css txt rdf js"
HcOnDemandCompLevel="9"
HcPriority="1"
HcScriptFileExtensions="asp cgi exe dll aspx asmx" >
</IIsCompressionScheme>
<IIsCompressionSchemes Location "/LM/W3SVC/Filters/Compression/Parameters"
HcCacheControlHeader="max-age=86400"
HcCompressionBufferSize="8192"
HcCompressionDirectory="%windir%\IIS Temporary Compressed Files"
HcDoDiskSpaceLimiting="FALSE"
HcDoDynamicCompression="TRUE"
HcDoOnDemandCompression="TRUE"
HcDoStaticCompression="TRUE"
HcExpiresHeader="Wed, 01 Jan 1997 12:00:00 GMT"
HcFilesDeletedPerDiskFree="256"
HcIoBufferSize="8192"
HcMaxDiskSpaceUsage="99614720"
HcMaxQueueLength="1000"
HcMinFileSizeForComp="1"
HcNoCompressionForHttp10="FALSE"
HcNoCompressionForProxies="FALSE"
HcNoCompressionForRange="FALSE"
HcSendCacheHeaders="FALSE" >
</IIsCompressionSchemes>
历史
- 2009 年 6 月 4 日:初次发布