出处:http://www.cnblogs.com/catprayer/archive/2011/08/03/2126719.html


想了老半天不知道说什么“闲话”是好,不如直接切入正题吧,下面的内容就当是最近开发学习的一个总结:来说说前端代码的开发及其部署。

部署工具:1,Ant;2,YUI Compressor;都是开源的小东东,但是的确很强也很大!直接猛击链接传送至官网。

这里我是用的是 Apache Ant 1.8.2YUI Compressor 2.4.6;(测试环境是Windows)。

---

为了“逼真”地说明问题,所以模拟一个开发环境及其文件结构如下:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署

DepoymentTest 文件夹作为项目的根目录,build 中是项目的部署工具,build_output 是部署(压缩及其合并)之后可以上线的代码,web 则是整个项目的前端源代码:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_02

初始的 build_output 文件夹是空的,因为我们还没有部署代码,/web/asset 作为真正的线上源码,/web/src 则作为开发代码(最初的源代码,人可读),main.html 是项目的主页面:

先来学习下整个项目的主页面代码(main.html):

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>Deployment Test</title>
		<link rel="stylesheet" type="text/css" href="./asset/css/all.css" />
	</head>

	<body>
		<div id="MainContent">
			<!--页面内容-->
		</div>
		<script type="text/javascript" src="./asset/js/all.js"></script>
	</body>
</html>

可见,整个页面只包含了一个 all.css 样式文件和一个 all.js 文件,stylesheet 文件在常规位置,而 javascript 文件则放到了 </body> 结束标签的上方,这样做有利于页面的响应速度,如果放到 stylesheet 文件的下面(常规思路),由于 javascript 文件是一个由许多 js 文件压缩而成的总文件,在浏览器渲染整个页面之前,需要加载并执行完整个 js 文件,可能会引起页面加载时的短暂空白,降低用户体验,而上面的方式则是一种可以防止这种情况的方法,而且不用担心 DOM 还未加载完就执行 js 的问题等等。

asset 及其 src 仍旧是常见的文件部署结构:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_03

main.html 包含了 ./asset/css/all.css 及其 ./asset/js/all.js,这样做的话,我们就不需要一直修改 main.html 文件了,因为实际上,上线以后的 main.html 仍旧引用的是这两个路径的文件,只不过内容被替换掉了而已。

关于 js:在开发阶段,我们可以使用 document.write 语句来引入其余的 js 文件;

关于 css :在开发阶段,同样使用 css 的 @import 语句来引入其余的 css 文件;

如下测试源代码:

./asset/css/all.css :

/*
 * DeploymentTestCSSFile
 */

/*Base*/
@import '../../src/css/jquery.ui.core.css';

/*UI*/
@import '../../src/css/jquery.ui.button.css';
@import '../../src/css/jquery.ui.dialog.css';
@import '../../src/css/jquery.ui.accordion.css';
@import '../../src/css/jquery.ui.autocomplete.css';

包含了我们需要的 css 文件。

./asset/js/all.js :

/*
 * DeploymentTestJSFile
 */

/*Base*/
document.write('<script type="text/javascript" src="src/js/jquery-1.5.1.js"></script>');
document.write('<script type="text/javascript" src="src/js/jquery.ui.core.js"></script>');
document.write('<script type="text/javascript" src="src/js/jquery.ui.widget.js"></script>');

/*UI*/
document.write('<script type="text/javascript" src="src/js/jquery.ui.draggable.js"></script>');
document.write('<script type="text/javascript" src="src/js/jquery.ui.droppable.js"></script>');
document.write('<script type="text/javascript" src="src/js/jquery.ui.button.js"></script>');
document.write('<script type="text/javascript" src="src/js/jquery.ui.dialog.js"></script>');
document.write('<script type="text/javascript" src="src/js/jquery.ui.accordion.js"></script>');
document.write('<script type="text/javascript" src="src/js/jquery.ui.autocomplete.js"></script>');

包含了我们需要的 js 文件。

小说明:这里的 css 文件及其 js 文件只当为测试用,并没有实际的意义,但是要注意,js 的引入顺序有一定的依赖性,例如:jquery.ui.core.js 依赖于 jquery-1.5.1.js,这种依赖性关联着后面的压缩顺序,后面有详细的解释。

这个测试中的 css,js,以及图片都是测试用,如下截图:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_04

注:测试图片直接放入了 asset 文件夹中。

在本地服务器中打开测试页面,通过调试工具可以清楚地看到各个文件的加载,这是我们预料到的事情,因为现在还没有部署,我们需要用压缩后的 all.css && all.js 文件来代替现有的 all.css && all.js 文件:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_05

---

部署的开始:在部署开始前,最好将开发时的 all.css && all.js 改名成 all.css.debug && all.js.debug,否则部署时会被覆盖掉:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_06

部署工具:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_07

首先需要配置出 Ant 的 build.xml 文件(具体的 Ant 教程可以在官网看到):

<?xml version="1.0" encoding="UTF-8"?>

<project default="compress" basedir="E:\newPhpEnvironment\Webroot\deploymentTest\web" name="core">
	<!-- 项目的 web 路径 -->
	<property name="path" value="E:\newPhpEnvironment\Webroot\deploymentTest\web" />
	<!-- 部署的输出路径 -->
	<property name="targetDir" value="E:\newPhpEnvironment\Webroot\deploymentTest\build_output\asset" />
	<!-- 源文件路径(src) -->
	<property name="code.src" value="src" />
	<property name="baseService" value="baseService" />
	<!-- !!! YUI Compressor 路径 !!! -->
	<property name="yuicompressor" value="E:\newPhpEnvironment\Webroot\deploymentTest\build\yuicompressor-2.4.6\build\yuicompressor-2.4.6.jar" />
		
		<!-- ================================= 
          target: concat 拼接(合并)文件        
         ================================= -->
		 
	<target name="concat" depends="" description="concat code">
		<echo message="Concat Code Files Begin!!!" />
		<!-- 需要注意这里的拼接顺序 --><!-- JS -->
		<concat destfile="${targetDir}/js/source/all.js" encoding="utf-8" fixlastline="on">
			<fileset dir="${code.src}/js" includes="jquery-1.5.1.js" />
			<fileset dir="${code.src}/js" includes="jquery.ui.core.js" />
			<fileset dir="${code.src}/js" includes="jquery.ui.widget.js" />
			
			<fileset dir="${code.src}/js" includes="jquery.ui.draggable.js" />
			<fileset dir="${code.src}/js" includes="jquery.ui.droppable.js" />
			<fileset dir="${code.src}/js" includes="jquery.ui.button.js" />
			<fileset dir="${code.src}/js" includes="jquery.ui.dialog.js" />
			<fileset dir="${code.src}/js" includes="jquery.ui.accordion.js" />
			<fileset dir="${code.src}/js" includes="jquery.ui.autocomplete.js" />
		</concat>
		<!-- CSS -->
		<concat destfile="${targetDir}/css/source/all.css" encoding="utf-8">
			<fileset dir="${code.src}/css" includes="jquery.ui.core.css" />
			
			<fileset dir="${code.src}/css" includes="jquery.ui.button.css" />
			<fileset dir="${code.src}/css" includes="jquery.ui.dialog.css" />
			<fileset dir="${code.src}/css" includes="jquery.ui.accordion.css" />
			<fileset dir="${code.src}/css" includes="jquery.ui.autocomplete.css" />
		</concat>

		<echo message="Concat Code Files Finished!!!" />
	</target>

	<!-- ================================= 
          target: copy 拷贝文件 
         ================================= -->

	<target name="copy_asset" depends="concat" description="copy the asset file">
		<echo message="Copy Asset Begin" />
		<!-- main.html -->
		<copy todir="${targetDir}/../" overwrite="true">
			<fileset dir="${path}/" includes="*.html"/>
		</copy>
		<!-- img *.png -->
		<copy todir="${targetDir}/img" overwrite="true">
			<fileset dir="${path}/asset/img" includes="*.png" />
		</copy>

		<echo message="Copy Asset Finished" />
	</target>


	<!-- ================================= 
          target: compress 压缩 js && css  
         ================================= -->

	<target name="compress" depends="copy_asset" description="compress code">
		<echo message="Compress Code Begin" />

		<apply executable="java" parallel="false" failonerror="true" dest="${targetDir}/js">
			<fileset dir="${targetDir}/js/source" includes="*.js"/>
			<arg line="-jar"/>
			<arg path="${yuicompressor}" />
			<arg line="--charset utf-8" />
			<arg line="-o" />
			<targetfile/>
			<mapper type="glob" from="*.js" to="*.js" />
		</apply>
		
		<apply executable="java" parallel="false" failonerror="true" dest="${targetDir}/css">
			<fileset dir="${targetDir}/css/source" includes="*.css"/>
			<arg line="-jar"/>
			<arg path="${yuicompressor}" />
			<arg line="--charset utf-8" />
			<arg line="-o" />
			<targetfile/>
			<mapper type="glob" from="*.css" to="*.css" />
		</apply>

		<echo message="Compress Code Finished" />

		<echo message="Clean Begin" />

		<!--<delete verbose="false" failonerror="true">
            <fileset dir="${path}" includes="${targetDir}/*-o.js" />
        </delete> -->

		<echo message="Clean Finished" />

	</target>
</project>

配置文件中有相关的说明,更加详细的就需要看 Ant 的手册资料了:)

Run Ant!!

接下来如何让“蚂蚁”跑起来呢?可以写一个很简单的批处理文件:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_08

build.bat :

./apache-ant-1.8.2/bin/ant -f ./build.xml

其实就是调用了 ant.bat 文件,好啦!在小黑框中运行你的 build.bat 吧!

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_09

出险 BUILD SUCCESSFUL 的话,就说明没有问题了,去看看 build_output 文件夹:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_10

出现了!!!!!只需要用 build_output/asset 把 web/asset 覆盖掉就可以了,main.html 是拷贝过来的,可以不去管,覆盖掉之后:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_11

all.css 和 all.js 就变成了压缩的代码,我们的项目应用,只需要一个 css 文件和一个 js 文件就 ok 啦!如下截图:

前端代码的开发及其部署(Ant && YUI Compressor)_前端 部署_12

---

后期的开发,只需要将 all.css.debug && all.js.debug 改回成 all.css && all.js 文件就可以了,压缩文件可以删去,因为还可以再生成。

好了,这就是这一段时间学到的东西,分享一下。:)