本文向您介绍如何通过在您的 CSS 和 JavaScript 文件中 — 两种易于优化的常见资源,使用社区中提供的工具即可完成优化 — 优化空间使用来实现更高的性能。然而,在继续之前,有一点是很重要的,压缩 CSS 和 JavaScript 文件只是为了让您的 web 应用程序 “轻巧” 的诸多操作其中的两个技术。关于优化其他资源(比如,HTML 和图像)的 技术,参阅 参考资料 获取更多信息。
为了从本文中获得最大收益,您需要安装下列工具:
- 一个文本编辑器
- Java™ Runtime Environment 1.4 或者更新版本(见 参考资料)
问题:空白内容
当开发人员使用 CSS 或 JavaScript 文件工作时,空白内容通常是一件好事。空白内容包括缩进文件所使用的字符,增强可读性的间距、以及为了在文章的不同部分添加一个可视间隔而插入的额外空行。空白内容使文件易于阅读和维护。考虑 清单 2 中的 CSS 文件,其中有适当数量的空白内容(和注释),有助于开发人员理解 CSS 代码的意图。
从这一点上来说,将文件变得更小作为问题的一个长期解决方案是不可行的,因为文件很有可能在将来会被修改。如果将空白内容和注册全部删除,CSS 和 JavaScript 代码就很难阅读。
问题是逐渐增加的空白导致文件不断增大。每个空白行、缩进和括号之间的空格至少占用一个额外字符,这对于 CSS 或 JavaScript 代码的正确解析来说实际上并不需要。首先,一两个空白没有什么大不了的,但是小数量乘以一个很大倍数时就变成很大的数量了。
考虑这样一个文件,其中额外空白总计 5KB。如果您的网站每天的点击率是 1000,每天节省 5KB 每个月就可以节约大约 146 MB((5K * 1000 * 30) / 1024 作为粗略估计)。就这而言,该文件的点击量还是相对保守的估计,实际空白成本可能还会增加。
此外,下载您文件的用户必须等待文件的下载。尽管许多用户在他们第一次访问您的网站后可能就有缓存的 CSS 或 JavaScrip 文件,性能仍然会对他们的第一次访问造成负面影响。如果您可以减少您 CSS 和 JavaScript 文件,即使每次 1 KB,您都可以减少数千字节的浏览器必须加载的数据。
回页首
解决方案:压缩
要解决问题并从小资源获益,一个显而易见的解决方案是从您的 CSS 和 JavaScript 文件删除额外元素,比如注释和空白。但是,由于在开发过程中从您的文件删除注释和空白不 可行,一个较好的解决方案是 “分级” 您的网站资源、优化它们、然后将其发布。
编写一个删除空白字符的定制脚本最初听起来是一个可行的解决方案,但是在 CSS 和 JavaScript 文件中本身都有很重要的空白。因此任何删除空白和压缩文件的工具必须是足够智能,可以区别哪些语言中哪些空白是重要的。
幸运的是,在社区中已经可以找到这种工具了,它们已经经过资源(比如 CSS 和 JavaScrip 文件)压缩测试了。其中一个工具就是 YUI Compressor,一个来自 Yahoo!® Developer Network 的可用工具(链接见 参考资料)。
YUI Compressor
YUI 压缩器是一个使用 Java 编写的程序,拥有 Berkeley Software Distribution 许可证。YUI Compressor 可以缩小(压缩)您的 CSS 和 JavaScript 代码,这样您无需自己编写工具就可以享受小资源带来的益处了。
下载 YUI Compressor,然后提取文件,放置到一个容易访问的位置。归档文件包括完整源代码和一个用于构建 YUI Compressor 的 Apache Ant 脚本(build.xml)。然而,如果您不想构建该文件,您可以在 build 目录中找到 yuicompressor-{version}.jar(见 图 1)。
图 1. 归档文件目录 YUI Compressor 的 JAR 文件是自带的,您可以将该文件复制到别的项目,通过输入以下命令来执行:
java -jar yuicompressor-2.4.2.jar --help
|
除了下载该文件,还有一种方法,使用 清单 1 中的 XML 文件来将 YUI Compressor 添加到您的 Apache Maven pom.xml 或 Apache IVY 文件。
清单 1. 添加 YUI Compressor 到 Maven 或 IVY
<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>2.3.6</version>
</dependency>
|
将 -h
传递参数到 yuicompressor.jar 文件,显示 YUI Compressor 的基本用法信息。
回页首
压缩 CSS
清单 2 是一个为便于开发人员维护而优化的 CSS 示例,它包含注释,且被用空白格式化了。
清单 2. 为维护而优化的 CSS 文件
/* The main body for the page. */
body
{
font-family : Tahoma,Geneva,sans-serif;
background-color : #e2e2e2;
margin : 0 0 0 0;
padding : 0 0 0 0;
}
/* The header and header elements */
#header, #content, #footer
{
padding 0;
margin 0;
width : 100%;
min-width : 600px;
}
#header a
{
text-decoration : none;
border : none;
}
#header
{
background : #fff url('images/lb-h.jpg') repeat-x top;
height : 115px;
}
#header img.logo
{
position : absolute;
border : none;
margin-top : 10px;
margin-left : 50px;
z-index : 1000;
}
/* Top banner... */
#banner
{
margin : 0;
padding : 0;
background-color : #fff;
border-bottom : 1px solid #bebebe;
height : 265px;
text-align : center;
}
/* This is the main content */
#content
{
background : #fff url('images/lb-g.jpg') repeat-x top;
min-height : 450px;
display : inline-block;
clear : both;
}
#footer
{
border-top : 3px solid #bebebe;
clear : both;
min-height : 100px;
font-size : smaller;
}
#followicons
{
margin-left : 50px;
}
|
要压缩一个 CSS 文件,运行以下命令:
java -jar yuicompressor-2.4.2.jar -o sample.min.css sample.css
|
文件被压缩之后,输出看起来如 清单 3 所示。清单是为了便于阅读进行了格式化的,但是 YUI Compressor 输出没有换行:您看到的都是在一行。
清单 3. 压缩后的 CSS 文件
body{font-family:Tahoma,Geneva,sans-serif;background-color:#e2e2e2;margin:0;padding:0;}
#header,#content,#footer{padding 0;margin 0;width:100%;min-width:600px;}#header a{
text-decoration:none;border:none;}#header{background:#fff url('images/lb-h.jpg') repeat-x
top;height:115px;}#header img.logo{position:absolute;border:none;margin-top:10px;
margin-left:50px;z-index:1000;}#banner{margin:0;padding:0;background-color:#fff;
border-bottom:1px solid #bebebe;height:265px;text-align:center;}#content{background:#fff
url('images/lb-g.jpg') repeat-x top;min-height:450px;display:inline-block;clear:both;}
#footer{border-top:3px solid #bebebe;clear:both;min-height:100px;font-size:smaller;}
#followicons{margin-left:50px;}
|
除了简单地删除空白和注释之外,YUI Compressor 还对您的 CSS 执行大量其他优化来使文件更小。那么,为了使文件更小究竟对 CSS 代码做了什么呢?
-
删除空白。任何不必要的空白,像缩进、空行,以及元素和括号之间的空格都被删除了。如果,CSS 的空白对于正常运行是必需的,那么会被保留下来(见 清单 4)。
清单 4. 删除多余的空白
/* Before */
#header a
{
text-decoration : none;
border : none;
}
/* After */
#header a{text-decoration:none;border:none;}
|
-
删除注释。如果在您的 CSS 文件中必须包含注释,比如,公司的版权通告,您可以在注释中输入一个感叹号(
!
),通知 YUI Compressor 保留它(见 清单 5)。
清单 5. 除必要注释外,全部删除
/* Before */
/* This is the main content */
#content
{
background : #fff url('images/lb-g.jpg') repeat-x top;
min-height : 450px;
display : inline-block;
clear : both;
}
/* After */
#content{background:#fff url('images/lb-g.jpg') repeat-x top;min-height:450px;
display:inline-block;clear:both;}
|
-
删除空声明。YUI Compressor 从 CSS 中删除空声明,除非它们对于正常运行是必需的(见 清单 6)。
清单 6. 删除空声明
/* Before */
#followicons
{
margin-left : 50px;
}
#followicons a
{
}
/* After */
#followicons{margin-left:50px;}
|
-
执行其他优化。这些优化包括减少十进制数的前置零,缩短 0 值和 16 进制值(见 清单 7)。
清单 7. 执行其他优化
/* Before */
body
{
font-family : Tahoma,Geneva,sans-serif;
background-color : #ffee22;
margin : 0 0 0 0;
padding : 0 0 0 0;
}
/* After */
body{font-family:Tahoma,Geneva,sans-serif;background-color:#fe2;margin:0;padding:0;}
|
累积起来,YUI Compressor 对 CSS 代码进行的这些优化使您的文件小了不少呢!
回页首
压缩 JavaScript 代码
您可以使用 YUI Compressor 来压缩 JavaScript 代码。清单 8 显示了一个包含注释和额外格式的文件。
清单 8. 一个便于维护而格式化的 JavaScript 文件
/*
* Creates a cookie on the system with the given name,
* value, and for the given number of days.
*/
function createCookie(name, value, days) {
if (days != null)
{
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
var expires = "; expires=" + date.toGMTString();
}
else
{
var expires = "";
}
document.cookie = name + "=" + value + expires + "; path=/";
}
|
要在 JavaScript 文件上运行 YUI Compressor,执行以下命令:
java -jar yuicompressor-2.4.2.jar -o functions.min.js functions.js
|
YUI Compressor 对文件进行优化之后,看起来像 清单 9 这样。
清单 9. 压缩的 JavaScript 文件
function createCookie(c,d,e){if(e!=null){var b=new Date();b.setTime(b.getTime()+(e*24*60*
60*1000));var a="; expires="+b.toGMTString()}else{var a=""}document.cookie=c+"="+d+a+
"; path=/"};
|
YUI Compressor 添加到 Mozilla Rhino(见 参考资料)项目,并使用项目中代码标记 JavaScript 文件。Rhino 是一个执行 JavaScript 代码的 Java 实现,被设计用于在 Java 应用程序中提供扩展点,通过启动这些扩展点来执行 JavaScript 代码。
由于文件是使用支持 JavaScript 执行的库来进行标记的,那么它们将会被安全的编译成 JavaScript 代码,用与编写方式相同的方法来执行。其他搜索 — 替换工具用来缩小代码,比如这些使用规则表达式的工具,如果所用的规则表达式不是足够精细,那么将会出现误差。
以下优化是在 JavaScript 文件中执行的:
-
删除空白。从 JavaScript 代码中删除所有不重要的空白,包括新行。
-
删除注释。从 JavaScript 文件中删除所有注释,除了这些
C
风格的注释,以 /*!
序列开始的。如果公司版权或者其他信息必须保留在文件中,务必使用该序列包含您的注释内容。
-
重命名 Method-scoped 变量。除非您使用 YUI Compressor 命令的
--nomunge
选项,否则 YUI Compressor 将自动缩短 JavaScript 文件中的变量名。(将变量声明单独留在函数外,假设它们可能会用于其他地方)。由于 JavaScript 语言中的变量名仅需至少一个字符 ,就能为您的 JavaScript 文件节省相当多字符。替换变量稍微混淆 JavaScript 代码,但是由于您不需要修改代码版本,应该问题不大。
-
删除分号。像压缩 CSS 一样,一些不重要的分号(
;
)将被从 JavaScript 代码中删除。
-
其他选择。
--line-break
选项对于分离文件可能是重要的,因此这一行不能太长。(优化时 YUI Compressor 会删除换行符。)
回页首
看看优势
要想查看压缩的优势,您可以使用不同的工具,其中两个是构建在浏览器中,这使得使用它们比使用分析工具方便得多:Google® Chrome Web 浏览器的开发人员工具和 Mozilla® Firefox 的 Firebug 插件。这两个工具都向您展示了下载的附加资源以及文件大小和下载它们浏览器所用的时间。
图 2 是一个 Chrome 开发人员工具分析一个页面的示例。(要访问这些工具,在您的浏览器中单击 Tools > Developer Tools。)
图 2. Chrome 浏览器附带的开发人员工具 图 3 展示了 Firefox 中的 Firebug 插件分析同一页面 。
图 3. Firebug 插件 如果您使用一个自动工具(下一节将会介绍),您就可轻松地获取一个使用旧文件的 URL 和另一个包含压缩文件的 URL(例如,http://localhost/orig
和 http://localhsot/minified
)。您可以使用这些工具来对您的 web 应用程序进行基本的分析,就会知道压缩您的 CSS 和 JavaScript 文件会有多大的不同。刚开始差异可能很小,但做一些数学运算,就能明白执行优化比起置之不理,长期效果是多么的明显。
回页首
自动化和集成
要想自动完成压缩,将它作为一个步骤添加到文件分段和执行测试之间。清单 10 中的 Ant 文件证实了如何使用 Ant 自动完成操作。
清单 10. 使用 Ant 自动压缩
<?xml version="1.0" encoding="utf-8" ?>
<project name="my-web-site" default="usage" basedir=".">
<property name="source.dir" value="${basedir}/application" />
<property name="staging.dir" value="${basedir}/staging" />
<macrodef name="yuicompress">
<attribute name="filename" />
<sequential>
<java jar="${basedir}/tools/yuicompressor-2.4.2.jar" fork="true">
<arg value="${source.dir}/styles/@{filename}" />
<arg value="--type" />
<arg value="css" />
<arg value="-o" />
<arg value="${staging.dir}/styles/@{filename}" />
</java>
</sequential>
</macrodef>
<target name="prepare-deploy">
<echo level="info" message="Preparing files for deployment..." />
<!-- minify the CSS -->
<yuicompress filename="main.css"/>
</target>
<!-- The rest of the build script... -->
</project>
|
您也可以使用一个 shell 脚本,Windows PowerShell™ 脚本,或者批处理文件来自动完成这一操作。
一旦文件被正确分段,您就可以根据分段代码运行您的测试了,如果可以的话。如果您没有通过单元测试验证您定义的 JavaScript 代码,您就应该考虑它。参阅 参考资料 ,获取介绍 web 应用程序 UI 测试的信息链接。
您也可将 YUI Compressor 和 IDE 整合,比如 Eclipse,这样构建行为可以自动为您生成一个压缩文件。直接集成 Eclipse 最大的缺点就是任何添加到 Eclipse 的单个构建器只可以优化一个文件,除非构建器调用一个脚本(比如,清单 10 中的 Ant 脚本)来压缩多个文件。
要为您的项目将 YUI Compressor 添加到 Eclipse 中,在 Eclipse 中选择项目,然后单击 Project > Properties 来向项目中添加一个新构建器。从那里开始执行以下步骤:
- 从属性列表中选择 Builders,然后单击 New 来添加一个新构建器(见 图 4)。
图 4. 将 YUI Compressor 作为一个构建器添加到 Eclipse
- 选择 Program,然后单击 OK(见 图 5)。
图 5. 添加一个构建器运行程序
- 输入
Compress
作为发布配置的名称。
- 输入您 Java 文件夹的路径(例如,/usr/bin/java)。
- 通过单击 Variables 和添加
${project_loc}
,使用项目位置作为工作目录。
- 为命令添加参数,包括 yuicompressor-{version}.jar 文件名。在 图 6 所示的示例中,JAR 文件被包含在项目的工具目录下。
图 6. 添加工具参数
- 单击 Refresh 选项卡,然后选择 Refresh resources upon completion。您只需要刷新包含源代码的项目即可。
如果您构建了一个 Ant 脚本来执行压缩,那么您可以向您的项目中添加一个构建器来以同样的形式调用 Ant 脚本。参阅 参考资料,获取整合 Ant 构建器和您的 Eclipse 环境的示例链接。
回页首
结束语
YUI Compressor 是一个可以用来优化您的 CSS 和 JavaScript 源文件的工具,使它们变得更小。小的原文件为您带来了许多好处,节省了带宽、为您的访问提供更快的加载时间。尽管对于一个文件节约似乎微不足道,但是如果大量使用,累计起来相当可观。
如果添加到分段步骤中,YUI Compressor 将可以在不影响文件开发和维护的情况下优化您的 CSS 和 JavaScript 文件。压缩 CSS 和 JavaScript 文件只是优化资源,使您的 web 应用程序更轻巧的整体工作中的两个技术。
分享到:
相关推荐
BAVLogbook是一个基于C#.NET开发的Web应用程序,专为模拟飞行爱好者设计,用于追踪和记录他们的“英国航空虚拟航班”体验。这个项目展示了如何利用.NET框架和C#编程语言来创建一个功能丰富的Web应用,特别是针对...
WebStation是一个常见的NAS应用,它允许用户将NAS设备转变为一个Web服务器,可以托管网页、应用程序甚至是游戏。在NAS上安装并配置WebStation后,用户可以通过设置端口映射,将《飞得更高》游戏暴露到外网,实现远程...
Google App Engine 是一个由 Google 提供的平台,允许开发者构建并运行基于 Web 的应用程序。这个平台提供了服务器、数据库和其他服务,使得开发者无需关心底层基础设施的管理,而专注于应用的开发。本文档将详细...
车票查询系统是一种常见的Web应用程序,它允许用户实时查询火车或飞机等交通工具的可用座位、票价及行程信息。本项目是基于Web服务和AJAX技术实现的一个简化的车票查询系统,旨在展示如何将这两种技术有效地结合起来...
C#结合.NET框架,提供了丰富的类库和API,使得开发者能够快速构建功能丰富的Web应用程序。在渐飞网站管理系统中,C#被用来编写后台逻辑,处理数据库交互、用户权限控制、内容发布和管理等关键功能。C#的面向对象特性...
Chrome浏览器插件,也被称为扩展程序,是基于Web技术(如HTML、CSS和JavaScript)构建的小型应用程序,它们可以与Chrome浏览器无缝集成,增强或改变浏览器的功能。用户可以在Chrome网上应用店下载并安装这些插件。 ...
描述中提到"支持CGI",CGI即Common Gateway Interface,是一种通用网关接口,它能让Web服务器与外部应用程序进行交互,从而扩展服务器的功能,如执行动态网页、数据库查询等。这意味着该Web服务器不仅能够服务静态...
Struts 2是一个基于MVC模式的Web应用程序框架,提供了一个灵活的架构,用于开发Web应用程序。Spring是一个轻量级的Java应用程序框架,提供了一个通用的架构,用于开发企业级应用程序。Hibernate是一个基于Java的持久...
网页程序是一种基于Web技术的互动应用,用户通过浏览器即可访问和使用。在这个“浪漫表白网页程序”中,我们可以深入探讨一些关键的Web开发技术、设计理念以及如何创建一个具有情感表达功能的网页。 首先,让我们...
JavaScript作为Web开发中的关键语言,是Foresite iPad应用程序的基础。JavaScript是一种轻量级的解释型编程语言,主要负责网页的动态效果和交互功能。在Foresite应用中,JavaScript不仅用于处理用户输入和响应事件,...
Laravel 是一个具有表现力、优雅语法的 Web 应用程序框架。 我们相信发展必须是一种... 出色的控制容器反转、富有表现力的迁移系统和紧密集成的单元测试支持为您提供了构建任何应用程序所需的工具。 官方文档 整个框架
这个项目展示了如何将这些技术结合起来创建一个激动人心的在线游戏。 ...通过研究和开发这样的游戏,可以深入了解Web交互性,提升编程技能,并且为构建更复杂、更具吸引力的Web应用程序打下基础。
C#是一种广泛应用于Windows桌面应用开发、游戏开发、Web应用以及移动应用的编程语言。在这个“炮打飞机”项目中,我们将深入探讨如何利用C#来构建一个简单的GUI游戏,通过交互式界面控制大炮发射炮弹,击落飞行中的...
HTML5是一种先进的网页开发技术,它极大地扩展了Web应用程序的功能,使得开发者能够创建更富交互性和动态性的网页。SVG(Scalable Vector Graphics)是HTML5中的一个关键元素,它支持矢量图形,这意味着无论放大多少...
【cesium-apps: 使用铯创建的应用程序】 Cesium 是一个强大的开源JavaScript库,专用于构建3D地球和地理空间应用程序。它提供了丰富的交互式3D地球可视化功能,包括地形、建筑物、卫星图像以及各种数据的叠加显示。...
PowerBuilder 8.0 是一款由Sybase公司开发的强大的可视化数据库应用开发工具,主要用于构建企业级的桌面和Web应用程序。这款工具以其易用性、高效性和灵活性在20世纪90年代至21世纪初的IT界广受欢迎。下面我们将深入...
这个项目特别针对Angular框架进行了优化,使得这种视觉上的趣味性能够无缝集成到现代Web应用程序中。 首先,jQuery-fly是一个轻量级的插件,它的主要功能是创建物体飞行、滑动等动态效果。在本项目中,"小球"代表...
"web-development"这个标题暗示我们将探讨与构建Web应用程序相关的技术、工具和实践。在这个主题下,Pascal编程语言的标签引入了一个有趣的角度,因为它并非通常与Web开发紧密关联的语言,但我们可以看到它如何适应...
在ASP.NET中,XML文档操作是一项重要的技能,它允许开发者在服务器端处理和解析XML数据,从而构建功能丰富的Web应用程序。XML(eXtensible Markup Language)是一种结构化数据存储格式,广泛用于数据交换和配置文件...
Python是一种开源、简单易学的高级编程语言,具有广泛应用场景,如Web应用开发、操作系统管理、科学计算、游戏开发等。Python的语法结构清晰,面向对象编程特性使得代码易于编写和维护。 #### Pygame游戏开发模块 ...