有人可能不太清楚ESLint和Prettier之间的区别。前者主要是对代码质量的把控,比如当使用了未声明的变量会报错等,当然它也能对代码进行format,但是没有Prettier做得好,Prettier只对代码进行format,不管质量。
ESLint
基本使用
首先eslint是一个npm包,一般在项目中都会集成,主要用来定义一些规则约束代码,我们这里主要讲在vscode插件中的ESLint
与VScode 集成
在插件市场中搜ESLint,安装好插件,然后在IDE settings.json
中配置(也可以直接打开配置找到编辑器配置手动修改):
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
集成 husky 和 lint-staged
提交代码前进行lint和修复。需要集成如下两个工具:
- husky:在git的相应阶段(
pre-commit、commit-msg、pre-push
)触发配置的命令。 - lint-staged:在git暂存的文件上运行linters,历史文件忽略。
配置husky
1. 安装依赖
npx husky-init && npm install
复制代码
该命令 安装了husky依赖;创建了.husky
目录,其中包含pre-commit
hook文件,可在里面配置hook触发时的命令;package.json中增加了一条script:
{
"scripts": {
"prepare": "husky install"
}
}
复制代码
2. 配置.husky/pre-commit
之后修改.husky/pre-commit
hook文件:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
eslint --fix ./src --ext .vue,.js,.ts
复制代码
配置 lint-staged
1. 安装依赖
npm i lint-staged -D
复制代码
2. 在package.json中添加:
{
// ...
"lint-staged": {
"*.{vue,js,ts}": "eslint --fix" // 自行根据需要配置
},
}
复制代码
表示只对 git 暂存区的.vue、.js、.ts
文件执行eslint --fix
。
3. 修改.husky/pre-commit
hook:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
# eslint --fix ./src --ext .vue,.js,.ts # 这样会对历史记录文件lint
npx lint-staged # 只对本次add的文件lint
复制代码
这样,在每次执行git commit
时,会先对git staged中的文件进行Lint。
Prettier
与eslint的区别是,它只管代码格式,不管是否有什么语法错误,不关注代码质量。支持JS、TS、JSON、CSS、Vue、React等多种语言。
与ESLint一起使用
由于Prettier中关于format的规则和ESLint会有冲突,需要先安装如下的包,关闭ESLint中关于format的规则,采用Prettier中的规则:
eslint-config-prettier
:关闭ESLint中与Prettier产生冲突的stylistic规则。
此外,还能让Prettier作为ESLint的一项规则来使用,需安装如下插件:
eslint-plugin-prettier
:让Prrettier作为一个linter rule运行。这样IDE能直接使用与Linter的集成方案。
配置.eslintrc.js
文件,将plugin:prettier/recommended
作为最后一个extention:
{
"extends": ["plugin:prettier/recommended"]
}
复制代码
它展开来就是:
{
"extends": ["prettier"], // eslint-config-prettier
"plugins": ["prettier"], // 注册eslint-plugin-prettier
"rules": {
"prettier/prettier": "error", // 打开该插件提供的规则,并且是作为eslint的一条规则运行
"arrow-body-style": "off",
"prefer-arrow-callback": "off"
}
}
复制代码
与VScode集成
VScode中安装插件Prettier,然后settings.json
中指定formatter:
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[javascript]": { // 可指定某种语言的文件用prettier
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.formatOnSave": true
}
复制代码
注:如果与ESlint一起使用,安装了eslint-plugin-prettier
,那么它是作为ESLint的一条规则运行的,无需再单独为prettier配置VSCode,走ESlint的集成就行:
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
}
复制代码
React项目中eslint和prettier的配置
VScode插件eslint和prettier如果项目中有.eslintrc.js和prettier.js这样的配置文件的话,配置eslint和prettier插件的配置是不生效的,优先读取项目中的配置文件,所以除非项目中没有.eslintrc.js和prettier.js配置文件才去设置-->扩展里配置这俩插件,否则优先写入配置文件规则
React项目.eslintrc.js
文件
module.exports = {
"root": true,
"env": {
"browser": true,
"commonjs": true,
"es6": true,
"jest": true
},
"extends": [
"react-app", // create react app已集成
"react-app/jest", // create react app已集成
"eslint:recommended", // create react app已安装,使用eslint中recommened的规则
"plugin:react/recommended", // create react app已安装, recommended react linting configs
"plugin:@typescript-eslint/recommended", // 需额外手动安装 @typescript-eslint/eslint-plugin
"plugin:react-hooks/recommended", // create react app已安装, hooks相关的lint config
"plugin:prettier/recommended" // 安装好Prettier再添加,可先删除
],
"plugins": ["react", "@typescript-eslint"],
"parser": "@typescript-eslint/parser", // 需手动安装 @typescript-eslint/parser,This allows Eslint to understand TypeScript syntax
"parserOptions": {
"ecmaVersion": 11,
"ecmaFeatures": {
"jsx": true // Allows for the parsing of JSX
},
"sourceType": "module", // Allows for the use of imports
"project": "./tsconfig.json"
},
"settings": {
"react": {
"pragma": "React",
"version": "detect" // Tells eslint-plugin-react to automatically detect the version of React to use
}
},
"rules": {
"no-debugger": "off",
"no-console": "off",
"import/first": "error",
"react/prop-types": "off"
}
}
- .prettierrc
{
"useTabs": false,
"tabWidth": 2,
"printWidth": 100,
"singleQuote": true,
"trailingComma": "none",
"bracketSpacing": true,
"semi": false
}
然后最后还需要配置vscode的配置setting.json,因为需要配置并指定编辑器保存自动格式化的配置使用哪一个
- .vscode/setting.json
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.options": {
"configFile": ".eslintrc.js"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
}
既然有vscode插件,那么还装eslint的npm包吗?
要装。虽然vscode插件也可以单独配置格式,但是如果项目中有.eslintrc.js
文件,那么eslint插件会优先执行.eslintrc.js
文件的配置。
并且不是每个人都会装eslint的vscode插件。此时eslint的npm包就作为一个保障,并且里面的.eslintrc.js
配置就作为标准配置。
装vscode插件只是为了方便自己开发而已。
注:一般不会直接通过设置-->扩展对eslint和prettier插件进行配置因为不同的项目lint规则和格式化规则可能不同,所以应该在项目的维度进行配置,不同的项目使用不同的eslint.(js|rc|json)和prettier.(js|rc|json)去配置
ESlint插件和prettier插件这两个Vscode插件只是为了辅助开发的,可以结合vscode编辑器自动保存设置去调用对应的npm包eslint去检查代码的,以及在编辑器中检查到不规范的代码会有提示以及fix,要把他俩和项目中的npm包eslint和prettier区分
项目多人开发中,需要注意如果团队中使用的规范性工具不一样,就没必要强行使用ESLint和Prettier插件,以及没必要对vscode设置保存时格式化,因为强行格式化可能会导致代码风格编乱,导致代码冲突问题很严重
使用vscode自带的格式化文档就好,vscode自带的有对各种类型包括(html css js ts等文件的)的格式化,右键----格式化文档即可
总结
只要项目中存在eslintrc和prettierrc等配置文件,就只需要在插件商店安装ESLint和Prettier插件即可无需对其就行配置,因为他们优先读取配置文件,只需要使用他俩的可视化修复以及智能提示作用,至于vscode编辑器配置自动保存格式化需结合具体情况,实在不行使用vscode默认的格式化文档也足够了。