文件

JSHint 是一個會標記可疑使用方式的 JavaScript 程式。核心專案包括函式庫本身,以及分發為 Node 模組的 CLI 程式。

更多文件:所有 JSHint 選項清單 · 命令列介面 · API · 撰寫你自己的報告程式 · 常見問題

基本使用方式

首先,查看 安裝說明 以取得如何在你的偏好環境中安裝 JSHint 的詳細資料。命令列執行檔和 JavaScript API 都提供了配置 JSHint 行為的獨特方法。最常見的用法是

無論你的偏好環境為何,你都可以透過指定任意數量的 程式碼品質檢查選項 來控制 JSHint 的行為。此外,JSHint 將會遵守輸入原始碼中所宣告的任何指令--請參閱 關於內嵌指令的章節 以取得更多資訊。

配置

JSHint 隨附預設的警告組,但其設計目的是高度可配置。有三個主要方法可以配置你的 JSHint 拷貝:你可以透過 --config 旗標手動指定組態檔、使用特殊檔案 .jshintrc 或將你的設定放入專案的 package.json 檔案中的 jshintConfig 屬性中。如果是 .jshintrc,JSHint 將會從與被檢查檔案相同的目錄中開始尋找此檔案。若找不到,它將會向上移動一個目錄樹層級,一直到檔案系統根目錄。(注意:如果輸入來自於標準輸入,JSHint 將不會嘗試尋找組態檔)

這個設定讓你可以在每個專案中擁有不同的組態檔。將你的檔案放入專案根目錄中,只要你在專案目錄樹中的任何位置執行 JSHint,就會使用相同的組態檔。

組態檔是一個簡單的 JSON 檔案,它會指定要開啟或關閉哪些 JSHint 選項。例如,下列檔案會啟用未定義和未使用的變數警告,並告知 JSHint 一個名為 MY_GLOBAL 的全域變數。

{
  "undef": true,
  "unused": true,
  "globals": {
    "MY_GLOBAL": true
  }
}

內嵌配置

除了使用組態檔之外,你也可以使用特殊註解從你的檔案中配置 JSHint。這些註解會以標籤開始,例如 jshintglobals(下方為完整清單),後接逗號分隔的數值清單。例如,下列片段會啟用未定義和未使用的變數警告,並告知 JSHint 一個名為 MY_GLOBAL 的全域變數。

/* jshint undef: true, unused: true */
/* globals MY_GLOBAL */

你可以使用多行和單行註解來配置 JSHint。這些註解是函式作用域,這表示如果你將它們放在函式內,它們只會影響此函式的程式碼。

指令

以下是 JSHint 支援的組態指令清單

jshint

一個設定 JSHint 選項的指令。

/* jshint strict: true */

jslint

一個設定與 JSHint 相容的 JSLint 選項的指令。

/* jslint vars: true */

globals

一個告知 JSHint 在其他地方定義的全域變數的指令。如果數值為 false(預設),JSHint 會將該變數視為唯讀。影響 undef 選項。

/* globals MY_LIB: false */

你也可以將某些全域變數加入黑名單,以確保它們沒有在目前檔案中使用。

/* globals -BAD_LIB */

exported

一個告知 JSHint 在目前檔案中定義但會在其他地方使用的全域變數的指令。影響 unused 選項。

/* exported EXPORTED_LIB */

members

一個用於告訴 JSHint 您打算使用所有屬性的指令。這個指令已被棄用。

ignore

一個用於告訴 JSHint 忽略一段程式碼的指令。

// Code here will be linted with JSHint.
/* jshint ignore:start */
// Code here will be ignored by JSHint.
/* jshint ignore:end */

介於 ignore:startignore:end 之間的所有程式碼都不會傳遞給 JSHint,這樣您就可以使用任何語言擴充功能,例如 Facebook React。此外,您可以忽略一行結尾帶有註解的程式碼

ignoreThis(); // jshint ignore:line

選項

在很多情況下,當您需要調適 JSHint 以符合您的喜好時,您所需要做的僅是找出一個適當的選項。嘗試找出 JSHint 選項的工作原理可能會令人困惑且沮喪(我們正在努力解決這個問題!),因此請仔細閱讀以下幾段文字。

JSHint 有兩種類型的選項:強制執行和放寬。前者用於讓 JSHint 更加嚴格,而後者則用於抑制一些警告訊息。以以下程式碼為例

function main(a, b) {
  return a == null;
}

當使用預設的 JSHint 選項執行時,這個程式碼會產生以下警告訊息

line 2, col 14, Use '===' to compare with 'null'.

假設您知道自己在做什麼,並想要停用產生的警告訊息,但同時,您很好奇是否有任何變數已宣告但從未使用過。在這種情況下,您需要做的是啟用兩個選項:一個用於抑制 === null 警告訊息的放寬選項,以及一個用於啟用未使用的變數檢查的強制執行選項。在您的情況下,這些選項是 unusedeqnull

/*jshint unused:true, eqnull:true */
function main(a, b) {
  return a == null;
}

在那之後,JSHint 將在通過 linting 範例時產生以下警告訊息

demo.js: line 2, col 14, 'main' is defined but never used.
demo.js: line 2, col 19, 'b' is defined but never used.

有時,JSHint 沒有適當的選項來停用某些特定的警告訊息。在這種情況下,您可以透過它們的代碼來使用 jshint 指令來停用警告訊息。假設您有一個檔案是透過將多個不同的檔案合併成一個新檔案而建立的

"use strict";
/* ... */

// From another file
function b() {
  "use strict";
  /* ... */
}

這段程式碼將在函式 b 中觸發一個關於不必要的指令的警告訊息。JSHint 看到已經有一個全域的「使用嚴格模式」指令,並通知您所有其他指令都是多餘的。但是,由於這個檔案是自動產生的,所以您不想要移除這些指令。解決方案是執行 JSHint 並加上旗標 --verbose,並記下警告訊息代碼(在本例中為 W034

$ jshint --verbose myfile.js
myfile.js: line 6, col 3, Unnecessary directive "use strict". (W034)

然後,若要隱藏這個警告訊息,只要將下列程式碼片段新增到您的檔案中

/* jshint -W034 */

幾點注意事項

  1. 這個語法僅適用於警告訊息(代碼以 W 開頭),不適用於錯誤訊息(代碼以 E 開頭)。
  2. 這個語法將停用具有這個代碼的所有警告訊息。有些警告訊息比其他警告訊息更為常見,所以請務必小心。

若要重新啟用已透過上述程式碼片段停用的警告訊息,您可以使用

/* jshint +W034 */

這在您的程式碼造成警告訊息,但您知道在該環境中是安全的時特別有用。在這些情況下,您可以如上所述停用警告訊息,然後再重新啟用警告訊息

var y = Object.create(null);
// ...
/*jshint -W089 */
for (var prop in y) {
    // ...
}
/*jshint +W089 */

這個頁面包含 JSHint 所支援的所有選項的清單。

switch 陳述式

預設情況下,當您在 switch 陳述式中省略 breakreturn 陳述式時,JSHint 會發出警告訊息

switch (cond) {
case "one":
  doSomething(); // JSHint will warn about missing 'break' here.
case "two":
  doSomethingElse();
}

如果您真的知道自己在做什麼,您可以透過新增 /* falls through */ 註解來告訴 JSHint 您打算讓 case 區塊貫穿執行

switch (cond) {
case "one":
  doSomething();
  /* falls through */
case "two":
  doSomethingElse();
}