JavaScript 组件之旅(三):用 Ant 构建组件


Posted in Javascript onOctober 28, 2009

听起来是不是很惬意?Let's go! 我们出发啦~

这期,我们会使用 Ant 将上期编写、整理的代码文件按指定的先后顺序合并成单一的源文件,然后压缩这个文件。这是构建 JavaScript 项目的基本步骤。Ant 是 Apache 的一个顶级开源项目,网上对它的介绍和安装,已经有很多文章,这里就不再赘述了。在构建之前,我们先来看看已有的文件布局:

smart-queue // 组件的根目录
  +--- src // JavaScript源文件目录
    +--- lang.js // 前文提到的“外部文件”
    +--- smart-queue.js // Smart Queue 主文件

现在,我们要让它“丰满”起来:

  • 组件根目录下添加:
    • README: 介绍 Smart Queue 组件
    • LICENSE: 组件的授权信息
    • build.xml: Ant 使用的配置文件
  • 组件根目录下添加 lib 子目录:存放构建过程中需要使用的外部程序和库文件
    • lib 子目录下添加 yuicompressor.jar: 我们用 YUI Compressor 压缩 JavaScript
  • 组件根目录下添加 test 子目录:存放测试组件所需的文件(下期介绍)
  • src 目录下添加 intro.js: 介绍组件的版本及说明信息

麻雀虽小,五脏俱全。现在 Smart Queue 看上去像是比较专业的 JavaScript 项目了:

smart-queue // 组件的根目录
  +--- lib // JavaScript外部程序和库文件目录
    +--- yuicompressor.jar // YUI Compressor
  +--- test // 测试文件目录
  +--- src // JavaScript源文件目录
    +--- intro.js // 介绍和版本信息
    +--- lang.js // 前文提到的“外部文件”
    +--- smart-queue.js // Smart Queue 主文件
  +--- README // 组件自述文件
  +--- LICENSE // 组件授权信息

我们计划将构建出来的文件存放到组件根目录下的 build 子目录,还要通过构建工具创建并销毁它。首次尝试构建前,建议先大概了解一下 Ant 的配置文件——build.xml 的结构:

<project name="MyProject" default="dist" basedir=".">
  <description>
    simple example build file
  </description>
 <!-- set global properties for this build -->
 <property name="src" location="src"/>
 <property name="build" location="build"/>
 <property name="dist" location="dist"/>

 <target name="init">
  <!-- Create the time stamp -->
  <tstamp/>
  <!-- Create the build directory structure used by compile -->
  <mkdir dir="${build}"/>
 </target>

 <target name="compile" depends="init"
    description="compile the source " >
  <!-- Compile the java code from ${src} into ${build} -->
  <javac srcdir="${src}" destdir="${build}"/>
 </target>

 <target name="clean"
    description="clean up" >
  <!-- Delete the ${build} and ${dist} directory trees -->
  <delete dir="${build}"/>
  <delete dir="${dist}"/>
 </target>
</project>

仔细观察一下,除了 name, description 这些名字都很容易理解外,其他可以看到的规律包括:

  • project 元素的 default 属性值对应某个 target 元素的 name 属性;
  • target 元素的 depends 属性值对应其他某些 target 元素的 name 属性;
  • ${somename} 可以引用 property 中定义的值。

下面我们开始写自己的 build.xml.

首先,配置项目的基本信息,以及相关目录名称,将要使用的编码等等:

<project name="Smart Queue" default="compress" basedir=".">
  <description>Build file for Ant</description>
  <property name="src" location="src" />
  <property name="build" location="build" />
  <property name="lib" location="lib"/>
  <property name="inputencoding" value="utf-8"/>
  <property name="outputencoding" value="gbk"/>

接着,定义一个用于初始化的 target, 它负责创建 build 子目录:

<target name="init">
    <mkdir dir="${build}"/>
  </target>

然后定义名为 concattarget, 负责将 src 里的 3 个 JavaScript 文件按先后顺序连接起来。运行它要先运行前面定义的 init:

<target name="concat" depends="init">
    <concat destfile="${build}/smart-queue.source.js" encoding="${inputencoding}" outputencoding="${outputencoding}">
      <filelist dir="${src}" files="intro.js, lang.js, smart-queue.js" />
    </concat>
  </target>

这样,就可以得到一个可以工作的 JavaScript 文件,下面的 target 负责压缩这个文件,显然它依赖于 concat, 也依赖于 init, 但是不必显式指定对 init 的依赖——Ant 能处理这种依赖关系。这里调用 YUI Compressor 并传入适当的参数:

<target name="compress" depends="concat">
    <java jar="${lib}/yuicompressor.jar" fork="true">
      <arg line="--type js --charset utf-8 -o ${build}/smart-queue.js ${build}/smart-queue.js"/>
    </java>
  </target>

大功告成,compress 处理后的文件就可以部署到生产系统上去了。最后我们做一下清理工作,使你在生成文件后还可以回到最初的状态:

<target name="clean">
    <delete dir="${build}"/>
  </target>

到此可以说基本的配置就写完了。怎么使用它呢?以命令行方式进入到组件根目录(或者说 build.xml 所在的目录),然后:

  • 运行 ant concat, 将得到 ./build/smart-queue.source.js
  • 运行 ant, 将选择 <project>default 引用的那个 target, 即 compress, 所以会得到 ./build 下的 smart-queue.source.js 和 smart-queue.js
  • 运行 ant clean, 将删除 ./build 目录,回到最初的状态

这些前提是你已经正确安装或者说设置好了 JDK 和 Ant, 如果有错误提示出来,则可能需要检查它们是否已准备妥当。

一路看下来,是不是觉得本期介绍的东西很简单?那是当然了,构建工具就应该简单易用,否则把大量的时间花在那上面岂非不值?工具的价值在于提升生产力,从而创造更多价值。

最后,你可以在这里查看 Ant 的帮助文档(里面有很多好玩的东东哦),也可以在这里查看本期完整的 build.xml 文件。

Javascript 相关文章推荐
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
Jun 27 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
Jan 02 Javascript
Javascript中call和apply函数的比较和使用实例
Feb 03 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
Oct 16 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
Apr 07 Javascript
js点击返回跳转到指定页面实现过程
Aug 20 Javascript
详解vue组件通信的三种方式
Jun 30 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
bootstrap modal+gridview实现弹出框效果
Aug 15 Javascript
解决JavaScript layui 下拉框不显示的问题
Aug 14 Javascript
js实现拾色器插件(ColorPicker)
May 21 Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 Javascript
JavaScript 组件之旅(二)编码实现和算法
Oct 28 #Javascript
JavaScript 组件之旅(一)分析和设计
Oct 28 #Javascript
js 数组实现一个类似ruby的迭代器
Oct 27 #Javascript
jquery 操作单选框,复选框,下拉列表实现代码
Oct 27 #Javascript
javascript获得CheckBoxList选中的数量
Oct 27 #Javascript
基于jQuery的日期选择控件
html 锁定页面(js遮罩层弹出div效果)
Oct 27 #Javascript
You might like
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
2017/02/28 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
django orm 通过related_name反向查询的方法
2018/12/15 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
毕业自我鉴定
2013/11/05 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
三方协议书范本
2014/04/22 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
2014年消防工作总结
2014/11/21 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
三八节活动简报
2015/07/20 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书