代码检查与格式化工具介绍

code

前言

多人开发通常会有代码风格不统一的情况,使用不同的编译器等,造成项目不同代码文件风格不一致,为了解决这个问题,出现了一些能自动格式化的工具,如prettier等。

常见的语法规则和代码风格检查工具有ESLint, 代码风格及语法规则和格式化工具Standard, 代码格式化工具Prettier

1. ESLint

可组装的JavaScript/JSX检查工具,它是一个由Nicholas C. Zakas于2013年开源的一个Pluggable Linter for JavaScript/JSX.

其运行是根据默认规则如 ECMAScript 5 语法检测和用户自定义规则进行语法检测,可通过自定义规则及插件添加其支持的其他类型的JS,如React.js, Vue.js等。

官网对其的描述:

ESlint 被设计为完全可配置的,这意味着你可以关闭每一个规则而只运行基本语法验证,或混合和匹配 ESLint 默认绑定的规则和你的自定义规则,以让 ESLint 更适合你的项目。

ESLint 允许你指定你想要支持的 JavaScript 语言选项。默认情况下,ESLint 支持 ECMAScript 5 语法。你可以覆盖该设置,以启用对 ECMAScript 其它版本和 JSX 的支持。

使用ESLint的流程:

  1. 首先在项目中或全局通过npm i -g eslint 安装npm包。
  2. 在项目根目录或全局(window默认为C盘用户根目录)建立配置文件, 以.eslintrc开头,比如.eslintrc.json或.eslintrc.js等。
  3. 通过命令行使用 eslint filename将会对文件进行检测,支持正则表达式,对于发现的错误可以使用eslint --fix进行部分修复。
  4. 与IDE的集成,通常我们都是直接通过IDE,如VSCode结合插件进行代码语法及风格实时检测。
    以VSCode为例,需要在Extensions中安装ESLint插件,可以通过VSCode的setting.json进行ESLint规则配置,也可以在setting.json中指定要使用的配置文件.eslintrc.*地址。

配置详解

有两种主要的方式来配置 ESLint:

  1. Configuration Comments - 使用 JavaScript 注释把配置信息直接嵌入到一个代码源文件中。
  2. Configuration Files - 使用 JavaScript、JSON 或者 YAML 文件为整个目录(处理你的主目录)和它的子目录指定配置信息。可以配置一个独立的 .eslintrc.* 文件,或者直接在 package.json 文件里的 eslintConfig 字段指定配置,ESLint 会查找和自动读取它们,再者,你可以在命令行运行时指定一个任意的配置文件。

如果你在你的主目录(通常 ~/)有一个配置文件,ESLint 只有在无法找到其他配置文件时才使用它。

配置信息:

  • Environments - 指定脚本的运行环境。每种环境都有一组特定的预定义全局变量。
  • Globals - 脚本在执行期间访问的额外的全局变量。
  • Parser - 指定解析器,如使用babel-eslint对新的JS语法进行支持。解析器需要通过npm进行安装。
  • Plugins - 配置第三方插件,如react, vue,可以省略eslint-plugin前缀
{
    "plugins": [
        "vue"
    ]
}

注意:由于 Node.js 的 require 函数的行为,全局安装的 ESLint 实例只能使用全局安装的 ESLint 插件,本地安装的版本,只能用 本地安装 的插件。不支持混合本地和全局插件。

  • Rules - 启用的规则及其各自的错误级别,可添加自定义规则。

ESLint 附带有大量的规则。你可以使用注释或配置文件修改你项目中要使用的规则。

要改变一个规则设置,你必须将规则 ID 设置为下列值之一:

  1. "off" 或 0 - 关闭规则
  2. "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
  3. "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)

对不想让eslint进行规则检测的js代码可以用以下方式进行注释

/* eslint-disable no-alert, no-console  */

alert('foo');

/* eslint-enable no-alert, no-console  */

alert('foo'); // eslint-disable-line

// eslint-disable-next-line
alert('foo');

/* eslint-disable-next-line */
alert('foo');

alert('foo'); /* eslint-disable-line */

如果在整个文件范围内禁止规则出现警告,将 /* eslint-disable */ 块注释放在文件顶部:

所有这些选项让你可以细粒度地控制 ESLint 如何对待你的代码。

  • Extends -递归扩展规则

一个配置文件可以被基础配置中的已启用的规则继承。
extends 属性值可以是:

  1. 在配置中指定的一个字符串
  2. 字符串数组:每个配置继承它前面的配置
    ESLint 递归地进行扩展配置,所以一个基础的配置也可以有一个 extends 属性。

此外eslint也可以扩展插件中的配置:
extends 属性值可以由以下组成:

  • plugin:
  • 包名 (省略了前缀,比如,react)
  • /
  • 配置名称 (比如 recommended)
{
    "plugins": [
        "react"
    ],
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended"
    ],
    "rules": {
       "no-set-state": "off"
    }
2. Standard

主要用于统一JavaScript代码风格,集成常见配置,无须编写配置文件,只要全局安装或局部安装后通过CLI进行代码检查及自动修复。

以下是官方的介绍:

无须配置。 史上最便捷的统一代码风格的方式,轻松拥有。
自动代码格式化。 只需运行 standard --fix 从此和脏乱差的代码说再见。
提前发现风格及程序问题。 减少代码审查过程中反反复复的修改过程,节约时间。
无须犹豫。再也不用维护 .eslintrc, .jshintrc, or .jscsrc 。开箱即用。

Standard规则检查细则

  • 使用两个空格 – 进行缩进

  • 字符串使用单引号 – 需要转义的地方除外

  • 不再有冗余的变量 – 这是导致 大量 bug 的源头!

  • 无分号没什么不好。不骗你!

  • 行首不要以 (, [, or ``` 开头

  • 关键字后加空格 if (condition) { ... }

  • 函数名后加空格 function name (arg) { ... }

  • 坚持使用全等 === 摒弃 == 一但在需要检查 null || undefined 时可以使用 obj == null

  • 处理 Node.js 中错误回调传递进来的 err 参数。

  • 使用浏览器全局变量时加上 window 前缀

  • 查看更多

Code Linter.png

来源

此外也可集成到VSCode等IDE中,安装standard插件,配置eslint使用standard的代码风格检查规则。

eslint类似一个平台,用于检测和报告信息,而检测的标准规则都是可以自定义的。Standard则包含javascript standard代码风格规则及自动格式化功能,对ESLint扩展,其也可以进行配置,使用eslint-plugin, 如在package.json中

{
  "standard": {
    "parser": "typescript-eslint-parser",
    "plugins": [ "typescript" ]
  }
}
3. Prettier

Prettier仅仅是代码格式化工具,它会移除所有你的代码风格,然后根据它的编码风格如换行标准,最大长度等,从0开始打印出新的,其不仅支持JS,还支持HTML/CSS。

其仅仅专注于代码格式化,对代码质量检测规则不做保证和检测,以下是官方的说明

How does it compare to ESLint/TSLint/stylelint, etc.?

Linters have two categories of rules:

Formatting rules: eg: max-len, no-mixed-spaces-and-tabs, keyword-spacing, comma-style...

Prettier alleviates the need for this whole category of rules! Prettier is going to reprint the entire program from scratch in a consistent way, so it's not possible for the programmer to make a mistake there anymore :)

Code-quality rules: eg no-unused-vars, no-extra-bind, no-implicit-globals, prefer-promise-reject-errors...

Prettier does nothing to help with those kind of rules. They are also the most important ones provided by linters as they are likely to catch real bugs with your code!

Prettier配置主要是缩进,换行,分号,单引号等信息,可以在其以下配置文件中进行配置。

  1. prettierrc file, written in YAML or JSON, with optional extensions: .yaml/.yml/.json.
  2. prettierrc.toml file, written in TOML (the .toml extension is required).
  3. prettier.config.js or .prettierrc.js file that exports an object.
  4. "prettier" key in your package.json file.

Prettier可以与ESLint一起使用,只需安装eslint-plugin-prettier,对Vue的SFC支持,仅需在.eslintrc.*的extends中添加 "plugin:prettier/recommended",
可参考

module.exports = {
  "root": true,
  "extends": [
    "plugin:vue/essential",
    "plugin:prettier/recommended",
    "eslint:recommended"
  ],
}
//https://alligator.io/vuejs/vue-eslint-prettier/
//https://www.futurehosting.com/blog/prettier-vs-eslint-whats-the-difference/
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容