1. 项目配置概述
在2023年的前端工程化实践中,一套完善的代码质量保障体系已经成为团队协作的标配。最近我在重构一个基于uniapp+vue3的中型项目时,完整配置了从代码编写到提交的全链路质量管控方案,包括ESLint 9(最新版)、Prettier、Husky、lint-staged等工具的深度整合。这套配置不仅能自动格式化代码风格,还能在提交前强制进行语法检查,有效避免了低级错误进入代码库。
相比常见的简单配置方案,这个配置有几个关键升级点:首先是采用ESLint 9的flat config新配置方式,抛弃了传统的.eslintrc.js;其次是实现了stylelint与CSS/SCSS的样式规范检查;最后通过巧妙的配置解决了uniapp特殊语法与vue3组合式API的校验兼容问题。整个配置过程耗时约2小时,但为后续团队开发节省了大量代码审查时间。
2. 工具链选型与核心配置
2.1 各工具职责与版本选择
这套工具链中每个组件都有明确的职责边界:
- ESLint 9:核心语法检查(采用flat config新格式)
- Prettier:代码风格格式化(与ESLint规则解耦)
- stylelint:CSS/SCSS样式规范检查
- Husky:Git钩子管理(版本8+)
- lint-staged:增量文件检查(优化校验性能)
- EditorConfig:基础编辑器配置
版本选择特别说明:
bash复制"eslint": "^9.0.0",
"prettier": "^3.0.0",
"husky": "^8.0.0",
"lint-staged": "^14.0.0",
"stylelint": "^16.0.0"
注意:ESLint 9开始必须使用ESM格式的配置文件,同时不再支持传统的.eslintrc.js配置方式
2.2 初始化配置步骤
- 创建基础配置文件结构:
bash复制├── .editorconfig
├── .eslint.config.js # ESLint9新配置格式
├── .husky/
│ └── pre-commit # Git钩子脚本
├── .lintstagedrc.json
├── .prettierrc.json
└── .stylelintrc.json
- 安装核心依赖(以pnpm为例):
bash复制pnpm add -D eslint@latest prettier stylelint \
husky lint-staged \
@typescript-eslint/parser @typescript-eslint/eslint-plugin \
eslint-plugin-vue @vue/eslint-config-typescript \
stylelint-config-standard-scss postcss-html
3. ESLint 9深度配置
3.1 flat config新格式解析
ESLint 9最大的变化是采用了基于数组的扁平化配置方式。以下是针对uniapp+vue3的完整配置示例:
javascript复制// .eslint.config.js
import vueParser from 'vue-eslint-parser'
import tsParser from '@typescript-eslint/parser'
import vuePlugin from 'eslint-plugin-vue'
import tsPlugin from '@typescript-eslint/eslint-plugin'
export default [
{
files: ['**/*.vue'],
languageOptions: {
parser: vueParser,
parserOptions: {
parser: tsParser,
extraFileExtensions: ['.vue'],
ecmaFeatures: { jsx: true },
ecmaVersion: 'latest',
sourceType: 'module'
}
},
plugins: {
vue: vuePlugin,
'@typescript-eslint': tsPlugin
},
rules: {
// Vue3特定规则
'vue/multi-word-component-names': 'off',
'vue/no-setup-props-destructure': 'error',
// 组合式API相关
'vue/script-setup-uses-vars': 'error'
}
},
// TypeScript配置
{
files: ['**/*.ts'],
languageOptions: {
parser: tsParser
},
rules: {
'@typescript-eslint/no-explicit-any': 'warn'
}
}
]
3.2 解决uniapp特殊语法问题
uniapp的模板语法需要特殊处理:
- 在
.eslint.config.js中添加uni-app全局变量声明:
javascript复制// 添加到配置数组中
{
languageOptions: {
globals: {
uni: 'readable',
wx: 'readable',
getApp: 'readable'
}
}
}
- 处理小程序特有的模板指令:
javascript复制rules: {
'vue/no-unused-vars': ['error', {
ignorePattern: '^uni-|^v-'
}]
}
4. Prettier与ESLint的协同配置
4.1 避免规则冲突的配置方案
关键是要安装eslint-config-prettier来关闭所有与Prettier冲突的ESLint规则:
bash复制pnpm add -D eslint-config-prettier
然后在.eslint.config.js中:
javascript复制import prettierConfig from 'eslint-config-prettier'
export default [
// ...其他配置
prettierConfig
]
Prettier独立配置(.prettierrc.json):
json复制{
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"semi": false,
"singleQuote": true,
"trailingComma": "none",
"bracketSpacing": true,
"arrowParens": "avoid",
"endOfLine": "auto"
}
4.2 保存时自动格式化配置
在VSCode中需要配置.vscode/settings.json:
json复制{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
},
"eslint.validate": ["javascript", "typescript", "vue"],
"stylelint.validate": ["css", "scss", "vue"]
}
5. Stylelint样式检查配置
5.1 基础样式规范配置
.stylelintrc.json核心配置:
json复制{
"extends": "stylelint-config-standard-scss",
"rules": {
"selector-class-pattern": null,
"no-descending-specificity": null,
"scss/at-rule-no-unknown": [
true,
{
"ignoreAtRules": ["/^uni-/", "mixin", "include"]
}
]
},
"overrides": [
{
"files": ["**/*.vue"],
"customSyntax": "postcss-html"
}
]
}
5.2 处理uniapp样式特殊语法
需要特别处理uniapp的样式扩展:
- 安装postcss插件:
bash复制pnpm add -D postcss-uniapp-plugin
- 创建
postcss.config.js:
javascript复制module.exports = {
plugins: [
require('postcss-uniapp-plugin')({
uniApp: {
enable: true,
prefix: 'uni'
}
})
]
}
6. Git提交拦截与增量检查
6.1 Husky + lint-staged完整配置
- 初始化Husky:
bash复制npx husky-init && pnpm install
- 配置
.lintstagedrc.json:
json复制{
"*.{js,ts,vue}": [
"eslint --fix --max-warnings 0",
"prettier --write"
],
"*.{css,scss}": [
"stylelint --fix",
"prettier --write"
]
}
- 修改
.husky/pre-commit:
bash复制#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
6.2 性能优化技巧
- 限制检查范围:
json复制{
"src/**/*.{js,ts,vue}": ["eslint --fix"]
}
- 缓存优化:
bash复制# 在package.json中添加
"lint-staged": {
"*.js": [
"eslint --cache --fix"
]
}
7. EditorConfig基础配置
.editorconfig通用配置:
ini复制root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
8. 常见问题与解决方案
8.1 ESLint与Vue3兼容问题
问题现象:<script setup>语法报错
解决方案:
javascript复制// .eslint.config.js
rules: {
'vue/script-setup-uses-vars': 'error',
'vue/no-setup-props-destructure': 'off'
}
8.2 Prettier格式化冲突
问题现象:JSX属性换行不一致
调整配置:
json复制{
"prettier.printWidth": 100,
"prettier.jsxBracketSameLine": false
}
8.3 性能优化实测数据
通过增量检查后,提交时的lint时间从原来的12-15秒降低到:
- 修改1个文件:0.8-1.2秒
- 修改5个文件:2-3秒
- 全量检查仍需要12秒左右
9. 完整配置示例与调试技巧
9.1 调试ESLint规则
- 查看生效规则:
bash复制npx eslint --print-config src/App.vue > eslint-config.json
- 单独测试某个规则:
bash复制npx eslint --rule 'vue/multi-word-component-names: off' src/components/*
9.2 配置验证命令
在package.json中添加:
json复制{
"scripts": {
"lint": "eslint . --ext .js,.ts,.vue",
"lint:fix": "eslint . --ext .js,.ts,.vue --fix",
"format": "prettier --write .",
"stylelint": "stylelint \"**/*.{css,scss,vue}\"",
"prepare": "husky install"
}
}
这套配置已经在生产环境运行3个月,累计拦截了600+次不规范提交,团队代码风格统一性提升明显。特别是在uniapp这种特殊框架下,通过合理的规则配置既保证了开发效率,又维持了代码质量。实际使用中建议根据团队习惯调整Prettier的printWidth等参数,找到最适合的代码折行方案。