vue3 基础工程化配置
- ESLint:
-
- 作用: 用于识别和修复 JavaScript 代码中的问题。
- 好处: 帮助开发者遵循最佳实践,减少 bug 并提高代码的一致性。
- Prettier:
-
- 作用: 一个代码格式化工具。
- 好处: 自动格式化代码,确保团队中每个人的代码风格一致,减少因代码格式而产生的冗余代码审查。
- commitlint:
-
- 作用: 验证 commit 信息是否符合规范(如遵循 Angular 提交信息规范)。
- 好处: 规范化提交信息,有助于生成 changelog,版本管理和回溯问题。
- Husky:
-
- 作用: 一个 Git hooks 工具,可以在 Git 的各个生命周期事件(如提交代码前、推送代码前等)触发自定义脚本。
- 好处: 在提交代码前执行指定的检查(如 ESLint 检查、单元测试等),确保代码质量。
- lint-staged:
-
- 作用: 只对暂存区(staged)的文件执行 lint 操作。
- 好处: 提高效率,只对需要提交的文件进行检查,避免全量文件检查带来的性能问题。
- cz-git:
-
cz-git是一个用于 Git 提交消息的工具,通常与 Commitizen 一起使用,以帮助生成符合约定格式的提交消息。它可以帮助团队遵守一致的提交消息格式,从而提高代码的可读性和可维护性。
安装:
pnpm add -D eslint
pnpm add -D @eslint/js
pnpm add -D globals
pnpm add -D typescript-eslint
pnpm add -D eslint-plugin-vue
pnpm add -D vue-eslint-parser
pnpm add -D eslint-config-prettier
pnpm add -D eslint-plugin-prettier
pnpm add -D prettier
npm install -g commitizen
pnpm add -D @commitlint/cli
pnpm add -D @commitlint/config-conventional
pnpm add -D husky
pnpm add -D lint-staged
pnpm add -D cz-git
- eslint:这是一个广泛使用的 JavaScript 和 TypeScript 代码静态分析工具,用以发现和修复代码中的问题。
- @eslint/js:这个包为 ESLint 提供了 JavaScript 相关的规则和配置。
- globals:这个包提供了一组全局变量的定义,可以在 ESLint 配置中使用,以避免 ESLint 报告未定义的全局变量错误。
- typescript-eslint:这是一个工具,它将 TypeScript 代码解析为 ESLint 可以理解的格式,使得 ESLint 能够检查 TypeScript 源码。
- eslint-plugin-vue:这是一个 ESLint 插件,用于 Vue.js 项目的代码检查,提供了一组适用于 Vue.js 的规则。
- vue-eslint-parser:这是一个支持 Vue 文件的 ESLint 解析器,使 ESLint 能够解析和检查
.vue文件中的代码。 - eslint-config-prettier:这是一个 ESLint 配置,用于关闭所有可能与 Prettier 冲突的规则,以便在使用 Prettier 格式化代码时不引起与 ESLint 的冲突。
- eslint-plugin-prettier:这个插件将 Prettier 作为 ESLint 规则运行,并将 Prettier 格式问题报告为 ESLint 问题。
- prettier:这是一个代码格式化工具,可以自动格式化代码以符合一致的风格。
- commitizen:这是一个工具,用于规范化 git 提交消息,使其符合预定的格式。
- @commitlint/cli:这是 Commitlint 的命令行工具,用于检查 git 提交消息是否符合指定的规则。
- @commitlint/config-conventional:这是 Commitlint 的一个配置,使用了标准的 Angular 提交信息格式规范。
- husky:这是一个工具,用于在 git 钩子中运行脚本。常用于在 git 提交时自动运行代码检查和测试。
- lint-staged:这是一个工具,用于运行特定的 linters 只检查 git 暂存区中的文件,以加快检查速度和确保提交的代码质量。
- cz-git:这是 Commitizen 的一个插件,提供了一个交互式命令行界面,用于生成符合规范的 git 提交信息。
配置:
1、eslint(9.38.0)
在项目根目录创建 eslint.config.js (eslint9 不在支持以前旧的文件命名方式,具体可以查看官方文档)
import { defineConfig } from 'eslint/config';
import globals from 'globals'
import js from '@eslint/js'
import tseslint from 'typescript-eslint'
import pluginVue from 'eslint-plugin-vue'
import VueEslintParser from 'vue-eslint-parser'
// 自 9.0 以来,eslint 不再有格式化规则,typescript 的主要维护者在他的文章 "You Probably Don't Need eslint-config-prettier or eslint-plugin-prettier" 中建议不要使用 `eslint-config-prettier`。
// import eslintConfigPrettier from 'eslint-config-prettier'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'
// 获取当前文件的目录路径
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
// 读取 .eslintrc-auto-import.json 文件
// 导入到全局,用于 ts 自动识别
// .eslintrc-auto-import.json 来自 vite 插件 unplugin-auto-import
// unplugin-auto-import 插件作用自动导入预设库的 API,在使用的地方不在需要手动 import 导入
// 具体配置在 vite.config.ts ,如果没有使用 unplugin-auto-import 这里配置可以忽略
const autoImportPath = path.resolve(__dirname, 'src/types/.eslintrc-auto-import.json')
const autoImportConfig = JSON.parse(fs.readFileSync(autoImportPath, 'utf8'))
export default defineConfig([
// 基础 JS 配置
js.configs.recommended,
// TypeScript 推荐配置(打平)
...tseslint.configs.recommended,
// Vue 基础配置
...pluginVue.configs['flat/recommended'],
// 全局浏览器环境
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
...autoImportConfig.globals, // 合并自动导入的 globals
},
},
},
/ Vue 解析器(关键修复)
{
files: ['**/*.vue'],
languageOptions: {
parser: VueEslintParser, //不要全局配置 VueEslintParser ,否则会尝试解析非 Vue 文件
parserOptions: {
parser: tseslint.parser,
extraFileExtensions: ['.vue'],
ecmaFeatures: { jsx: true },
},
},
},
// JSON 配置(使用官方 recommended)
json.configs.recommended,
// 自定义规则
{
rules: {
// 基础规则
'prettier/prettier': 'error', // 启用 Prettier 作为 ESLint 规则
'no-var': 'error', // 禁止使用 var,强制使用 let 或 const
'prefer-const': 'warn', // 建议使用 const 来声明不会被重新赋值的变量
quotes: ['error', 'single', { avoidEscape: true }], // 强制使用单引号
semi: ['error', 'always'], // 强制语句结尾使用分号
'no-trailing-spaces': 'error', // 禁止行尾空格
'no-multiple-empty-lines': ['warn', { max: 1 }], // 限制连续空行数量为 1
'no-unexpected-multiline': 'error', // 防止多行表达式引起的错误
'no-useless-escape': 'off', // 允许某些不必要的转义字符
'no-undef': 'off', // 关闭对 TS 类型名的误报,由 TS 本身负责未定义标识符检查
// TypeScript 相关规则
'@typescript-eslint/no-unused-vars': 'error', // 禁止未使用的变量
'@typescript-eslint/prefer-ts-expect-error': 'error', // 建议使用 @ts-expect-error 而不是 @ts-ignore
'@typescript-eslint/no-explicit-any': 'warn', // 允许使用 any 类型
'@typescript-eslint/no-non-null-assertion': 'off', // 允许使用非空断言操作符(!)
'@typescript-eslint/no-namespace': 'off', // 允许使用自定义命名空间
'@typescript-eslint/semi': 'off', // 关闭与 semi 规则冲突的规则
// Vue 相关规则
'vue/html-indent': ['error', 2], // 强制模板缩进为 2 个空格
'vue/max-attributes-per-line': ['warn', { singleline: 3 }], // 单行元素最多允许 3 个属性
'vue/multi-word-component-names': 'off', // 允许单词组件名
'vue/no-mutating-props': 'off', // 允许直接修改 props,(前提是 prop 是一个对象)
'vue/attribute-hyphenation': 'off', // 允许在模板中使用驼峰命名的属性
// indent, semi 已移除
'no-unused-vars': 'off', // 关闭与 @typescript-eslint/no-unused-vars 冲突的规则
},
},
// Prettier 集成
eslintPluginPrettier,
// 忽略
{
ignores: ['node_modules/', 'dist/', 'build/', '**/*.d.ts', 'public/', '.vite/']
},
])
package.json
{
"scripts": {
"lint": "eslint",
"lint:fix": "eslint --fix",
},
}
vite.config.ts(unplugin-auto-import 配置)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import AutoImport from 'unplugin-auto-import/vite'
import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
vueJsx({
transformOn: true,
mergeProps: true,
}),
AutoImport({
// 插件预设支持导入的api
imports: ['vue', 'vue-router', 'pinia'],
// 生成 TypeScript 类型声明文件的路径。
// 文件 auto-imports.d.ts 将包含所有自动导入的类型声明。
dts: 'src/types/auto-imports.d.ts',
// 设置为 true,表示支持在 Vue 模板中自动导入。
vueTemplate: true,
// 设置为 true,表示自动导入的依赖将被 Vite 优化。
viteOptimizeDeps: true,
// ESLint 相关的设置
eslintrc: {
// 启用 ESLint 配置生成。如果设置为 true,将根据自动导入的配置生成 ESLint 配置文件。
enabled: true,
// 生成的 ESLint 配置文件的路径
// 文件 .eslintrc-auto-import.json 将包含 ESLint 的设置
filepath: 'src/types/.eslintrc-auto-import.json',
// 自动导入的模块设置全局变量的属性值
// 将其设置为 true,意味着这些自动导入的模块在 ESLint 配置中将作为全局变量进行处理。
globalsPropValue: true,
},
}),
],
})
2、prettier
在项目根目录创建 prettier.config.js (根据自己所需配置对应规则)
/**
* @see https://prettier.io/docs/en/configuration.html
* @type {import("prettier").Config}
*/
const config = {
printWidth: 120,
semi: false,
singleQuote: true,
}
export default config
package.json(脚本配置)
{
"scripts": {
"prettier:check": "prettier --check .",
"prettier:write": "prettier --write .",
},
}
3、commitlint
在项目根目录创建 commitlint.config.js
export default { extends: ['@commitlint/config-conventional'] }
4、lint-staged
在项目根目录创建 lint-staged.config.js
lint-staged 在 git commit 之前自动对暂存文件执行检查和格式化。
export default {
'*.{js,jsx,ts,tsx}': ['eslint --fix --max-warnings=-1', 'prettier --write'],
'*.vue': ['eslint --fix --max-warnings=-1', 'prettier --write'],
'*.{css,scss,less,html,md,json,yml,yaml}': ['prettier --write']
};
# 没有这个参数时(默认行为)
eslint --fix
# 有 warning 或 error → 退出码非0 → git 提交被阻止
# 加上 --max-warnings=-1
eslint --fix --max-warnings=-1
# 只有 error → 退出码非0 → git 提交被阻止
# 只有 warning → 退出码0(成功)→ git 提交继续
5、husky
# 1、只是一种 husky 的快捷配置,执行以下命令,会在项目中生成 .husky/pre-commit 脚本
# 2、会在 package.json 中添加 prepare 脚本
pnpm exec husky init
# 添加 commit-msg hook,目的代码提交时,对提交信息进行校验
echo "pnpm dlx commitlint --edit $1" > .husky/commit-msg
# 如下对应脚本的内容:
## pre-commit
### git 每次提交之前都会执行 npx lint-staged 。
### lint-staged 会对所有暂存区的文件进行检查,而不是整个代码库。这提高了效率,因为只对修改过的文件进行检查。
npx lint-staged
## commit-msg
### 在提交代码时,你可以通过 pnpm dlx 来运行 commitlint,确保提交消息符合规范。
pnpm dlx commitlint --edit \
6、cz-git
一款工程性更强,轻量级,高度自定义,标准输出格式的 commitizen 适配器
可以在 package.json 中配置快速提交脚本。
{
"scripts": {
"cm": "git add -A && cz && git push",
},
"config": {
"commitizen": {
"path": "node_modules/cz-git"
}
}
}
# 经过以上配置在提交代码是可以直接运行如下脚本:
pnpm cm
Commitizen 规范 Git 提交说明
alidocs.dingtalk.com/i/nodes/k2w…
1、选择提交类型:
2、变更范围:
3、变化描述:
4、详细描述:
5、列出重大变更:
6、选择变更的问题类型:
7、确认提交:
8、开始执行 lint-staged
修复以上问题后,重新提交!