前言

在 JS/TS 开发中,往往绕不开 eslint。在多人合作开发的时候,使用 eslint 这个静态代码检查工具,可以很好的帮助我们构建风格一致的代码仓库,同时检查出隐藏的代码问题,帮助我们减少 代码出现低级错误的可能。

eslint 固然是一个非常快乐的,但是在如果在编程的过程中,eslint 不断地尝试 教我们做事,输出大量编程无关的信息,这能忍? 我们应该如何快乐的使用 eslint,又享受到它带来的好处呢?

有关 lint

eslint 是一种 linter,只是在 js 的世界里,它的名字叫做 eslint。先来了解一下 linter 的起源和作用对我们使用 eslint 很有帮助。

  • 起源

在计算机编程领域,lint 的概念由来已久。早在 1978 年,贝尔实验室的科学家为了调试 c 语言程序在 unix 机器上开发了他命名为 lint 的小工具,用来检查代码中可能发生的错误。lint 在英文中的意思是衣物上由纤维堆积起来可以看见的球或者条。就像 lint 一样,代码中有些可能无关紧要的错误会影响到代码整体的整洁性,甚至会让代码运行之后产生不可预知的 bug。

  • 作用

之所以会有 lint 工具的出现,无非是代码不够好。但是好的代码到底应该如何定义?对于人来说,整洁可读,没有运行时的 bug,精彩的算法,正确的分层结构这些都是好的代码应该具备的条件;对于机器来说,尽量短小的代码,最好是机器码,经过编译优化器优化的代码是好的代码。可见不同层面上的 代码不是一样的概念。

那么对于 linter 来说,什么样的代码是好的代码? linter 一般会发现代码中存在的什么问题呢?

一般来说,linter 发现的代码错误可以简单分为两类:

一类是单纯的代码风格问题,如: 使用空格还是缩进/空格到底空几格(老问题了);函数名和参数列表之间空不空格;if else 是否换行等等。

另一类则是代码中的不当用法,如: 声明从不使用的变量;js 中不处理异步的函数;js 中使用 var 而不是 let 等等。

前者只是简单的风格问题,而后者则是有可能引起极难调试的诡异 bug,导致我们浪费大量时间 debug 的错误实践。

eslint 使用指北

  1. 关掉编辑器安装的 eslint 插件

  2. 在项目中添加如下脚本

脚本的大概运行步骤如下:

  1. 在脚本中通过调用 git 查找到当前更改和添加的文件(注意这些文件必须被 git track 到,新文件没有添加进暂存区的话会找不到)。
  2. 然后调用项目中的安装的 eslint 检查代码风格并自动修复简单问题。
  3. 如果发现无法自动修复的问题,则将报错信息输出至 eslintReport.log 中。
  4. 最后输出统计信息,帮助我们发现自己经常犯错的地方。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/sh
# requirement npx/eslint/git
# target JS/TS files
# only modified files tracked by git

for i in "$@"; do
    case $i in
        -c=*|--config=*)
            ESLINT_CONF="${i#*=}"
            shift # past argument=value
            ;;
        -i=*|--ignore=*)
            ESLINT_IGNORE="${i#*=}"
            shift # past argument=value
            ;;
        -h|--help)
            echo "-c=/--config= use eslint config file\n-i=/--ignore= use eslint ignore file"
            exitFlag=1
            shift # past argument=value
            ;;
        *)
            # unknown option
            ;;
    esac
done

if [[ "$exitFlag" -eq 1 ]]; then

    exit 0;
fi

if [[  -z "$ESLINT_CONF" ]]; then

    ESLINT_CONF=".eslintrc"
fi

if [[ -z "$ESLINT_IGNORE" ]]; then

    ESLINT_IGNORE=".eslintignore"
fi

LOG_FILE="$(basename "$0" | cut -f 1 -d '.').log"

echo "./$LOG_FILE"

npx eslint -c ${ESLINT_CONF} --ignore-path ${ESLINT_IGNORE} $( git status --porcelain | awk '$1!="D" {if ($1=="R") { print $4 } else { print $2 }}' | grep -E '(.ts|.js)$' ) --fix

if [ $? -ne 0 ]; then
    echo -e "ERROR: Please check eslint hints.\n"
    npx eslint -c ${ESLINT_CONF} --ignore-path ${ESLINT_IGNORE}  $( git status --porcelain | awk '$1!="D" {if ($1=="R") { print $4 } else { print $2 }}' | grep -E '(.ts|.js)$' ) -f unix | head -n -2  | awk '{print $NF}' >> "./$LOG_FILE";
    echo -e "Hightest eslint error/warning\n";
    echo -e "times\terror"
    cat "./$LOG_FILE" | sort | uniq -c | sort -rn | head -n 10
    exit 1
fi

echo "Perfect coding format!"
  1. 在自己的 build 命令中添加运行上述脚本