本文基于React 项目配置,可以使用 create-react-app 。
- 因为每个人的代码习惯不一样,每个开发人员都需要和他人协作或者项目需要交接给下一代开发者。保持统一的代码规范,可以极大地提高效率,降低沟通和理解代码的成本。
- 等等
Eslint 它规范的是代码偏向语法层面上的风格,比如不能使用debugger、alert、。。。
npm install eslint --save-dev
npx eslint --init
module.exports = {
"root": true, // 标识当前配置文件为eslint的根配置文件,让其停止在父级目录中继续寻找。
"env": { // 运行环境配置,预设browser、es6、node、mocha等变量。这些环境并不是互斥的,所以你可以同时定义多个。
"browser": true,
"es6": true,
"node": true,
},
"extends": [ // 扩展第三方规则,可以被基础配置中的已启用的规则继承。
"eslint:recommended", // 集成 Eslint 中推荐的(打勾的)规则项 https://eslint.bootcss.com/docs/rules/
"plugin:react/recommended", // 用于React的ESLint规则
"plugin:react/jsx-runtime", // React 17 版本之后需要引入,这个解决 https://github.com/jsx-eslint/eslint-plugin-react#configuration
/*
Eslint 的三大通用规则,
1.Google标准: eslint-config-google
2.Airbnb标准: eslint-config-airbnb
3.Standard标准 eslint-config-standard
*/
"standard"
],
"globals": { // 定义全局环境变量。
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": { // 解析器配置项, 配置 JavaScript 语言选项
"ecmaFeatures": {
"jsx": true // 启用 JSX
},
"ecmaVersion": 2018, // ECMAScript 版本
"sourceType": "module"
},
"plugins": [ // 第三方插件。需要在 rules、extends 中定义后才会生效,如果没有则不生效。
"react"
],
"rules": {
/**
修改覆盖已经使用的规则。https://eslint.bootcss.com/docs/rules/
off | 0 :表示关闭规则
warn | 1 :表示将该规则转换为警告
error | 2 :表示将该规则转换为错误
*/
"semi": ["error", "never"],
"no-alert": 0, // 禁止使用alert
"no-multi-spaces": 1, // 不能用多余的空格
"no-console": 2, // 禁止使用console
},
"settings": { // 自定义信息,每个规则都可以访问到
"react": {
"version": "detect"
}
}
};
/**
* @name 检查命令
* @description --ext:可以指定在指定目录/文件; .js .jsx: react文件; src/:检测范围在src目录下匹配
*/
npx eslint --ext .js --ext .jsx src/
/**
* @name 修复命令(官方规则集带(扳手)图标的可以自动修复)
* @description --ext:可以指定在指定目录/文件; .js .jsx: react文件; src/:检测范围在src目录下匹配; --fix 检测完自动修复
*/
npx eslint --fix --ext .js --ext .jsx src/
每次输入eslint命令比较繁琐,可以在package.json 中配置这个脚本:
// npm run lint 或 npm run lint-fix
"scripts": {
"lint": "eslint --ext .js --ext .jsx src/",
"lint-fix": "eslint --fix --ext .js --ext .jsx src/",
}
根目录新建 .eslintignore 文件,把想要屏蔽的文件或目录名称添加上即可:
.eslintrc.js
.prettierrc.js
babel.config.js
vetur.config.js
/node_modules/
Prettier规范的是代码偏向于排版层面上的风格,比如缩进、一行代码太长了换不换行之类的代码排版问题等
// --save-exact 锁死版本
npm install --save-dev --save-exact prettier
// 此处的规则供参考,其中多半其实都是默认值,可以根据个人习惯改写
module.exports = {
printWidth: 80, //单行长度
tabWidth: 2, //缩进长度
useTabs: false, //使用空格代替tab缩进
semi: false, //句末使用分号
singleQuote: false, //使用单引号
arrowParens: "avoid",//单参数箭头函数参数周围使用圆括号-eg: (x) => xavoid:省略括号
bracketSpacing: true,//在对象前后添加空格-eg: { foo: bar }
insertPragma: false,//在已被preitter格式化的文件顶部加上标注
jsxBracketSameLine: false,//多属性html标签的‘>’折行放置
rangeStart: 0,
requirePragma: false,//无需顶部注释即可格式化
trailingComma: "none",//多行时尽可能打印尾随逗号
useTabs: false//使用空格代替tab缩进
};
npx prettier --write src/
// npm run prettier
"scripts": {
"lint": "eslint --ext .js --ext .jsx src/",
"lint-fix": "eslint --fix --ext .js --ext .jsx src/",
"prettier": "prettier --write src/"
}
根目录新建 .prettierignore 文件,把想要屏蔽的文件或目录名称添加上即可:
/.vscode
/dist
*.png
.gitignore
.prettierignore
LICENSE
.eslintcache
*.lock
yarn-error.log
.history
CNAME
/build
/public
比如说上文咱们写了好多这种bug,一个一个手动修复,太麻烦了。eslint提供了一个–fix的命令行,可以实现自动修复不符合规范的代码,但是这种修复不是万能的,官网中说,有这个(扳手)的图标对应的规则才是可以修复的。
先不考虑debugger这种只能手动修复的,在实际写代码中,更多时候遇到的是分号啦,单双引号啦这些可以被自动修复的错误,那么,我们还需要每次去手动敲npm run lint-fix嘛?那同样效率很低。现在利用vscode的eslint插件我们已经能一写完代码,就知道是否符合规范了。然而我们还想实现的是每次写完代码,按下ctrl+s保存时,它能够自动修复。
在vscode中按快捷键ctrl+shift+p,输入setting,打开setting.json
增加这段配置即可(如果未生效重启vscode):
//配置保存时按照eslint文件的规则来处理一下代码
"editor.codeActionsOnSave": {
"source.fixAll": true,
"eslint.autoFixOnSave" : true,
},
有些文件,我们不希望它受eslint管辖,可以在根目录新建.eslintignore文件,把想要自由的文件或目录丢进去即可:
.eslintrc.js
.prettierrc.js
babel.config.js
vetur.config.js
/node_modules/
husky是git hooks 工具。 可以防止使用 Git hooks 的一些不好的 commit 或者 push。
// 需要注意安装对应版本。(没有效果,换个版本试试)
npm install husky --save-dev
git commit 的时候 先去执行 pre-commit 里面的命令 : 我们在这里输出 husky 并且执行 npm run lint (我们在上文第一章,第4点加上的验证eslint的命令)。如果eslint验证通过了,则会进行commit 操作,否则会报eslint的错误提示
"husky": {
"hooks": {
"pre-commit": "echo 'husky' && npm run lint"
}
}
npm install --save-dev lint-staged
"lint-staged": {
"src/**/*.{js,jsx,vue}": [ // 执行对js jsx vue 文件验证,执行流程可以自定义,具体查看官网
"eslint",
]
}
- 因为每个开发人员使用的开发工具存在差异,就算使用同样的开发工具 vscode,我们也不能保证他安装了eslint插件。
- 可以使用 pakage.json 中配置的命令来检查和修复代码。因为项目中肯定需要安装eslint依赖,也肯定有我们配置的.eslintrc.js规则文件,这样依旧能保证代码的统一规范。
- 在vscode中,使用快捷键 ctrl + shift + p,搜索Settings.json,打开Settings.json文件
再settings.json 里面添加这段代码(如果未生效重启vscode或者升级一下vscode版本)。
// 配置保存时按照eslint文件的规则来处理一下代码
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"eslint.autoFixOnSave": true
}
//prettier可以格式化很多种格式,所以需要在这里对应配置下
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
//这个设置在ctrl+s的时候,会启用默认的格式化,这里是prettier
"editor.formatOnSave": true
npm i -D eslint-plugin-prettier
// .eslintrc.js
{
"plugins": ["prettier"], // 可以忽略 eslint-plugin- 部分,直接输入 prettier
"rules": {
"prettier/prettier": "error"
}
}
冲突的原因是,Eslint 与 Prettier 相互冲突了。当我们保存的时候。先执行eslint的自动修复,于是分号会加上。然后又执行prettier的修复,分号又去除,这就导致闪动,到头来还是报eslint的错。
npm i -D eslint-config-prettier
// .eslintrc.js
{
extends: [
'eslint:recommended', // 继承Eslint中推荐的(打钩的)规则项http://eslint.cn/docs/rules/
// eslint-plugin-react https://github.com/jsx-eslint/eslint-plugin-react#configuration
'plugin:react/recommended',
// 把 eslint-config-prettier 中设置的规则添加进来,让它覆盖上面设置的规则。这样就不会和上面的规则冲突了
'plugin:prettier/recommended'
]
}
rules中的规则,优先级高于 extends 中的规则。extends中 eslint 规则现在已被 eslint-config-prettier 规则覆盖掉。此时在rules中在定义,于是又和 prettier 中的规则产生冲突。
// .eslintrc.js
rules: {
"prettier/prettier": "error", // 默认是双引号
"quotes": ["error", "single"] // eslint 配置为单引号,则会与上面的配置形成冲突
}
那我们这种冲突应该怎么解决?
- 第一种方案:把自己想要的规则配置成npm包发布,然后引入到这个extends数组中。
- 第二种方案:relus中的配置和prettier中的保持一致即可。