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

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 年没有更新了,估计是没什么人气。

参考文档

  • JSHint 和 JSHint Options

  • Apache Ant

  • Rhino Documentation

  • Buildr 

  • Improving Rhino CLI utility performance

  • JSHint 介绍

你可能感兴趣的:(《编写可维护的 JavaScript》读书笔记第15章:校验)