JSHint 是一款程序,用于标记 JavaScript 程序中可疑的用法。核心项目包括库本身以及作为 Node 模块分发的 CLI 程序。
更多文档:所有 JSHint 选项列表 · 命令行界面 · API · 编写自己的报告器 · 常见问题解答
首先,查看安装说明,了解如何在您首选的环境中安装 JSHint。命令行可执行文件和 JavaScript API 都提供了配置 JSHint 行为的独特方法。最常见的用法是
无论您首选的环境是什么,您都可以通过指定任意数量的代码风格选项来控制 JSHint 的行为。此外,JSHint 将遵守输入源代码中声明的任何指令——有关更多信息,请参阅内联指令部分。
JSHint 带有一组默认警告,但它被设计为非常可配置的。有三种主要方法可以配置您的 JSHint 副本:您可以通过 --config
标志手动指定配置文件,使用特殊的 .jshintrc
文件,或将您的配置放入项目 package.json
文件的 jshintConfig
属性中。对于 .jshintrc
,JSHint 将从与正在检查的文件相同的目录开始搜索此文件。如果未找到,它将向上移动一个目录级别,一直到文件系统根目录。(请注意,如果输入来自 stdin,JSHint 不会尝试查找配置文件)
此设置允许您每个项目使用不同的配置文件。将您的文件放入项目根目录,只要您从项目目录树中的任何位置运行 JSHint,就会使用相同的配置文件。
配置文件是一个简单的 JSON 文件,用于指定要启用或禁用哪些 JSHint 选项。例如,以下文件将启用有关未定义和未使用变量的警告,并告诉 JSHint 一个名为 MY_GLOBAL
的全局变量。
{
"undef": true,
"unused": true,
"globals": {
"MY_GLOBAL": true
}
}
除了使用配置文件外,您还可以使用特殊注释从文件内部配置 JSHint。这些注释以 jshint
或 globals
等标签开头(完整列表如下),后跟以逗号分隔的值列表。例如,以下代码片段将启用有关未定义和未使用变量的警告,并告诉 JSHint 一个名为 MY_GLOBAL
的全局变量。
/* jshint undef: true, unused: true */
/* globals MY_GLOBAL */
您可以使用多行和单行注释来配置 JSHint。这些注释的作用域是函数,这意味着如果您将它们放在函数内部,它们只会影响该函数的代码。
以下是 JSHint 支持的配置指令列表
用于设置 JSHint 选项的指令。
/* jshint strict: true */
用于设置与 JSHint 兼容的 JSLint 选项的指令。
/* jslint vars: true */
用于告诉 JSHint 在其他地方定义的全局变量的指令。如果值为 false
(默认值),JSHint 将认为该变量为只读。影响 undef
选项。
/* globals MY_LIB: false */
您还可以将某些全局变量列入黑名单,以确保它们在当前文件中未使用。
/* globals -BAD_LIB */
用于告诉 JSHint 在当前文件中定义但在其他地方使用的全局变量的指令。影响 unused
选项。
/* exported EXPORTED_LIB */
用于告诉 JSHint 您打算使用的所有属性的指令。此指令已弃用。
用于告诉 JSHint 忽略一段代码的指令。
// Code here will be linted with JSHint.
/* jshint ignore:start */
// Code here will be ignored by JSHint.
/* jshint ignore:end */
ignore:start
和 ignore: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
警告,以及一个强制选项,用于启用对未使用变量的检查。在您的情况下,这些选项是 unused
和 eqnull
。
/*jshint unused:true, eqnull:true */
function main(a, b) {
return a == null;
}
之后,JSHint 在检查此示例代码时将产生以下警告
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 发现已经有一个全局的 "use strict" 指令,并通知您所有其他指令都是冗余的。但是您不想删除这些指令,因为该文件是自动生成的。解决方案是使用 --verbose
标志运行 JSHint 并记下警告代码(在本例中为 W034)
$ jshint --verbose myfile.js
myfile.js: line 6, col 3, Unnecessary directive "use strict". (W034)
然后,要隐藏此警告,只需将以下代码片段添加到您的文件中
/* jshint -W034 */
需要注意的一些事项
W
开头),不适用于错误(代码以 E
开头)。要重新启用已使用上述代码片段禁用的警告,您可以使用
/* jshint +W034 */
这在您有导致警告但您知道在上下文中是安全的代码时特别有用。在这些情况下,您可以像上面一样禁用警告,然后在之后重新启用警告
var y = Object.create(null);
// ...
/*jshint -W089 */
for (var prop in y) {
// ...
}
/*jshint +W089 */
此页面包含 JSHint 支持的所有选项的列表。
默认情况下,当您在 switch 语句中省略 break
或 return
语句时,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();
}