现代前端工程化实战:Vite+Vue3 规范配置手册(含完整配置文件)
介绍下这些工具
1. ESlint
ESLint 是一个开源的 JavaScript 代码检查工具,用于识别和报告代码中的问题模式,帮助开发者保持代码风格一致并避免潜在错误。
核心价值
- 错误预防: 在运行前发现语法错误和潜在问题
- 代码规范 : 强制执行团队约定的编码风格
- 最佳实践 : 推广行业认可的最佳实践
- 自动修复 : 支持自动修复部分问题(通过 –fix 选项)
2. Stylelint
Stylelint 是现代前端开发中不可或缺的样式表检查工具,专为 Css/Scss/Less 等预处理器设计,提供超过 170 条内置规则,可帮助团队维护一致的样式代码风格并避免错误。
核心特性
- 多预处理器支持 : 原生支持 CSS/SCSS/Sass/Less/SugarSS
- 可扩展规则 : 支持自定义规则和插件
- 自动修复能力 : 通过 –fix 参数自动修复部分问题
- 配置共享 : 支持通过 npm 包共享配置
- 与构建工具集成 : 完美配合 webpack/Vite/Rollup 等工具
3. Prettier
Prettier 是当前前端领域最流行的代码格式化工具,它通过解析代码并重新打印的方式,强制实施一致的代码风格,彻底解决团队中的代码风格争论。
核心设计理念
- 固执己见 : 提供极少的配置选项,减少风格争论
- 多语言支持 : 支持 JavaScript/TypeScript/JSX/CSS/SCSS/HTML/Vue 等
- 无视原始格式 : 完全按照配置重写代码
- 集成友好 : 与主流编辑器和构建工具无缝集成
4. Commitlint
Commitlint 是一个用于强制执行规范化 Git 提交信息的工具,它通过验证 commit-msg 钩子确保每个提交都符合预定义的格式标准,是构建现代化 Git 工作流的关键组件。
核心价值
- 标准化提交 : 强制采用约定式提交(Conventional Commits)规范
- 自动化生成 : 为 CHANGELOG 和版本号提供结构化数据
- 团队协作 : 统一团队提交信息风格,提升可读性
- 流程集成 : 与 CI/CD 流程无缝对接,确保合规提交
5. Husky
Husky 是一个 Git 钩子工具,用于在 Git 操作前触发自定义脚本,如 lint、test 等。
核心功能
- 拦截 Git 钩子: 例如 pre-commit(提交前)、commit-msg(提交消息校验)、pre-push(推送前)。
- 本地强制检查: 确保代码提交前通过 ESLint、测试等验证,避免将问题代码推送到远程仓库。
6. lint-staged
lint-staged 仅对 Git 暂存区(staged)的文件运行指定的 lint 或格式化工具(如 ESLint、Prettier),避免全量检查整个项目,提升效率。
核心优势:
- 精准检查: 只处理本次修改的文件,减少不必要的耗时。
- 配合 Husky 使用: 通常在 pre-commit 钩子中触发。
PSE 三剑客的分工合作
Prettier、Stylelint、ESLint 这三个工具就像是一个代码质检团队的三个不同岗位,各司其职又互相配合:
三个工具的分工
1. ESLint - 代码"语文老师"
主要工作: 检查 JavaScript/TypeScript/Vue 代码的语法错误和代码风格
关注重点:
- 变量是否定义就使用
- 是否有未使用的变量
- 代码是否符合最佳实践
- 团队约定的命名规范(如驼峰命名)
特点: 会指出代码中的潜在问题,有些还能自动修复
2. Stylelint - 样式"美术老师"
主要工作: 检查 Css/Scss/Less 等样式代码的语法错误和代码风格
关注重点:
- 颜色值是否用错了格式(该用十六进制用了 rgb)
- 重复的样式定义
- 属性书写顺序(如定位属性应该写在一起)
- 浏览器兼容性问题
特点: 保证样式代码整洁美观,避免低级错误
3. Prettier - 代码"排版师傅"
主要工作: 不管代码逻辑,只管代码外观排版
关注重点:
- 该缩进的地方有没有缩进
- 该换行的地方有没有换行
- 引号用单引号还是双引号
- 行末要不要加分号
特点: 简单粗暴,直接按规则重新排版代码
它们怎么合作
1. 工作顺序
Prettier 先出手:把代码排版整得漂漂亮亮
ESLint/Stylelint 再检查:在漂亮排版的基础上找代码问题
2. 避免打架的秘诀
用 eslint-config-prettier:告诉 ESLint “排版的事让 Prettier 管,你别插手”
用 stylelint-config-prettier:同样告诉 Stylelint “样式排版让 Prettier 来”
3. 实际工作场景
当你在编辑器按保存时:
- Prettier 先自动格式化代码(改排版)
- ESLint 接着检查代码问题(改逻辑)
- Stylelint 检查样式问题(改样式)
- 最后生成一份又规范又漂亮的代码
举个栗子
假设有一段很丑的代码:
function test() {
const a = 1;console.log("hello");
}
Prettier 处理后 :
function test() {
const a = 1;
console.log("hello");
}
ESLint 接着检查 :
- 可能会提示:“a 变量定义了但没使用”
- 可能会建议:“console.log 不应该提交到生产环境”
最终结果 :
function test() {
console.log("hello"); // eslint-disable-line no-console
}
工程化配置实战
实战项目代码参考环境介绍
- Node.js: v18+ (推荐 v20+)
- pnpm: v8+
1. 创建 Vue 项目
# 安装 pnpm(如果尚未安装)
npm install -g pnpm
# 创建 Vite + Vue + TypeScript 项目
pnpm create vite my-vue-app --template vue-ts
# 进入项目目录
cd my-vue-app
# 安装依赖
pnpm install
2. 安装 Prettier
1. 安装 Prettier
pnpm add -D prettier
2. 在项目根目录下创建 Prettier 配置文件
.prettierrc.cjs
module.exports = {
// 使用单引号而不是双引号
singleQuote: true,
// 不在语句末尾添加分号
semi: false,
// 在对象字面量的括号之间添加空格(例如:{ foo: bar })
bracketSpacing: true,
// HTML文件的空格处理方式为"ignore",不敏感处理空格
htmlWhitespaceSensitivity: 'ignore',
// 自动检测并保持文件原有的换行符风格(LF/CRLF)
endOfLine: 'auto',
// 尽可能在所有可能的地方添加尾随逗号(包括函数参数、数组和对象等)
trailingComma: 'all',
// 使用4个空格作为缩进
tabWidth: 4,
// 使用空格代替制表符
useTabs: false,
// 每行代码的最大宽度(超过会自动换行)
printWidth: 100,
// JSX中使用单引号而不是双引号
jsxSingleQuote: true,
// 在多行JSX元素中,将>放在最后一行的末尾而不是新起一行
jsxBracketSameLine: false,
// 在对象字面量中,只有当括号内有换行时才添加括号
arrowParens: 'avoid',
}
3. 在项目根目录下创建 Prettier 忽略文件
.prettierignore
/dist/
/node_modules/
*.min.js
3. 安装 ESLint
1. 安装 ESLint 及相关插件
pnpm add -D eslint eslint-plugin-vue @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-prettier @eslint/js vue-eslint-parser globals
2. 在项目根目录下创建 ESLint 配置文件
eslint.config.js
import js from '@eslint/js'
import vueParser from 'vue-eslint-parser'
import globals from 'globals'
import prettier from 'eslint-config-prettier'
import tsParser from '@typescript-eslint/parser'
import tsPlugin from '@typescript-eslint/eslint-plugin'
export default [
js.configs.recommended,
{
// TypeScript 支持
files: ['**/*.ts'],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
globals: {
...globals.browser,
},
},
plugins: {
'@typescript-eslint': tsPlugin,
},
rules: {
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_', // 忽略以 _ 开头的参数
varsIgnorePattern: '^_', // 可选:忽略以 _ 开头的变量
},
],
// '@typescript-eslint/no-explicit-any': 'warn',
},
},
{
// Vue 支持
files: ['**/*.vue'],
languageOptions: {
parser: vueParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: tsParser, // 添加 TypeScript 解析器
},
globals: {
...globals.browser,
...globals.node,
},
},
rules: {
'vue/multi-word-component-names': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'never',
component: 'always',
},
},
],
},
},
{
// 通用规则
rules: {
'no-unused-vars': 'off', // 禁用基础规则,使用 @typescript-eslint 版本
'no-console': 'warn',
eqeqeq: 'error',
semi: ['error', 'never'],
},
},
{
ignores: ['dist/**', 'node_modules/**', '**/*.min.js'],
},
prettier,
]
4. 安装 Stylelint
1. 安装 Stylelint 及相关插件
pnpm add -D stylelint stylelint-scss stylelint-config-standard-scss stylelint-config-prettier postcss-html stylelint-config-standard-vue stylelint-config-recess-order
2. 在项目根目录下创建 Stylelint 配置文件
.stylelintrc.cjs
module.exports = {
extends: [
'stylelint-config-standard-scss',
'stylelint-config-recommended-vue',
'stylelint-config-recess-order',
],
plugins: ['stylelint-scss'],
rules: {
'value-keyword-case': null,
'no-descending-specificity': null,
'function-url-quotes': 'always',
'no-empty-source': null,
'selector-class-pattern': null,
'value-no-vendor-prefix': null,
'property-no-vendor-prefix': null,
'selector-pseudo-class-no-unknown': [
true,
{ ignorePseudoClasses: ['global', 'deep', 'v-deep'] },
],
'selector-pseudo-element-no-unknown': [
true,
{ ignorePseudoElements: ['v-deep', 'v-global', 'v-slotted'] },
],
'scss/at-rule-no-unknown': true,
'scss/dollar-variable-no-missing-interpolation': true,
'scss/operator-no-unspaced': true,
'alpha-value-notation': 'number',
'color-function-notation': 'modern',
'hue-degree-notation': 'number',
},
ignoreFiles: ['**/node_modules/**', '**/dist/**', '**/*.js', '**/*.ts'],
}
5. 配置 Git Hooks
1. 安装 Husky lint-staged
pnpm add -D husky lint-staged
# 初始化 Git 仓库(如果尚未初始化)
git init
# 初始化 Husky
npx husky-init && pnpm install
2. 修改 pre-commit 钩子
修改 .husky/pre-commit:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
6. VSCode 工作区配置
创建 .vscode/settings.json:
请确保已安装 Prettier、ESLint、Stylelint 插件。
{
// ==================== 编辑器核心配置 ====================
"editor.tabSize": 2,
"editor.detectIndentation": false,
"editor.renderWhitespace": "selection",
"editor.wordWrap": "on",
"editor.cursorSmoothCaretAnimation": "on",
"editor.fontLigatures": true,
"editor.bracketPairColorization.enabled": true, // 括号配对彩色显示
"editor.guides.bracketPairs": "active", // 显示活动括号的引导线
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"eslint.enable": true,
"stylelint.enable": true,
"prettier.enable": true,
"css.validate": false,
"less.validate": false,
"scss.validate": false
}
7. 更新项目脚本
修改 package.json 中的 scripts 部分:
{
"scripts": {
"dev": "vite",
"build:test": "vue-tsc && vite build --mode test",
"build:pro": "vue-tsc && vite build --mode production",
"build": "vue-tsc -b && vite build",
"preview": "vite preview",
"lint": "eslint src",
"fix": "eslint src --fix",
"format": "prettier --write \"./**/*.{html,vue,ts,js,json,md,scss}\"",
"lint:eslint": "eslint src/**/*.{ts,vue} --cache --fix",
"lint:style": "stylelint src/**/*.{css,scss,vue} --cache --fix",
"prepare": "husky install",
"commitlint": "commitlint --config commitlint.config.cjs -e -V",
"preinstall": "node ./scripts/preinstall.js"
},
"lint-staged": {
"*.{js,ts,vue}": [
"eslint --fix",
"prettier --write"
],
"*.{css,vue}": [
"stylelint --fix --custom-syntax postcss-html",
"prettier --write"
],
"*.scss": [
"stylelint --fix --custom-syntax postcss-scss",
"prettier --write"
],
"*.{html,json,md}": [
"prettier --write"
]
}
}
8. 提交规范 (Commitlint)
1. 安装 Commitlint
pnpm add -D @commitlint/config-conventional @commitlint/cli
2. 配置文件
创建 commitlint.config.cjs:
module.exports = {
extends: ["@commitlint/config-conventional"],
rules: {
"type-enum": [
2,
"always",
[
"feat",
"fix",
"docs",
"style",
"refactor",
"perf",
"test",
"chore",
"revert",
"build",
],
],
"type-case": [0],
"type-empty": [0],
"scope-empty": [0],
"scope-case": [0],
"subject-full-stop": [0, "never"],
"subject-case": [0, "never"],
"header-max-length": [0, "always", 72],
},
};
3. 添加 commit-msg 钩子
npx husky add .husky/commit-msg "pnpm commitlint --edit $1"
配置结束,现在当我们填写 commit 信息的时候,前面就需要带着下面的 subject
- feat: 新特性、新功能
- fix: 修改 bug
- docs: 文档修改
- style: 代码格式修改, 注意不是 css 修改
- refactor: 代码重构
- perf: 优化相关,比如提升性能、体验
- test: 测试用例修改
- chore: 其他修改, 比如改变构建流程、或者增加依赖库、工具等
- revert: 回滚到上一个版本
- build: 编译相关的修改,例如发布版本、对项目构建或者依赖的改动
9. 强制使用 pnpm
1. 创建 preinstall 脚本
创建 scripts/preinstall.js:
if (!/pnpm/.test(process.env.npm_execpath || "")) {
console.warn(
`\u001b[33mThis repository requires using pnpm as the package manager ` +
`for scripts to work properly.\u001b[39m\n`
);
process.exit(1);
}
2. 更新 package.json
{
"scripts": {
"preinstall": "node ./scripts/preinstall.js"
}
}
10. 测试配置
1. 创建测试组件
创建 src/components/TestComponent.vue:
<template>
<div class="test-component">
<h1>Test Component</h1>
</div>
</template>
<script lang="ts">
export default {
name: "TestComponent",
};
const a = 1;
const b = "hello world";
</script>
<style scoped>
.test-component {color: red;}
</style>
2. 运行格式化命令
pnpm format
pnpm lint
pnpm stylelint
3. 测试 Git Hooks
echo "console.log('test')" > test.js
git add test.js
git commit -m "test" # 应该会自动修复代码格式