前端工程化早期常用 Apache ANT + YUI Compressor** 實現 JavaScript 文件合併、壓縮、部署自動化。本文詳細講解 `build.xml` 核心配置、任務鏈設計、YUI 壓縮參數、文件複製部署全流程,並給出現代構建工具遷移建議。
<project name="zjmap" default="cleanBuild" basedir=".">
<!-- 屬性定義 -->
<property name="root" value="WebRoot"/>
<property name="js" value="${root}/js"/>
<property name="map_function_js" value="${js}/mapfunc"/>
<property name="lib" value="lib"/>
<property name="build" value="build"/>
<property name="charset" value="utf-8"/>
<!-- 1. 創建構建輸出目錄 -->
<target name="initBuildDir">
<mkdir dir="${build}"/>
</target>
<!-- 2. 合併 JS 文件 (按依賴順序) -->
<target name="concatJs" depends="initBuildDir">
<concat destfile="${build}/mapfuncall.js" encoding="${charset}" outputencoding="${charset}">
<path path="${map_function_js}/DC.js"/>
<path path="${map_function_js}/stringUtil.js"/>
<path path="${map_function_js}/LOCALDC.js"/>
<!-- 此處省略 30+ 文件,按業務依賴順序排列 -->
<path path="${map_function_js}/statisticsNew.js"/>
<path path="${map_function_js}/Approval.js"/>
</concat>
<!-- 移除調試佔位符 -->
<replaceregexp file="${build}/mapfuncall.js" match="@DEBUG@" replace="" flags="g" byline="true" encoding="${charset}"/>
</target>
<!-- 3. 壓縮任務鏈 -->
<target name="compressAll" depends="concatJs">
<antcall target="compressMapFuncAll"/>
<antcall target="compressDataEdit"/>
<antcall target="compressISuggest"/>
<antcall target="copyCompressedJs"/>
</target>
<!-- YUI Compressor 壓縮單文件 -->
<target name="compressMapFuncAll">
<java jar="${lib}/yui/yuicompressor-2.4.6.jar" fork="true">
<arg line="--type js --charset utf-8 ${build}/mapfuncall.js -o ${build}/mapfuncall-min.js"/>
</java>
</target>
<target name="compressDataEdit">
<java jar="${lib}/yui/yuicompressor-2.4.6.jar" fork="true">
<arg line="--type js --charset utf-8 ${map_function_js}/dataedit.js -o ${build}/dataedit-min.js"/>
</java>
</target>
<target name="compressISuggest">
<java jar="${lib}/yui/yuicompressor-2.4.6.jar" fork="true">
<arg line="--type js --charset utf-8 ${map_function_js}/ISuggest.js -o ${build}/ISuggest-min.js"/>
</java>
</target>
<!-- 4. 複製壓縮結果回目標目錄 -->
<target name="copyCompressedJs">
<copy todir="${map_function_js}">
<fileset dir="${build}">
<include name="*-min.js"/>
</fileset>
</copy>
</target>
<!-- 5. 清理臨時目錄 -->
<target name="cleanBuild" depends="compressAll">
<delete dir="${build}"/>
</target>
</project>
| 版本 | 年份 | 狀態 | 限制 |
|---|---|---|---|
| 2.4.8 | 2013 | 最後版本 | 不支持 ES6+ 語法 (箭頭函數、解構、const/let、模板字符串等) |
| 2.4.6 | 2011 | 本文使用 | 同上,且有已知正則表達式壓縮 Bug |
警告:YUI Compressor **已停止維護 10 年**,無法處理現代 JavaScript 語法,強行壓縮 ES6+ 代碼會報錯或產生錯誤代碼。
新項目**強烈建議**直接使用現代工具鏈:
| 工具 | 定位 | 核心優勢 | 配置複雜度 |
|---|---|---|---|
| Webpack | 模塊打包器 | 代碼分割、Tree Shaking、HMR、生態最豐富 | 中高 |
| Vite | 下一代構建工具 | 極速冷啟動、按需編譯、原生 ESM、Rollup 打包 | 低 |
| esbuild | 極速打包器 | Go 編寫、毫秒級構建、支持 ES6+、TS、JSX | 極低 |
| Rollup | 庫打包專用 | 輸出純淨 ESM/CJS、Tree Shaking 最強 | 中 |