听起来是不是很惬意?Let's go! 我们出发啦~
这期,我们会使用 Ant 将上期编写、整理的代码文件按指定的先后顺序合并成单一的源文件,然后压缩这个文件。这是构建 JavaScript 项目的基本步骤。Ant 是 Apache 的一个顶级开源项目,网上对它的介绍和安装,已经有很多文章,这里就不再赘述了。在构建之前,我们先来看看已有的文件布局:
smart-queue <span style="COLOR: #c0c0c0">// 组件的根目录</span> +--- src <span style="COLOR: #c0c0c0">// JavaScript源文件目录</span> +--- lang.js <span style="COLOR: #c0c0c0">// 前文提到的“外部文件”</span> +--- smart-queue.js <span style="COLOR: #c0c0c0">// Smart Queue 主文件</span>
现在,我们要让它“丰满”起来:
- 组件根目录下添加:
- README: 介绍 Smart Queue 组件
- LICENSE: 组件的授权信息
- build.xml: Ant 使用的配置文件
- 组件根目录下添加 lib 子目录:存放构建过程中需要使用的外部程序和库文件
- lib 子目录下添加 yuicompressor.jar: 我们用 YUI Compressor 压缩 JavaScript
- 组件根目录下添加 test 子目录:存放测试组件所需的文件(下期介绍)
- src 目录下添加 intro.js: 介绍组件的版本及说明信息
麻雀虽小,五脏俱全。现在 Smart Queue 看上去像是比较专业的 JavaScript 项目了:
smart-queue <span style="COLOR: #c0c0c0">// 组件的根目录</span> +--- lib <span style="COLOR: #c0c0c0">// JavaScript外部程序和库文件目录</span> +--- yuicompressor.jar <span style="COLOR: #c0c0c0">// YUI Compressor</span> +--- test <span style="COLOR: #c0c0c0">// 测试文件目录</span> +--- src <span style="COLOR: #c0c0c0">// JavaScript源文件目录</span> +--- intro.js <span style="COLOR: #c0c0c0">// 介绍和版本信息</span> +--- lang.js <span style="COLOR: #c0c0c0">// 前文提到的“外部文件”</span> +--- smart-queue.js <span style="COLOR: #c0c0c0">// Smart Queue 主文件</span> +--- README <span style="COLOR: #c0c0c0">// 组件自述文件</span> +--- LICENSE <span style="COLOR: #c0c0c0">// 组件授权信息</span>
我们计划将构建出来的文件存放到组件根目录下的 build 子目录,还要通过构建工具创建并销毁它。首次尝试构建前,建议先大概了解一下 Ant 的配置文件——build.xml 的结构:
<span style="COLOR: #b000b0"><span style="COLOR: #c00000">project</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"MyProject"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">default</span>=<span style="COLOR: #008000">"dist"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">basedir</span>=<span style="COLOR: #008000">"."</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">description</span><span style="COLOR: #b000b0">></span> simple example build file <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">description</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #707070"><span style="COLOR: #707070">-- set global properties for this build --</span><span style="COLOR: #707070">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"src"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">location</span>=<span style="COLOR: #008000">"src"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"build"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">location</span>=<span style="COLOR: #008000">"build"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"dist"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">location</span>=<span style="COLOR: #008000">"dist"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"init"</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #707070"><span style="COLOR: #707070">-- Create the time stamp --</span><span style="COLOR: #707070">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">tstamp</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #707070"><span style="COLOR: #707070">-- Create the build directory structure used by compile --</span><span style="COLOR: #707070">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">mkdir</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">dir</span>=<span style="COLOR: #008000">"${build}"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"compile"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">depends</span>=<span style="COLOR: #008000">"init"</span> <span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">description</span>=<span style="COLOR: #008000">"compile the source "</span><span style="COLOR: #b000b0"> ></span> <span style="COLOR: #707070"><span style="COLOR: #707070">-- Compile the java code from ${src} into ${build} --</span><span style="COLOR: #707070">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">javac</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">srcdir</span>=<span style="COLOR: #008000">"${src}"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">destdir</span>=<span style="COLOR: #008000">"${build}"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"clean"</span> <span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">description</span>=<span style="COLOR: #008000">"clean up"</span><span style="COLOR: #b000b0"> ></span> <span style="COLOR: #707070"><span style="COLOR: #707070">-- Delete the ${build} and ${dist} directory trees --</span><span style="COLOR: #707070">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">delete</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">dir</span>=<span style="COLOR: #008000">"${build}"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">delete</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">dir</span>=<span style="COLOR: #008000">"${dist}"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">project</span><span style="COLOR: #b000b0">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
仔细观察一下,除了 <font face="新宋体">name, description</font>
这些名字都很容易理解外,其他可以看到的规律包括:
-
<font face="新宋体">project</font>
元素的<font face="新宋体">default</font>
属性值对应某个<font face="新宋体">target</font>
元素的<font face="新宋体">name</font>
属性; -
<font face="新宋体">target</font>
元素的<font face="新宋体">depends</font>
属性值对应其他某些<font face="新宋体">target</font>
元素的<font face="新宋体">name</font>
属性; -
<font face="新宋体">${somename}</font>
可以引用<font face="新宋体">property</font>
中定义的值。
下面我们开始写自己的 build.xml.
首先,配置项目的基本信息,以及相关目录名称,将要使用的编码等等:
<span style="COLOR: #b000b0"><span style="COLOR: #c00000">project</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"Smart Queue"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">default</span>=<span style="COLOR: #008000">"compress"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">basedir</span>=<span style="COLOR: #008000">"."</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">description</span><span style="COLOR: #b000b0">></span>Build file for Ant<span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">description</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"src"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">location</span>=<span style="COLOR: #008000">"src"</span><span style="COLOR: #b000b0"> /></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"build"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">location</span>=<span style="COLOR: #008000">"build"</span><span style="COLOR: #b000b0"> /></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"lib"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">location</span>=<span style="COLOR: #008000">"lib"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"inputencoding"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">value</span>=<span style="COLOR: #008000">"utf-8"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">property</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"outputencoding"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">value</span>=<span style="COLOR: #008000">"gbk"</span><span style="COLOR: #b000b0">/></span></span></span></span></span></span></span></span>
接着,定义一个用于初始化的 <font face="新宋体">target</font>
, 它负责创建 build 子目录:
<span style="COLOR: #b000b0"><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"init"</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">mkdir</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">dir</span>=<span style="COLOR: #008000">"${build}"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0">></span></span></span>
然后定义名为 <font face="新宋体">concat</font>
的 <font face="新宋体">target</font>
, 负责将 src 里的 3 个 JavaScript 文件按先后顺序连接起来。运行它要先运行前面定义的 <font face="新宋体">init</font>
:
<span style="COLOR: #b000b0"><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"concat"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">depends</span>=<span style="COLOR: #008000">"init"</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">concat</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">destfile</span>=<span style="COLOR: #008000">"${build}/smart-queue.source.js"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">encoding</span>=<span style="COLOR: #008000">"${inputencoding}"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">outputencoding</span>=<span style="COLOR: #008000">"${outputencoding}"</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">filelist</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">dir</span>=<span style="COLOR: #008000">"${src}"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">files</span>=<span style="COLOR: #008000">"intro.js, lang.js, smart-queue.js"</span><span style="COLOR: #b000b0"> /></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">concat</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0">></span></span></span></span>
这样,就可以得到一个可以工作的 JavaScript 文件,下面的 <font face="新宋体">target</font>
负责压缩这个文件,显然它依赖于 <font face="新宋体">concat</font>
, 也依赖于 <font face="新宋体">init</font>
, 但是不必显式指定对 <font face="新宋体">init</font>
的依赖——Ant 能处理这种依赖关系。这里调用 YUI Compressor 并传入适当的参数:
<span style="COLOR: #b000b0"><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"compress"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">depends</span>=<span style="COLOR: #008000">"concat"</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">java</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">jar</span>=<span style="COLOR: #008000">"${lib}/yuicompressor.jar"</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">fork</span>=<span style="COLOR: #008000">"true"</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">arg</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">line</span>=<span style="COLOR: #008000">"--type js --charset utf-8 -o ${build}/smart-queue.js ${build}/smart-queue.js"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">java</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0">></span></span></span></span>
大功告成,<font face="新宋体">compress</font>
处理后的文件就可以部署到生产系统上去了。最后我们做一下清理工作,使你在生成文件后还可以回到最初的状态:
<span style="COLOR: #b000b0"><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">name</span>=<span style="COLOR: #008000">"clean"</span><span style="COLOR: #b000b0">></span> <span style="COLOR: #b000b0"><span style="COLOR: #c00000">delete</span><span style="COLOR: #b000b0"> </span><span style="COLOR: #0000c0">dir</span>=<span style="COLOR: #008000">"${build}"</span><span style="COLOR: #b000b0">/></span> <span style="COLOR: #b000b0"></span><span style="COLOR: #c00000">target</span><span style="COLOR: #b000b0">></span></span></span>
到此可以说基本的配置就写完了。怎么使用它呢?以命令行方式进入到组件根目录(或者说 build.xml 所在的目录),然后:
- 运行
<font face="新宋体">ant concat</font>
, 将得到 ./build/smart-queue.source.js - 运行
<font face="新宋体">ant</font>
, 将选择<font face="新宋体"><project></project></font>
中<font face="新宋体">default</font>
引用的那个<font face="新宋体">target</font>
, 即<font face="新宋体">compress</font>
, 所以会得到 ./build 下的 smart-queue.source.js 和 smart-queue.js - 运行
<font face="新宋体">ant clean</font>
, 将删除 ./build 目录,回到最初的状态
这些前提是你已经正确安装或者说设置好了 JDK 和 Ant, 如果有错误提示出来,则可能需要检查它们是否已准备妥当。
一路看下来,是不是觉得本期介绍的东西很简单?那是当然了,构建工具就应该简单易用,否则把大量的时间花在那上面岂非不值?工具的价值在于提升生产力,从而创造更多价值。
最后,你可以在这里查看 Ant 的帮助文档(里面有很多好玩的东东哦),也可以在这里查看本期完整的 build.xml 文件。

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)