1 构建过程
JavaScript 代码不能直接放在浏览器中,原因如下:
- 知识产权 - 如果把带有完整注释的代码放在 web 上,那么别人就更容易知道你的意图,对它进行利用,甚至发现安全漏洞!
- 文件大小 - 开发的代码要容易阅读,这样才能更好地进行维护,但这对性能不利。
- 代码组织 - 编码代码时要考虑到可维护性,但对性能不利。
所以我们要定义一个构建过程。
JavaScript 代码编写时,也要遵循面向对象语言中的典型模式:将每个对象和自定义类型放在单独的文件中。这样可以确保每个文件只包含少量的代码,代码少更容易修改,不是吗O(∩_∩)O~
记住,将代码分离为多个文件,只是为了提高可维护性。真正部署的时候,要把这些文件合并为几个或一个归并后的文件。尽可能减少 JavaScript 的文件数,因为 HTTP 请求是 Web 中的主要性能瓶颈之一。而且使用 <script>
标记引用 JavaScript 文件是一个阻塞操作,当代码下载并运行的时候会停止其他的下载。
因为 Ant 简便的文件处理能力,所以非常适合 JavaScript 编译系统。我们可以很方便地获得目录中的所有文件,然后将其合并为一个文件:
<project name="JavaScript Project" default="js.concatenate">
<!-- 输出的目录-->
<property name="build.dir" value="./js"/>
<!-- 包含源文件的目录-->
<property name="src.dir" value="./dev/src"/>
<!-- 合并所有 JS 文件的任务-->
<target name="js.concatenate">
<concat destfile="${build.dir}/output.js">
<!-- 需要合并的文件-->
<filelist dir="${src.dir}/js" files="a.js, b.js"/>
<!-- 指定要添加的目录中的其他文件,除了 a.js, b.js-->
<fileset dir="${src.dir}/js" includes="*.js" excludes="a.js/ b.js"/>
</concat>
</target>
</project>
安装好 Ant 之后,进入 build.xml 文件所在的目录,然后运行:
ant
就可以生成合并后的 JavaScript 文件啦,是不是很简单O(∩_∩)O~
2 压缩
文件压缩涉及这两部分:
- 代码长度 - 浏览器所需解析的字节数。
- 配重 - 实际从服务器传送到浏览器的字节数。
在现代的 web 上,这两部分很少相等。
2.1 文件压缩
我们一般使用压缩工具来减少 JavaScript 文件的大小。
压缩工具一般做这些事:
- 删除额外的空白(包括换行);
- 删除所有注释;
- 缩短变量名。
这里介绍 YUI 压缩器,它是以 Java 的 jar 文件发布的。下载之后,我们可以使用命名行来执行它,也可以在 Ant 中直接进行配置使用:
<!-- YUI compressor 路径-->
<property name="yuicompressor.jar" value="F:\soft\2017\yuicompressor-2.4.8.jar"/>
...
<!-- 压缩 -->
<target name="js.compress">
<apply executable="java" parallel="false">
<fileset dir="${build.dir}" includes="output.js"/>
<arg line="-jar"/>
<arg path="${yuicompressor.jar}"/>
<arg line="-o ${build.dir}/output-min.js"/>
</apply>
</target>
所有的 JavaScript 文件被部署到生产环境之前,都要使用压缩工具进行压缩哦O(∩_∩)O~
2.2 HTTP 压缩
之前说过,配重指的是实际从服务器传送到浏览器的字节数。现代的服务器和浏览器都有压缩功能。所以服务器端可以使用服务端技术事先压缩 JavaScript 文件,然后根据规范,把压缩信息放入 HTTP 头中,然后浏览器就可以根据头信息,选择合适的格式进行解压缩啦O(∩_∩)O~
这样做的结果是网络中实际传输的字节数大大减少咯。
对于 Apache Web 服务器,可以使用 mod_gzip(1.3.x)或者 mod_deflate(2.0.x)对 JavaScript 文件进行自动压缩哦O(∩_∩)O~
据统计,这两个模块可以节省大概 70% 的 JavaScript 文件大小哦,因为 JavaScript 文件都是文本文件,所以压缩率才这么高哦O(∩_∩)O~
虽然服务器必须对每个请求压缩文件,而且浏览器也要花时间解压缩,但总体来说,这个微小的代价还是值得的。