红宝书第三十五讲:新手也能懂的静态代码分析指南:ESLint vs JSHint

资料取自《JavaScript高级程序设计(第5版)》
查看总目录:红宝书学习大纲


一、静态代码分析是什么?

不运行代码 就能检测潜在错误和代码风格问题,像“语法校对器”1核心功能

  1. 语法检查:比如漏写分号、变量未声明
  2. 代码风格统一:缩进空格、命名规范
  3. 潜在错误预警:使用未定义变量、无效循环
flowchart LR
    代码文件 --> 静态分析工具 --> 生成报告
    报告 --> 错误/警告列表 --> 修正代码

二、ESLint:高度可定制的现代工具 1

由JS专家Nicholas Zakas开发,支持插件扩展(如React/Vue规则)。

典型配置(.eslintrc.js):
module.exports = {
  extends: "eslint:recommended",  // 继承官方推荐规则
  rules: {
    "no-unused-vars": "warn",    // 未用变量报警告
    "semi": ["error", "always"]  // 强制分号结尾
  }
};
常用rules

以下是 ESLint 最常用的规则列表,以表格形式呈现:

规则名称描述
eqeqeq要求使用 ===!==,避免使用 ==!=
no-unused-vars禁止声明了但未使用的变量
no-console禁止使用 console
no-debugger禁止使用 debugger
no-undef禁止使用未定义的变量
no-extra-semi禁止不必要的分号
no-unused-expressions禁止未使用的表达式
semi要求或禁止使用分号
quotes强制使用一致的反勾号、双引号或单引号
camelcase强制使用驼峰命名法
indent强制使用一致的缩进
no-trailing-spaces禁用行尾空格
no-multiple-empty-lines不允许多个空行
no-mixed-spaces-and-tabs不允许空格和 tab 混合缩进
no-unexpected-multiline禁止意外的多行
no-unreachable禁止在返回语句或抛出语句后有不可达代码
no-constant-condition禁止在条件语句中使用常量表达式
no-empty禁止空的代码块
no-self-compare禁止比较时使用自身
no-extra-boolean-cast禁止不必要的布尔类型转换
no-extra-parens禁止不必要的括号
no-fallthrough禁止 switch 语句的 case 块直接穿透
no-redeclare禁止重复声明变量
no-shadow禁止变量声明遮蔽外层作用域的变量
no-var要求使用 letconst 替代 var
prefer-const推荐使用 const 声明常量
prefer-arrow-callback推荐使用箭头函数作为回调
object-shorthand要求对象字面量使用简写语法
dot-notation强制使用点号表示法
space-infix-ops要求操作符周围有空格
space-before-function-paren要求函数括号前有空格
keyword-spacing强制在关键字前后使用一致的空格
comma-dangle要求或禁止尾随逗号
comma-spacing强制在逗号前后使用一致的空格
comma-style强制使用一致的逗号风格
eol-last要求文件末尾有换行符
func-call-spacing要求函数调用时在函数名和括号之间有空格
func-names要求或禁止使用命名函数表达式
func-style强制使用一致的函数风格
max-len强制最大行长度
max-depth强制最大嵌套块深度
max-params强制最大参数数量
max-statements强制最大语句数量
no-array-constructor禁止使用 Array 构造函数
no-new-object禁止使用 Object 构造函数
no-new-func禁止使用 new Function
no-new-wrappers禁止使用 StringNumberBoolean 构造函数
no-unused-labels禁止未使用的标签
no-useless-call禁止不必要的 .call().apply()
no-useless-concat禁止不必要的字符串连接
no-useless-escape禁止不必要的转义字符
no-useless-return禁止冗余的返回语句
no-void禁止使用 void
no-with禁止使用 with
no-implicit-coercion禁止使用短路类型转换
no-implicit-globals禁止在全局作用域中声明变量
no-implied-eval禁止使用类似 eval() 的方法
no-invalid-this禁止在类或类对象之外使用 this
no-restricted-properties禁止使用某些属性
no-return-assign禁止在返回语句中使用赋值
no-script-url禁止使用 javascript: URL
no-self-assign禁止将变量赋值给自身
no-self-compare禁止比较时使用自身
no-sequences禁止使用逗号操作符
no-throw-literal禁止抛出字面量
no-unmodified-loop-condition禁止未修改的循环条件
no-unused-expressions禁止未使用的表达式
no-unused-labels禁止未使用的标签
no-useless-call禁止不必要的 .call().apply()
no-useless-concat禁止不必要的字符串连接
no-useless-escape禁止不必要的转义字符
no-useless-return禁止冗余的返回语句
no-void禁止使用 void
no-with禁止使用 with
no-implicit-coercion禁止使用短路类型转换
no-implicit-globals禁止在全局作用域中声明变量
no-implied-eval禁止使用类似 eval() 的方法
no-invalid-this禁止在类或类对象之外使用 this
no-restricted-properties禁止使用某些属性
no-return-assign禁止在返回语句中使用赋值
no-script-url禁止使用 javascript: URL
no-self-assign禁止将变量赋值给自身
no-self-compare禁止比较时使用自身
no-sequences禁止使用逗号操作符
no-throw-literal禁止抛出字面量
no-unmodified-loop-condition禁止未修改的循环条件
no-unused-expressions禁止
使用步骤
  1. 安装:
npm install eslint --save-dev
npx eslint --init  # 初始化配置向导
  1. 运行检测:
npx eslint yourfile.js  # 检测指定文件

→ 控制台输出错误位置及规则编号,如:

error: Missing semicolon (semi) at line 2:10

三、JSHint:简单易用的经典工具 23

JSLint的分支,适合快速检查基础问题,配置更灵活。

对比ESLint
  • 优点:配置简单,适合小项目
  • 缺点:规则扩展性较弱
快速使用
  1. 安装:
npm install jshint --save-dev
  1. 创建配置文件(.jshintrc):
{
  "undef": true,    // 禁止未声明变量
  "esversion": 6    // 允许ES6语法
}
  1. 运行检测:
npx jshint yourfile.js

→ 输出类似结果:

yourfile.js: line 3, col 5, 'sum' is not defined.

四、横向对比:如何选择?

工具优点不足
ESLint✔️支持自定义插件和规则
✔️社区活跃
❌配置略复杂
JSHint✔️开箱即用
✔️轻量快速
❌扩展性有限

适用场景

  • ESLint:团队协作项目、需要特定风格(如Airbnb规范)
  • JSHint:快速检查遗留项目、个人小脚本

五、实战演示:自动修复问题

ESLint支持自动修复部分问题(如分号缺失):

npx eslint --fix yourfile.js  # 自动修正可修复的代码

修正后代码:

// 修正前
const message = 'Hello'

// 修正后
const message = 'Hello';

目录:总目录
上篇文章:红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit


脚注


  1. 《JavaScript高级程序设计(第5版)》说明ESLint采用可插拔的规则配置机制
  2. 《JavaScript高级程序设计(第5版)》指出JSHint是JSLint的分支,支持更多自定义规则
  3. 《JavaScript高级程序设计(第5版)》提到JSLint验证语法的基本规则

kovli
13 声望6 粉丝