2、代码规范:集成ESLint与Prettier,配置统一的代码风格和校验规则
说实话,代码规范这件事,我见过太多团队栽跟头了。
刚入行那会儿,我总觉得代码能跑就行。直到有一次接手一个老项目,打开文件一看——有的用双引号,有的用单引号;有的行尾加分号,有的不加;缩进更是五花八门,2格、4格、甚至还有Tab和空格混用的。那天我光格式化代码就花了大半天。嗯,从那以后,我再也不敢忽视代码规范了。
这一章,我们就来聊聊怎么用ESLint和Prettier,给Vue项目定一套「铁规矩」。
2.1 为什么需要ESLint + Prettier?
先搞清楚这两个工具的分工:
- ESLint:负责「逻辑校验」。比如你定义了一个变量但没使用,它会报错。它管的是代码质量。
- Prettier:负责「格式美化」。比如一行代码太长自动换行,引号统一用单引号。它管的是代码颜值。
你想想看,如果只装ESLint,你写出来的代码可能逻辑没问题,但格式乱七八糟。如果只装Prettier,代码倒是好看了,但可能藏着未使用的变量、重复的import等隐患。所以,两者必须一起上。
核心原则:ESLint管「对不对」,Prettier管「好不好看」。两者互补,缺一不可。
2.2 安装与基础配置
我个人习惯在项目初始化时就装好这些工具。如果你是用Vite创建的项目,可以这样操作:
npm install -D eslint prettier eslint-plugin-vue eslint-config-prettier
这里解释一下每个包的作用:
| 包名 | 作用 |
|---|---|
eslint |
核心校验工具 |
prettier |
核心格式化工具 |
eslint-plugin-vue |
Vue专属的ESLint规则集 |
eslint-config-prettier |
关闭ESLint中与Prettier冲突的规则 |
小提示:记得把 eslint-config-prettier 放在 extends 数组的最后一位。这样它才能覆盖掉前面可能冲突的规则。
2.3 配置ESLint
在项目根目录创建 .eslintrc.cjs 文件(Vite项目推荐用cjs后缀):
module.exports = {
root: true,
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:vue/vue3-recommended',
'prettier',
],
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
rules: {
// 这里可以覆盖或补充规则
'vue/multi-word-component-names': 'off',
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
},
};
这里有个坑,我踩过。你看 vue/multi-word-component-names 这条规则,默认要求组件名必须是多个单词。但像 Home.vue、About.vue 这种单文件组件,其实很常见。所以我一般直接关掉它。
2.4 配置Prettier
创建 .prettierrc 文件:
{
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 100,
"arrowParens": "always"
}
这些配置项什么意思?我简单说一下:
semi: false—— 不要分号。我个人觉得Vue项目里分号有点多余,当然这看团队习惯。singleQuote: true—— 统一单引号。双引号在HTML里容易跟属性值混淆。tabWidth: 2—— 缩进2格。Vue官方也是这么推荐的。trailingComma: "all"—— 所有地方都加尾逗号。这样加新属性时不会产生多余的git diff。printWidth: 100—— 每行最多100字符。超过就自动换行。arrowParens: "always"—— 箭头函数参数始终加括号。比如(x) => x而不是x => x。
注意:Prettier的配置和ESLint的规则可能会有冲突。比如ESLint要求必须加分号,但Prettier配置了不加。这时候 eslint-config-prettier 就派上用场了——它会自动关闭ESLint中与Prettier冲突的规则。
2.5 集成到项目中
配置好了,怎么用?我建议做两件事:
第一,添加npm脚本。 在 package.json 里加上:
"scripts": {
"lint": "eslint . --ext .vue,.js,.ts --fix",
"format": "prettier --write ."
}
这样你随时可以运行 npm run lint 检查代码,或者 npm run format 一键格式化。
第二,配置编辑器自动格式化。 以VS Code为例,在 .vscode/settings.json 里加上:
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
这样每次保存文件,ESLint自动修复问题,Prettier自动格式化代码。你只管写,剩下的交给工具。
我的习惯:我还会在项目根目录放一个 .eslintignore 和 .prettierignore 文件,把 node_modules、dist 这些目录排除掉。不然每次运行都会扫描一堆没用的文件,浪费时间。
2.6 避坑指南
我曾经在一个项目里遇到过这样的问题:ESLint和Prettier明明都配置好了,但保存文件时,ESLint报的错和Prettier格式化的结果互相打架。比如ESLint要求缩进4格,Prettier却改成2格。
后来发现,是因为 eslint-config-prettier 没有放在 extends 数组的最后。记住,它必须最后加载,才能覆盖掉前面所有的样式规则。
还有一个常见问题:团队里有人用WebStorm,有人用VS Code,格式化效果不一样。我的建议是——统一用Prettier作为唯一的格式化工具,并且在项目里放一个 .editorconfig 文件,保证跨编辑器的基本一致性。
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
说白了,代码规范这件事,不是靠人自觉,而是靠工具强制。你想想看,如果每次提交代码前,ESLint和Prettier自动帮你检查、格式化,哪还有那么多扯皮的事?
嗯,这一章就到这里。下一章我们聊聊怎么配置Git提交规范,让每一次commit都干干净净。