规范化 lint

230 阅读6分钟

需要规范化的地方

  • 代码,文档,提交日志

eslint

  • 最主流的js lint 工具,可以检查 js 语法错误,发现问题代码(比如定义了未使用),风格不统一的问题

eslint 安装

yarn init -y   // 初始化一个项目
yarn add eslint -D // 安装eslint 为开发依赖
yarn eslint --version // 检查模块是否安装成功

执行完上述脚本后会得到一个版本好,我安装的是v7.7.0, 同时可以看到node_modules/.bin/eslint文件 因此上述命令中的第三行,其实是yarn 帮忙执行了下面的命令:

.\node_modules\.bin\eslint eslint --versiont // 这里的 .\ 不能改为 ./

eslint 快速上手

  • 初始化eslint 配置文件(这是必须的,否则执行第二步,会提示配置文件不存在)
  • 检查一个文件
  • 修复其中的风格问题
yarn eslint --init
yarn eslint ./index.js
yarn eslint ./index.js --fix
  1. 其中要注意初始化配置文件时需要选择需要被lint 的内容: 选择第三个:
  • 检查与发现的错误, 发现问题代码,同时代码风格做些校验

所有的选择如下:

特别提醒: 如果有安装不成功的问题,需要看下是否有npm 配置的比如代理配置的错误,我配置了proxy, 就错了几次,后来把proxy 删掉就好了
  1. 安装成功后, 写一个错误的文件,如下 进行对其进行eslint index.js, 得到如下的信息,来说明第13行,第六个字符有问题,但是其实这个可以一直往上看,应该时第11行未闭合的括弧引起的

闭合括弧后,得到如下的错误信息,这个错误信息变多了,因为除去未识别的符合后,可识别的内容就变多了,错误也就多了,并且此时多路一个提示,就是可以通过 --fix 的选项来修复一些风格上的问题:

我们现在来试一下, yarn eslint ./index.js --fix 后修复了什么? 可以看到风格上的问题都被修复了,比如空个,空行,引号,分号等,剩下错误的语法syy, 以及没有错误,但是有问题的代码 foo

eslint 配置文件解析

上面eslint 快速上手中的 --init 其实时为了快速生成一个具有需要配置的 .eslintrc.js,并且同时安装所需要的插件, 其实实际上也可以不通过这种方式来达到上述的目的,而是通过手动配置,这就需要我们了解 .eslintrc.js 中的各项配置的含义。

[配置中文文档]eslint.cn/docs/user-g…

下面是一些用到过的配置:

  • env: {} 表示代码可以运行的环境,对于不同的环境启用不同的全局变量或类型(比如 Set 等新类型),比如broswer(window,document), node(process),es6(Set, Map),jquery(jQuery) 等待,具体有哪些环境可以参考上面的链接
  • **parserOptions:{ecmaVersion, sourceType, ecmaFeatures} **
    • ecmaVersion 这个选项表示使用某个版本的语法 3,5(默认), 你可以使用 6、7、8、9 或 10 等,但是 启用某个版本的语法,不一定就是支持全局变量或类型(比如 Set 等新类型), 因为全局变量或类型是由** evn** 决定的,如果env:{es6:true}, ecmaVersion 中默认为6
    • sourceType - 设置为 "script" (默认) 或 "module"(如果你的代码是 ECMAScript 模块)
    • ecmaFeatures - 这是个对象,表示你想使用的额外的语言特性:
      • globalReturn - 允许在全局作用域下使用 return 语句
      • impliedStrict - 启用全局 strict mode (如果 ecmaVersion 是 5 或更高)
      • jsx - 启用 JSX
  • ** parser ** 语法解析器,ESLint 默认使用Espree作为其解析器,其他一些与ESLint 兼容的解析器可以在文档中查看,比如使用ts 时候需要用到的 @typescript-eslint/parser
  • plugins 插件数组,插件名称可以省略 eslint-plugin- 前缀
  • globals {name: "readonly"/"writeable"/"off"} 自定义的全局变量, env 中定义了的全局变量可通过off关掉,未定义的可自定义
  • rules 重写的规则,其中 0==off 表示关闭, 1== warn 表示警告, 2 == error 表示错误, 用法有:
    • eqeqeq:0/off(表示不要求使用 === 和 !==),
    • quotes: ["error", "double"], 表示指定了 “double”选项, 不为double 就用error 来表示,
    • react/jsx-uses-react:2, 配合 plugins:['react'], 表示使用了eslint-plugin-react 中的的规则,但是重写jsx-uses-react 。
  • extends 可定义继承规则,继承插件中的共享配置等,如果没有这个属性,可通过在rules/plugins 中添加规则实现同样的功能。插件中的共享配置 是一个 npm 包,它输出一个配置对象。要确保这个包安装在 ESLint 能请求到的目录下。也可以是到基本配置文件的绝对路径,也可以是相对路径, 比如"./node_modules/coding-standard/eslintDefaults.js"
    • 继承的核心规则有 "standard", "eslint:recommended"等,extends 属性值可以省略包名的前缀 eslint-config-, 比如 “eslint-config-standard”,
    • 继承插件,extends 属性值可以由以下组成:plugin:包名 (省略了前缀,比如,react)/配置名称 (比如 recommended), 比如pluging:react/recommemnded, plugins 属性值 可以省略包名的前缀 eslint-plugin-, 如 eslint-plugin-react
特别提醒: 还可以通过注释来对某些代码禁用规则,具体看上面的文档

eslint 结合webpack

在我们的项目中,希望在打包代码之前会自动实现eslint 对每个文件的检查,而不是通过我们手动地去 对每个文件进行eslint 检查

  • 我们知道webpack 打包模块之前都会将模块交给对应的loader进行处理,eslint 就可以通过loader 的形式集成到webpack 当中。 有以下两种方式,下面这两种方式是等价的。
// webpack.config.js
use:['babel-loader', 'eslint-loader']
// webpack.config.js
use: 'eslint-loader'
enforce: 'pre'

对于上面的配置,一般的项目是ok 的,但是对于使用了react 的项目,就会报出react 被定义了未被使用的错误,具体可以看下面代码,代码中定义的react 当从字面来看确实没有被使用到,但是他是在jsx 编译之后所必须用到的变量: 对于这种特殊的语法,需要使用插件eslint-plugin-react,安装完成之后,就可以在node_modules 下面找到这个文件夹,里面的index.js 文件里面就会有他对应的规则,这些规则都是针对react的

yarn add eslint-plugin-react 

安装完插件之后,如果要使用这个插件下面的规则,就需要引用这个插件,并启用对应的规则

// eslintrc
rules: {
'react/jsx-uses-react': 2, // 启用这个规则,避免react 声明未被引用的问题
'react/jsx-uses-var': 2 // 启用这个规则,避免App声明未被引用的问题
}
plugins: ['react']

不过对于大多数的eslint 插件,一般都会提供一个共享的配置,从而降低使用成本,而eslint-plugin-react这个插件导出了两个共享的配置,分别是recomended和all, 而这些共享配置就可以通过继承extends来使用,具体语法由以下组成:plugin:包名 (省略了前缀,比如,react)/配置名称 (比如 recommended)

//eslintrc
extends: [
  'plugin:react/recommemnded'
]

stylelint

最主流的css lint 工具 配置文件 .stylelintrc.js

prettier 的使用

vscode 结合eslint 的使用

如果是使用vscode 作为编辑器,可以添加eslint 插件,同时在项目文件夹下面,添加一个 .vscode/settings.json 文件,并在里面添加如下代码:

{
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    },
}

这段代码,就会根据当前目录下面的 .eslintrc.js 文件,在用户保存的时候直接将文件格式化,在没有配置eslint-loader 的时候也可以使用格式文件

git hooks 工作机制

eslint 结合git hook