《編寫可維護的 JavaScript》讀書筆記第15章:校驗

1. 查找文件

使用 fileset 元素包含和排除文件或目錄,能夠包含 Ant 通配符。例如:html

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

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

filelist 元素須要明確指定要包含的文件。例如:
java

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

2. 任務

JSHint 是用 JavaScript 編寫,須要使用 Rhino 命令行 JavaScript 引擎執行它,從 http://www.mozilla.org/rhino 下載 Rhino,並把 js.jar 文件放在依賴文件夾裏(lib.dir)。git

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

例如:shell

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

注意:我本身寫例子執行上面的命令老是會報異常,後來在 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 版後,果真問題沒有了。app

說明:參考相關文檔後,發現像 "curly=true……「這樣的選項是放在後面的,書中的例子都寫在前面了。curl

直接執行命令行太原始了,要利用 Ant 進行構建,能夠使用 <java> 任務代替上面的命令行。
ide

說明:此書做者使用的 <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 年沒有更新了,估計是沒什麼人氣。

參考文檔

相關文章
相關標籤/搜索