为何要进行代码质量检查呢,缘由有三:javascript
简单来讲,太过随意的代码会让开发者难以阅读,而难以阅读的代码有时甚至不如推倒重来。html
// bad
var once
, upop
, aTime;
// good
var once,
upon,
aTime;
// bad
var hero = {
firstName: 'Bob'
, lastName: 'parr'
, heroName: 'Mr.Incredible'
, superPower: 'strength'
};
// good
var hero = {
firstName: 'Bob',
lastName: 'parr',
heroName: 'Mr.Incredible',
superPower: 'strength'
};
复制代码
不遵照编码标准和惯例的代码会让你看一眼就不想继续看、甚至看半天而不知所云。有人认为初级程序员才会有这种问题,其实否则,一些工做经验两三年的同窗写的代码依然如此。对于一些我的自学意识不够积极、没有团队规范性指引的程序员,很容易出现代码格式不规范的问题。前端
Lint 会经过源代码去查找:vue
代码 Lint 是动态的监测代码边写的错误,以便咱们能写出高质量的代码。
要与 Prettier 或者 Format 要区别开来,Lint 只会告诉你代码中的错误或者不规范的地方,而 Format 是用来对格式进行调整的。java
ESlint 是 JavaScript 的 linting 实用程序。node
ESlint 不依赖与特定的编码约定,用户也能够自由地启用或禁用各个编码约定。从这个意义上讲,它的一个主要特色是其高度可定制性。react
用户能够经过定义原始规则来灵活的设置编码标准,这些规则是 Elint 中默承认用的编码规则。git
配置文件:
.eslintrc,.eslintrc.js,.eslintrc.yml程序员
Rules:typescript
看一个例子:
{
"rules":{
"semi":["error","never"],
"quotes":["error","single"]
}
}
复制代码
看一个例子:
{
"rules":{
"semi":["2","never"],
"quotes":["2","single"]
}
}
复制代码
Extends:
使用别人提供的包,如 Google:
{
"extends":"google"
}
复制代码
Plugins:
ESlint 提供的默认规则涵盖了基本规则,但 JavaScript 能够 使用的范围很是普遍。所以,您可能但愿规则不在默认规则中。这种状况下,能够在 ESlint 中开发本身的独立规则。为了让第三方开发本身的规则,ESlint 容许使用插件,若是你在 npm 中搜索 eslint-plugin-*,你能够找到第三方提供的大量自定义插件。若是 ESlint 的默认规则未提供要使用的规则,则建议您查找插件。
与可共享配置相似,它很容易设置。例如,若是要对 React 代码进行静态分析,能够安装名为 eslint-plugin-react 的插件,并使用如下设置来执行 React 语法特有的静态分析。
{
"extends":"google",
"plugins": ["react"],
"rules":{
"semi":[2,"never"],
"quotes":[2,"single"]
}
}
复制代码
// --dev 会把 eslint 安装到package.json 文件中的 devDependencies 属性中,意思是知识开发阶段用到这个包,上线时就不须要这个包了
yarn add eslint --dev
复制代码
新增 package.json 脚本:
"scripts": {
"lint": "eslint app.js",
"lint:create": "eslint --init"
},
复制代码
而后使用 run 命令:
yarn lint:create
复制代码
yarn global add eslint
eslint --init
复制代码
生成的 .eslintrc.js 文件导出一个对象,对象包含属性 env、extends、parserOptions、plugins、rules 五个属性:
能够在项目根目录建立,告诉 ESlint 忽略某些文件或者目录。至关于 .gitignore 都是纯文本文件。
在你根据以上步骤设置 .eslintrc.js 配置文件后,你能够在项目更目录运行 ESlint,检查你的 js 文件:
yarn lint index.js
复制代码
在项目跟目录添加.eslintrc.js 文件
// https://cn.eslint.org/docs/rules/
//
/* * "off"或者0,不启用这个规则 * "warn"或者1,出现问题会有警告 * "error"或者2,出现问题会报错 */
module.exports = {
root: true, //此项是用来告诉eslint找当前配置文件不能往父级查找
env: { //环配置 如 "browser": true, node: true,
node: true,
},
extends: [
'google',
],
rules: {
'array-callback-return': 1, //return 后面是否容许省略
"arrow-parens": ["error", "as-needed"], // 箭头函数的参数能够不使用圆括号
'consistent-return': 0, //要求 return 语句要么老是指定返回的值,要么不指定
'camelcase': 0, //强制驼峰法命名
'eqeqeq': 0, //强制全等( === 和 !==)
'func-names': 0, //函数表达式必须有名字
"global-require": 0, // 取消对require的验证,使得可使用require来加载图片的相对路径
"import/no-unresolved": 0, // 取消自动解析路径,以此开启alias的别名路径设置
'import/extensions': 0, // 取消对文件扩展名的验证
'indent': 'off', //缩进风格(强制使用一致的缩进)
"linebreak-style": 0, // 取消换行符\n或\r\n的验证()
'max-len': 0, //字符串最大长度
"no-unused-vars": 1, //禁止出现未使用过的变量
"no-redeclare": 1, //禁止屡次声明同一变量
'no-use-before-define': 1, //禁止在变量定义以前使用它们
"no-unused-expressions": 0, // 容许使用未使用过的表达式,以此来支持a && a()的代码形式
'no-restricted-syntax': 1, //禁用特定的语法
'no-plusplus': 1, //禁止使用++,--
'no-underscore-dangle': 0, // 容许在标识符中使用下划线
'no-param-reassign': 0, // 禁止对 function 的参数进行从新赋值
'no-nested-ternary': 0, // 禁止嵌套三元表达式
'no-else-return': 0, //禁止 if 语句中 return 语句以后有 else 块
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-shadow': [1, { //外部做用域中的变量不能与它所包含的做用域中的变量或参数同名
"allow": ["resolve", "reject", "done", "cb"]
}],
'prefer-rest-params': 1, //要求使用剩余参数而不是 arguments
'prefer-arrow-callback': 0, //要求回调函数使用箭头函数
'prefer-const': 1, //首选const
"semi": false, // 使用分号, 默认true
"singleQuote": true, // 使用单引号, 默认false(在jsx中配置无效, 默认都是双引号)
"tabWidth": 4, // tab缩进大小,默认为4
'template-curly-spacing': 'off', //要求或禁止模板字符串中的嵌入表达式周围空格的使用
},
parserOptions: {
parser: 'babel-eslint',
},
};
复制代码
在vscode中添加 eslint。
配置保存时按eslint规则自动格式化。
可在“首选项”--“设置”中找到settings.json
添加以下配置:
```JavaScript
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"eslint.format.enable": true
```
复制代码
能够看下eslint的详细说明,有如图的配置说明,就使用新版本的配置:
这样配置完成后保存文件时就会自动格式化了。
虽然ESLint会对咱们的代码格式进行一些检测(好比分号、单双引号等),可是并不能彻底统一代码风格,咱们还须要一个工具Prettier。它并不关心你的语法是否正确,只关心你的代码格式,好比是否使用单引号,语句结尾是否使用分号等等,不只能够用来检测 JavaScript 代码格式,还能够检测 vue 文件,react 文件。
大部分的同窗开启了插件之后,VSCode 仍然没有高亮。由于须要对 VSCode 中的相关参数继续配置。
"eslint.probe": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"html",
"vue",
"markdown"
],
复制代码
eslint.probe
这个规定 ESlint 插件须要校验的语言类型,添加上对应的语言后 VSCode 才会在代码编辑器中正确的高亮错误的语法,而且会在窗口中输出错误信息。若是开发 vue 的同窗须要在这里添加上 ["html", "vue"]
这样才会在 .vue
单文件中开启 ESlint 检测,这两个选项须要 eslint-plugin-vue
eslint-plugin-html
两个包支持,须要安装到项目中。
eslint插件以eslint-plugin-
开头,使用时能够省略;好比咱们上面检测 .vue 文件就用到eslint-plugin-vue
插件;须要注意的是,咱们在配置eslint-plugin-vue
这个插件时,若是仅配置"plugins": ["vue"]
,vue 文件中 template 内容仍是会解析失败。
这是由于不论是默认的 espree 仍是 babel-eslint 解析器都没法解析 .vue 中 template 的内容;eslint-plugin-vue
插件依赖vue-eslint-parser
解析器,而vue-eslint-parser
解析器只会解析template
内容,不会检测 script 标签中的 JS 内容,所以咱们还须要指定一下解析器:
{
"extends": ["eslint:recommended"],
"plugins": ["vue","html"],
"parser": "vue-eslint-parser",
"parserOptions": {
"parser": "babel-eslint",
"ecmaVersion": 12,
"sourceType": "module",
},
}
复制代码
上面parserOptions.parser
很多同窗确定看的有点迷糊,这是因为外层的解析器只能有一个,咱们已经用了vue-eslint-parser
就不能再写其余的;所以vue-eslint-parser
的作法是在解析器选项中再传入一个解析器选项用来处理script
中的JS内容。
开启上面的选项后,VSCode 已经能正确的显示 ESlint 的报错信息,接下来要开启 prttier 的格式化。前面有说到,prettier 是一个校验代码格式化的工具,而 ESlint 的是校验语法的工具。一个项目维护两种配置可能有些麻烦,所以 ESlint 直接以插件的形式提供了支持。
要使用Prettier
固然先得安装它,而后还须要安装 eslint-plugin-prettier
。
为了防止Prettier
和ESLint
格式化功能冲突,还须要安装 eslint-config-prettier
来关闭ESLint
中的代码格式化功能。
yarn add -D eslint
yarn add -D eslint-plugin-prettier
yarn add -D eslint-config-prettier
复制代码
在 .prettierignore
和 .eslintignore
文件中能够添加那些不须要格式化的文件或文件夹,在美化代码挑bug时忽略这些文件。
下面来看看在ESLint
中添加Prettier
插件的配置文件是什么样子的:
{
plugins: ["prettier"],
rules: {
prettier/prettier: "error"
}
}
复制代码
在eslint-plugin-prettier
的GitHub
上给出了一种推荐配置:
{
extends: ["plugin:prettier/recommended"]
}
复制代码
咱们能够在项目中新建一个.prettierrc.json
文件:
{
// 尾逗号
"trailingComma": "es5",
// 缩进长度
"tabWidth": 4,
// 代码末尾分号
"semi": false,
// 单引号
"singleQuote": true,
// 单行代码最大长度
"printWidth": 100,
// 对象字面量的括号
"bracketSpacing": true,
// 箭头函数参数加括号
"arrowParens": "always",
}
复制代码
这里简单贴一些经常使用的,咱们能够在官网选项配置找到更多的配置规则。
这样配置后虽然能修复代码了,可是若是遇到另外一个也执拗己见的扩展,好比咱们引入eslint-config-standard
这个扩展,它也有本身的代码风格;若是经过 Prettier 格式化,standard 不干了;若是经过 standard 自动修复,那么 Prettier 又要报错了。
咱们能够利用extends中最后一个覆盖前面扩展的特性,咱们将eslint-config-prettier
配置在 extends 最后,就可以关闭一些与Prettier的规则:
{
extends: ["standard","plugin:prettier/recommended"]
}
复制代码
以后须要在 setting.json
中配置
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.codeActionsOnSave": {
"source.fixAll": true
("source.fixAll.eslint": true)
}
}
复制代码