xxxlint介绍(前端)

目录

导读
linter 原理
一、有哪些常见的 linter
├── ESLint
└── Stylelint
└── commitlint
└── TSLint
└── Prettier
二、配置ESLint
三、配置 Stylelint
四、配置 commitlint
五、接入 husky 和 lint-staged 在 git hooks 里拦截检测
六、配置 Prettier

导读

lint 的诞生来源于C语言中静态代码分析工具,随着各路语言杀出重围,lint 家族也随之壮大,现在 lint 通常用语标记任何代码编写中可疑或错误使用的工具,或者表示对源代码进行静态检查的行为,拥有这方面能力的工具都被称为 linter。
lint 的使用能促进我们在代码提交之前发现代码的错误,我们能在合适的时间触发lint,检测代码错误。lint 规则的统一,能让团队代码风格统一。

linters 原理

为了更好的理解 linter,简单的梳理一下它们的工作流程:


一、有哪些常见的linter?

  • ESLint

ESLint 是一个开源的 JavaScript 代码检查工具,使用 Node.js 编写。它规范并校验 ECMAScript/JavaScript code 的编写,由于用户量庞大它推出了一套符合大部分用户编码规范的内置的规则,但它本身并不推荐任何编码风格,规则是自由的,ESLint 的所有规则都被设计成可插入的,用户可以创建自己的检测规则,配合 parser 和 plugins,ESLint 也是 vuereacttypescript类型的代码检测工具的首选。

  • Stylelint

它是对齐样式规范化的工具,能兼容多种格式的 css 代码、定义样式的顺序、解析各种预处理器,使用它统一样式代码风格规范。

  • commitlint

引用官方的话术,commitlint 检查你的提交消息是否符合常规的提交格式。规范的 commit 信息可以清晰地看清楚每次提交的行为。

  • TSLint
    tslint 已经不再维护了,推荐使用 ESLint

  • Prettier

Prettier是一个代码格式化工具,它支持HTML/CSS、Less、SCSS/JavaScript/TypeScript/Vue/JSX/JSON/Markdown等类型文件,基本涵盖前端项目相关的所有文件类型的 format。

内置了丰富的规则,少部分支持自定义配置,所以想在有 Linters 的基础上想接入 Prettier 做代码的 format,会和其他 Linters 的规则产生冲突,需要优先使用 Prettier 的规则。

二、配置ESLint:

安装

npm i -D eslint,这会在./node_modules/.bin目录下创建 eslint.js ,这是 eslint 执行的入口,感兴趣的同学可以看看源码。

配置

配置的几种方式:

  • 1、在项目根目录创建名为.eslintrc.js的文件,配置的详细解读写到下面注释里了:
// .eslintrc.js
module.exports = {
   root: true,                 // 停止在父级目录中寻找 .eslintrc.* | package.json 文件里的 eslintConfig
   parser: 'vue-eslint-parser',// 指定代码解析器,通常配合 plugin 对 js 以外类型的代码做检测,将将其他类型代码转换为与 ESTree(默认解析器) 兼容的形式兼容 eslint
   parserOptions: {            // 解析器选项。帮助 ESLint 确定什么是解析错误,所有语言选项默认都是 false
     ecmaVersion: 2020,        // ecma版本:支持 ES 的语法,默认支持 ECMAScript 3、5 语法,可以选值有:6, 7, 8, 9, 10, 11, 12,也可以写对应的年份
     sourceType: 'module',     // script (默认) | module(如果你的代码是 ECMAScript 模块)
     ecmaFeatures: {           // 想使用的额外的语言特性 
       // globalReturn - 允许在全局作用域下使用 return 语句
       // impliedStrict - 启用全局 strict mode (如果 ecmaVersion 是 5 或更高)
       // jsx - 启用 JSX
       // experimentalObjectRestSpread - 启用对实验性的 object rest/spread properties //的支持。
     },
     env: {                    // 在哪些环境中运行,每个环境都会带来一组预定义的全局变量。
       /**
        * browser、node、shared-node-browser、commonjs、esxxx、worker、amd、mocha、jasmine、jest、phantomjs
        * protractor、qunit、jquery、prototypejs、shelljs、meteor、mongo、applescript、nashorn、serviceworker
        * atomtest、embertest、webextensions、greasemonkey
        */
       browser: true,          // 浏览器全局变量
       node: true,             // Node.js 全局变量和 Node.js 作用域
       es6: true               // 启用 ES6 语法支持 及 新的 ES6 全局变量
     },
     globals: {                // 定义全局变量。
        /**
         * 访问当前源文件内未定义的变量时,no-undef 规则将发出警告。
         * 如果你想在一个源文件里使用全局变量,推荐你在 ESLint 中定义这些全局变量,这样 ESLint 就不会发出警告了
         **/
        var1: 'writable',      // writable: 允许被覆盖
        var2: 'readonly'       // readonly: 只读
        var3: 'off'            // off: 禁用
     },
     extends: [                // 一个配置文件可以从基础配置中继承已启用的规则,简单理解就是用别人写好的.eslintrc.js配置
        'eslint:recommended',  // 官方报告规则页面上标记为 √ 的规则。推荐的子集会在 ESLint 的主要版本上更改。
        // 'eslint:all', 表示引入当前版本 eslint 的所有核心规则
     ],
     plugins: [                // 接入第三方/自定义的插件, 需要先安装npm插件包
        /**
         * 为了补充 eslint 内置规则里缺失的能力,新增一些检查规则
         * 常用的有 @typescript-eslint/eslint-plugin、省略eslint-plugin-前缀: react、vue、node、prettier、promise
         * 加载插件之后就能在 rules 里配置插件的规则: plugin/rule: 0、1、2
         **/
     ],
     rules: {                  // 匹配规则, 官方分类整理好的规则https://eslint.org/docs/rules/
        /**
         * 对代码进行各种限定,统一风格
         * ESLint带有大量内置规则, 必须将规则ID设置为以下值之一
         * 'off' 或 0 -关闭规则
         * 'warn' 或 1 -将规则作为警告(不会影响退出代码)
         * 'error' 或 2 -将规则作为错误打开(触发时退出代码为1)
         */        
     }

   }

}
  • 2、在 package.json 下创建 eslintConfig 属性进行配置,配置项和 .eslintrc 一样不再赘述:
"eslintConfig": {
   // ...
}

如果在同一目录中找到一个 .eslintrcpackage.json 文件,.eslintrc 则将具有优先权,并且 package.json 将不使用该文件。
默认情况下,ESLint 将在所有父文件夹中寻找配置文件,直到根目录为止。如果你不想这么做可以设置配置'root': true,EsLint 将停止在父文件夹中寻找配置文件。

  • 3、在单个文件里面中添加配置(不到迫不得已,不推荐):
/* eslint no-multi-spaces: "error" */
执行

按需写好配置文件,验证一下 eslint 是否正常工作,在根目录下创建文件 eslintTest.js:

// eslintTest.js
console.log(a);

通过 yarnnpx 这类型工具执行 ./node_modules/.bin 下的 eslint 脚本:

npx eslint ./eslintTest.js


根据错误提醒找到问题代码,一些简单的样式错误可以配合规则里的修复方案和--fix自动修复:

// eslintTest.js
let       a; // 变量前面多加点空格
console.log(a); 
// .eslintrc.js
module.exports = {
  //其他配置... 
  rules: {
    'no-multi-spaces': 'error'
  }
}

执行npx eslint --fix ./eslintTest.js之后,问题代码被修复:

// eslintTest.js
let a;
console.log(a); 
自动化设置

如果觉得每次编写完代码都要执行 eslint 有些麻烦可以配合 ide 的插件在编码过程自动检测并给出提醒
以 vscode 为例:

  • 安装插件 eslint
  • 在 ide 右下角开启 eslint 插件,ide 就会有错误提示:

留意错误提醒,可以手动修改,也可以配置文件保存的时候自动修复(需要手动触发保存)

三、配置 Stylelint

安装
  • 安装 Stylelint 和 Stylelint 推荐的规范 stylelint-config-standard
npm i -D stylelint stylelint-config-standard
生成配置文件
  • 用推荐的规范生成配置文件
echo '{"extends": "stylelint-config-standard"}' > .stylelintrc.json

也可以根据团队的风格自定义配置,在配置文件里增加规则,配置rules 属性,stylelint 提供超过 170 个内置规则,例如:

// example
{
  //其他配置... 
  "rules": {
    "color-no-invalid-hex": true
  }
}

规则的值需满足以下格式之一:

  • null (关闭规则)
  • a single value (主要选项,value的类型可以是boolean、string、array......看规则的具体定义)
  • [primary option, secondary options] ([主要选项, 规则的辅助配置])
// example
{
  //其他配置... 
  "rules": {
   "indentation": [
      2,
      {
        "except": ["block"],   // 接收一组规则命名,过滤的时候取反
        "message": "Please use 2 spaces for indentation.", // message:违反规则时,提示自定义消息
        "severity": "warning"  // severity:违反规则发出的错误级别:error (默认)、warning
      }
    ]
  }
}
执行

执行 stylelint 发现潜在的错误和样式问题:

npx stylelint <文件路径>
npx stylelint "**/*.css" // 检测所有 CSS 

加上 --fix 自动修复问题:

npx stylelint <文件路径> --fix
自动化设置

配合 ide 自动化检测并修复,以 vscode为例:

  • 安装 stylelint 插件


  • 在 settings.json里添加配置

"editor.codeActionsOnSave": {
   "source.fixAll.eslint": true,
   "source.fixAll.stylelint": true,
 }
// 也可以简写成 ⬇️
"editor.codeActionsOnSave": {
   "source.fixAll": true,
 }

配置完成就能在手动保存代码的时候自动修复样式问题

四、配置 commitlint

安装
  • 安装 commitlint 和 commitlint 推荐的提交规范 config-conventional
npm install -g @commitlint/cli @commitlint/config-conventional
生成配置文件
  • 用推荐的规范生成配置文件
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
提交规范
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]
元素 含义
type 本次提交的改动类型,例如 @commitlint/config-conventional 中推荐的 fixfeatbuildchorecidocsstylerefactorperftestrevert
optional scope (可选) 修改的范围,例如某个文件、某个模块、某个目录下等等
description 本次提交的概括,短而精
optional body (可选) 本次提交的详细说明
optional footer(s) (可选) 脚注
例子: 'fix(login): 修复登陆流程的bug'feat(xx): 在xx模块增加xxx功能

常用的type:

type 含义
fix 修复 Bug
feat 添加新特性或功能
chore 跟主要业务无关的构建/工程依赖/工具等功能改动
docs 更新文档
style 代码样式调整
refactor 代码结构优化或重构
perf 优化代码性能
test 新增或修改测试代码

测试

打开终端,输入
echo 'testType: test texttest' | commitlint
会提示如下错误:
⧗   input: testType: test texttest
✖   type must be lower-case [type-case]
✖   type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] [type-enum]

✖   found 2 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint

通常 @commitlint/config-conventional 的配置也够用了,如果想定义自己的规范也可以到 官方配置例子Rules 里参照配置合适的规则

五、接入 husky 和 lint-staged 在 git hooks 里拦截检测

配合上面配置好的 eslint``、stylelintcommitlint,我们可以在 git hooks 里完成对代码和提交信息的校验

  • Git Hooks 是 git 操作不同阶段的钩子(如 commit、push...),钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。

  • 常用的钩子:

常用钩子 说明
pre-commit 在键入提交信息前运行,通常在这里进行单元测试,以及核查代码。
commit-msg 接收提交信息,即存有当前提交信息的临时文件的路径,在这可以验证项目状态或提交信息。
post-commit 在整个提交过程完成后运行,在这可以发送一些通知,还能自动重新部署项目,感兴趣的同学可以思考一下
  • husky 是什么?

husky 是一个帮助我们添加 hook 的工具,会帮我们在 .git/ 目录下增加钩子,我们只要编写好钩子里的任务便大功告成。心细的同学会发现就算在钩子里面增加一层代码检测拦截但整个项目文件这么多也太费时了,要是能够只检测改动过的文件就好了。
当然,为了追求高效我们还要接入 lint-staged, lint-staged 是一个在git暂存文件上运行 linters 的工具,配合 husky 只检验改动过的文件。

  • 安装
npm i -D husky lint-staged
  • 配置
    1、在 package.json 里添加 prepare 配置:
 "scripts": {
     //其他配置... 
    "prepare": "husky install"
  },

husky install 将会在 npm install 安装完项目以来后会触发,husky 会创建.husky/目录,并指定该目录为 git hooks 的入口

2、执行 prepare:

正常情况下,项目初始化的时候会执行 npm install 会触发 prepare。当前是第一次接入,我们手动执行一下:

npm run prepare  

发现创建好了 .husky

3、在根目录,创建一个 .lintstagedrc 配置文件,写入配置:

echo '{                                                                                                                                                                  
    "*.{js,vue}": ["eslint --fix", "git add"],
    "*.{html,vue,css,scss,sass,less}": ["stylelint --fix", "git add"]
}' > .lintstagedrc

将匹配所有改动过以 .js.vue文件执行 eslint检测并修复代码问题,匹配所有改动过以 .html.vue. css. scss. sass. less文件执行 stylelint检测并修复代码问题。

4、增加 pre-commit、commit-msg 钩子:

npx husky add .husky/pre-commit 'npx lint-staged'
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1'

5、验证一下:
新建测试文件,测试拦截情况:


如果遇到 eslint 或者 stylelint 自动修复不了的问题会报错❌

到这里已经顺利在 pre-commitcommit-msg 钩子里接入了代码检测和提交信息的过滤

六、配置 Prettier

1、安装

npm install --save-dev --save-exact prettier

2、创建配置文件,可以到 官网规则里了解按需写到配置文件里

echo {} > .prettierrc.json

3、(可选) 创建.prettierignore文件,让 Prettier CLI 和编辑器知道哪些文件不格式化。

// .prettierignore
build

4、格式化文件

npx prettier --write .

以上是 Prettier 最简洁的使用方式

集成到 Linters

Prettier 官方推出了配置和插件供我们与 Linters 集成:

集成到 ESLint:

1、安装

npm install --save-dev eslint-plugin-prettier eslint-config-prettier
npm install --save-dev --save-exact prettier // 如果已经安装了prettier可忽略

2、在 .eslintrc.* 增加配置

// eslintrc.js
{
  plugins: [
    //其他配置... 
    "prettier"
  ],
  extends: [
    //其他配置... 
    "plugin:prettier/recommended"
  ]
  rules: {
    //其他配置... 
    "prettier/prettier": "error"
  }
}

集成到 stylelint:

1、安装

npm install --save-dev stylelint-config-prettier stylelint-prettier
npm install --save-dev --save-exact prettier // 如果已经安装了prettier可忽略

2、在 . stylelintrc.* 增加配置

// stylelintrc.json
{ 
  "plugins": [
    //其他配置... 
    "stylelint-prettier"
  ],
  "extends":[ 
    //其他配置... 
    "stylelint-config-prettier" // 确保将其放在最后,这样它将覆盖其他配置
  ],
  "rules": {
    //其他配置... 
    "prettier/prettier": true
  }
}

stylelint-config-prettier 附带了一个工具,可以检查配置是否包含与Prettier冲突的规则,为了执行工具,首先将脚本添加到package.json

{
  "scripts": {
    "stylelint-check": "stylelint-config-prettier-check"
  }
}

然后执行 npm run stylelint-check

3、husky 接入 Prettier

如果已经配置过 husky,会有如下配置文件,如果没配置翻到上面第五点

// pre-commit
. "$(dirname "$0")/_/husky.sh"
npx lint-staged

在 lintstage 配置文件里增加配置:

// .lintstagedrc
{                                                                                                                                                                  
  "*.{js,vue}": ["eslint --fix", "git add"],
  "*.{html,vue,css,scss,sass,less}": ["stylelint --fix", "git add"],
  "*.{js,html,vue,css,scss,sass,less}": ["prettier --write", "git add"],
}

经过上面的配置,在提交代码的时候 Prettier 就会帮我们 format 一下再提交啦

linters 的介绍和使用就到这里啦,感谢阅读

参考 ESLint官方文档commitlint官方文档stylelint官方文档Prettier

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

推荐阅读更多精彩内容

  • 前端开发收集 插件收集 常用插件 名称描述jsonwebtokenJSON Web令牌的实现。best-requi...
    ipoa阅读 349评论 0 1
  • Script 创建文件 Edit 文件 执行 背景 随着前端应用的大型化和复杂化,越来越多的前端工程师和团队开始重...
    bowen_wu阅读 1,335评论 0 3
  • 前提: 安装webpack、webpack-cli 一、首先先让出来一个页面有内容 先添加.gitignore,将...
    codingQi阅读 1,450评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,178评论 4 8