文档章节

《编写可维护的 JavaScript》读书笔记第15章:校验

张前程
 张前程
发布于 2014/01/05 18:58
字数 792
阅读 169
收藏 11

1. 查找文件

使用 fileset 元素包含和排除文件或目录,可以包含 Ant 通配符。例如:

<fileset dir="./src" includes="**/*.js"/>

<fileset dir="./src" includes="**/*.js" excludes="**/*-test.js"/>

filelist 元素需要明确指定要包含的文件。例如:

<filelist dir="./src" files="core/core.js"/>

2. 任务

JSHint 是用 JavaScript 编写,需要使用 Rhino 命令行 JavaScript 引擎执行它,从 http://www.mozilla.org/rhino 下载 Rhino,并把 js.jar 文件放在依赖文件夹里(lib.dir)。

直接在命令行运行 JSHint:java -jar js.jar jshint-rhino.js [list of files] [options] 

例如:

java -jar js.jar jshint.js curly=true,noempty=true core/core.js

注意:我自己写例子执行上面的命令总是会报异常,后来在 JSHint 网站上找到有人报了这个 ISSUE (https://github.com/jshint/jshint/issues/1333),并提供了一个修改后的 jshint.js(http://download-ln.jetbrains.com/idea/jshint/jshint-2.3.0.js ),这样我才把上面的命令跑起来。另外 ISSUE #1422(https://github.com/jshint/jshint/issues/1422)指出从 2.3.0 开始出现这个问题。我重新下载了 2.2.0 版后,果然问题没有了。

说明:参考相关文档后,发现像 "curly=true……“这样的选项是放在后面的,书中的例子都写在前面了。

直接执行命令行太原始了,要利用 Ant 进行构建,可以使用 <java> 任务代替上面的命令行。

说明:此书作者使用的 <apply> 任务,该任务在最新版的 Ant 中已经废弃,因此我这里的例子使用的是 <java> 任务。

示例:

<target name="validate">
    <java jar="js.jar" fork="true">
        <arg path="jshint.js"/>
        <arg path="core/core.js"/>
        <arg line="curly=true,forin=true,latedef=true,noempty=true,undef=true"/>
    </java>
</target>

一次处理多个文件:

<target name="validate">
    <fileset id="srcfileset" dir="${src.dir}" includes="**/*.js"/>
    <pathconvert property="srcfiles" pathsep=" " refid="srcfileset"/>
    <java jar="js.jar" fork="true">
        <arg path="jshint.js"/>
        <arg path="${srcfiles}"/>
        <arg line="curly=true,forin=true,latedef=true,noempty=true,undef=true"/>
    </java>
</target>

注:<java> 任务不支持 fileset ,参考了 http://ant.1045680.n5.nabble.com/List-of-file-names-as-arguments-to-a-java-task-td1341160.html 后发现了上面的解决方法。

3. 增强的目标操作

要想在代码验证失败时阻止任务继续往下执行,可以给 <java> 任务设置 failonerror = "true" 属性。

4. 其他方面的改进

抽离可变的部分:

  • js.jar 的位置

  • jshint.js 的位置

  • 命令行参数

把它们定义到属性或者属性文件中再导入是更好的选择。下面是一个属性文件的例子:

src.dir = ./src
lib.dir = ./lib

rhino = ${lib.dir}/js.jar
jshint = ${lib.dir}/jshint.js

jshint.options = curly=true,forin=true,latedef=true,\
noempty=true,undef=true,rhino=false

这样就可以在目标中引用这些属性了。例如:

<target name="validate">
    ...
    <java jar="${rhino}" fork="true" failonerror="true">
        <arg path="${jshint}"/>
        <arg line="${srcfiles}"/>
        <arg path="${jshint.options}"/>
    </java>
</target>

5. Buildr 任务

导入 Buildr.xml 文件后,通过 <fileset> 元素即可使用 <jshint> 任务。

<target name="validate">
    <jshint>
        <fileset dir="${src.dir}" includes="**/*.js"/>
    </jshint>
</target>

也可以使用 options 属性来更改默认选项。

<target name="validate">
    <jshint options="${jshint.options}">
        <fileset dir="${src.dir}" includes="**/*.js"/>
    </jshint>
</target>

说明:刚刚去 Buildr 官网看了下,2 年没有更新了,估计是没什么人气。

参考文档

© 著作权归作者所有

张前程
粉丝 5
博文 22
码字总数 14281
作品 0
南京
程序员
私信 提问
《你不知道的JavaScript》 读书笔记

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅; 上中下三本的读书笔记: 《你不知道的JavaScript》 (上) 读书笔记 ...

大灰狼的小绵羊哥哥
03/25
0
0
分享51本关于JavaScript方面的学习书籍(免费下载)

分享51本关于JavaScript方面的学习书籍(免费下载) 1、JavaScript面向对象15分钟教程 2、原型、作用域、闭包的完整解释 3、Javascript面向对象特性实现(封装、继承、接口) 4、JavaScript面向...

邓剑彬
2012/12/02
1K
12
《你不知道的 JavaScript》全卷读书笔记

笔者近期计划深度阅读 《你不知道的 JavaScript》上 中 下卷, 以巩固语言基础, 故记录下读书笔记, 供自己复习也方便他人. 持续更新中, 欢迎 传送门 上卷 第一章 作用域和闭包 第二章 this 全...

木子七
2018/12/10
0
0
javascript模式 读书笔记一

第一章 简介 模式 模式是指一个通用问题的解决方案。 模式分三种 设计模式 编码模式:javascript特有的 反模式:常见的 引发的问题比解决的问题更多的一种方法。 JavaScript:基本概念 面向对...

lilugirl
2014/01/21
154
1
开源书籍-JavaScript 编程精解

《JavaScript 编程精解》(Eloquent JavaScript)第三版,是由马尔奇·哈弗贝克(Marlin Haverbeke)JavaScript程序员编写的JS入门书籍,Marlin Haverbeke通晓多种编程语言,在Web开发方面积累...

marsdream
2018/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

5 分钟快速学习,缓存一致性优化方案!

缓存操作 读缓存 读缓存可以分为两种情况命中(cache hit)和未命中(cache miss): 缓存命中 首先从缓存中获取数据 将缓存中的数据返回 缓存未命中 首先从缓存中获取数据 此时缓存未命中,...

架构文摘
14分钟前
4
0
【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式锁-升级版

设计 我们依然实现java.util.concurrent.locks.Lock接口。 和上一文中实现方式不同的是,我们使用ZooKeeper的EPHEMERAL_SEQUENTIAL临时顺序节点。 当首次获取锁时,会创建一个临时节点,如果...

阿里云官方博客
15分钟前
3
0
inner join 和 union all 做的汇总区别

inner join CREATE OR REPLACE VIEW M_INVENT_BARCODE_DIFF ASSELECT "INV_PART_NO","INV_ONHAND","INV_LOCATION","PART_NO","BAR_ONHAND","BAR_LOCATION"FROM (SELECT m.part_no AS......

donald121
21分钟前
4
0
EMC 设计经验总结

整体布局 1、高速、中速、低速电路要分开; 2、强电流、高电压、强辐射元器件远离弱电流、低电压、敏感元器件; 3、模拟、数字、电源、保护电路要分开; 4 、多层板设计,有单独的电源和地平...

demyar
25分钟前
3
0
支付宝高级Java现场面试35题:页锁+死锁+集群+雪崩+负载等

年底是冲刺大厂的良机,这个时间点大部分人都在观望年终奖与加薪幅度,看情况再伺机而动,人才市场的竞争反而没那么激烈。 获悉到支付宝近期有HC放出,我通过内推渠道,得到了支付宝的面试机...

mikechen优知
27分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部