在当今快速发展的前端开发领域,保持高质量的代码和高效的团队协作至关重要。本文将详细介绍如何配置和使用一套现代化的前端开发工具链,包括 Prettier、Stylelint、Commitlint、ESLint、Husky 和 lint-staged。这些工具不仅能够帮助我们保持代码的一致性和质量,还能显著提高团队的协作效率。
1. 工具链概述
在深入了解每个工具之前,让我们先了解为什么需要这些工具,以及它们如何协同工作。
- Prettier:自动格式化代码,确保代码风格的一致性。
- Stylelint:检查和修复 CSS/SCSS 代码中的问题。
- Commitlint:规范化 Git 提交信息,提高版本历史的可读性。
- ESLint:静态分析 JavaScript/TypeScript 代码,及时发现潜在问题。
- Husky:利用 Git hooks 在代码提交前自动运行检查。
- lint-staged:只对暂存的文件运行 linter,提高效率。
这些工具共同构建了一个强大的质量保证体系,从代码编写、样式规范、到版本控制,全方位提升开发质量。
2. Prettier:代码格式化利器
2.1 安装与配置
首先,安装 Prettier:
pnpm add prettier -D
在项目根目录创建 .prettierrc
文件:
{ "semi": true, // 使用分号结尾
"singleQuote": true, // 使用单引号
"trailingComma": "es5", // 在 ES5 中有效的地方使用尾随逗号
"printWidth": 80, // 每行最大长度 80 字符
"tabWidth": 2, // 缩进使用 2 个空格
"endOfLine": "auto" // 根据文件原始行尾自动决定行尾格式
}
2.2 Prettier 工作原理
Prettier 通过解析代码为 AST(抽象语法树),然后重新打印代码来实现格式化。这意味着它不仅仅是简单的字符串操作,而是真正理解代码结构。
2.3 与其他工具集成
Prettier 可以与 ESLint 集成,通过 eslint-config-prettier
和 eslint-plugin-prettier
插件实现。这样可以避免 ESLint 和 Prettier 之间的规则冲突。
pnpm add eslint-config-prettier eslint-plugin-prettier -D
2.4 使用技巧
- 配置编辑器插件,实现保存时自动格式化。
- 使用
.prettierignore
文件排除不需要格式化的文件。
3. Stylelint:CSS 代码质量保障
3.1 安装与配置
安装 Stylelint 及相关插件:
pnpm add stylelint stylelint-config-standard stylelint-config-prettier stylelint-order -D
各插件的作用
stylelint
: Stylelint 主包,用于 CSS 检查。stylelint-config-html
: 支持 HTML 文件中的 CSS 检查。stylelint-config-prettier
: 关闭所有可能与 Prettier 冲突的规则。stylelint-config-recess-order
: 将 CSS 属性按推荐顺序排序。stylelint-config-recommended-scss
: 支持 SCSS 文件的基本规则。stylelint-config-recommended-vue
: 支持 Vue 文件中的 CSS 检查。stylelint-config-standard
: Stylelint 的标准配置。
创建 .stylelintrc
配置文件:
export default {
// 继承推荐规范配置
extends: [
'stylelint-config-standard',
'stylelint-config-recommended-scss',
'stylelint-config-recommended-vue/scss',
'stylelint-config-html/vue',
'stylelint-config-recess-order',
],
// 指定不同文件对应的解析器
overrides: [
{
files: ['**/*.{vue,html}'],
customSyntax: 'postcss-html',
},
{
files: ['**/*.{css,scss}'],
customSyntax: 'postcss-scss',
},
],
// 自定义规则
rules: {
// 允许 global 、export 、v-deep等伪类
'selector-pseudo-class-no-unknown': [
true,
{
ignorePseudoClasses: ['global', 'export', 'v-deep', 'deep'],
},
],
},
}
3.2 添加 Stylelint 脚本
在 package.json
的 scripts
中添加 Stylelint 脚本:
"scripts": {
"lint:stylelint": "stylelint "**/*.{css,scss,vue,html}" --fix"
}
3.3 常见 CSS 问题及 Stylelint 解决方案
- 属性顺序混乱:使用
stylelint-order
插件强制属性排序。 - 单位不一致:配置
unit-allowed-list
规则限制允许的单位。 - 颜色表示不统一:使用
color-hex-length
规则统一十六进制颜色的长度。
4. Commitlint:提交信息规范化
4.1 安装与配置
安装 Commitlint:
pnpm add @commitlint/cli @commitlint/config-conventional -D
4.2 各包的作用
@commitlint/cli
: Commitlint 主包,用于检查提交信息。@commitlint/config-conventional
: 使用 Angular 提交信息规范的配置
4.3 配置 commitlint.config.js
在项目根目录下创建 commitlint.config.js
文件,并添加以下内容:
module.exports = {
extends: ['@commitlint/config-conventional'], // 使用 Angular 提交信息规范
rules: {
'scope-empty': [2, 'never'], // 作用域不能为空
'subject-case': [2, 'never'], // 主题不强制大小写
'type-enum': [
2,
'always',
[
'feat', // 新功能
'fix', // 修复 bug
'docs', // 文档变更
'style', // 代码格式(不影响代码运行的变动)
'refactor', // 重构(既不增加新功能,也不修复 bug)
'perf', // 性能优化
'test', // 增加测试
'build', // 构建系统或外部依赖项的更改
'ci', // 持续集成的配置文件和脚本的更改
'chore', // 其他不修改 src 或测试文件的更改
'revert' // 回滚到上一个版本
]
]
}
};
4.4 好的提交信息示例
feat(user): add user registration functionality
fix(auth): resolve login page redirect issue
docs(api): update API documentation for new endpoints
5. ESLint:JavaScript 代码质量工具
5.1 安装与配置
安装 ESLint 及相关插件:
pnpm add eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-prettier eslint-plugin-vue -D
5.2 各插件的作用
eslint
: ESLint 主包,用于 JavaScript/TypeScript 代码检查。@babel/eslint-parser
: 使用 Babel 解析器解析最新的 JavaScript 语法。@typescript-eslint/eslint-plugin
: TypeScript 的 ESLint 插件。@typescript-eslint/parser
: TypeScript 的 ESLint 解析器。eslint-config-prettier
: 关闭所有可能与 Prettier 冲突的 ESLint 规则。eslint-plugin-prettier
: 将 Prettier 集成到 ESLint 中,使其作为一个 ESLint 规则运行。eslint-plugin-vue
: Vue.js 的 ESLint 插件。vue-eslint-parser
: Vue 文件的解析器。
5.3 配置 eslint.config.js
创建
import eslintPluginVue from 'eslint-plugin-vue';
import eslintPluginTs from '@typescript-eslint/eslint-plugin';
export default {
files: ['**/*.js', '**/*.ts', '**/*.vue'], // 需要检查的文件类型
ignores: ['node_modules/', 'dist/'], // 忽略的文件夹
languageOptions: {
ecmaVersion: 2021, // ECMAScript 版本
sourceType: 'module', // 使用 ES 模块
parser: '@typescript-eslint/parser', // TypeScript 解析器
},
plugins: {
vue: eslintPluginVue, // Vue 插件
'@typescript-eslint': eslintPluginTs, // TypeScript 插件
},
rules: {
'no-unused-vars': 'warn', // 未使用变量警告
'@typescript-eslint/no-unused-vars': 'warn', // TypeScript 未使用变量警告
},
overrides: [
{
files: ['*.vue'],
processor: 'vue/.vue', // 使用 Vue 处理器
}
],
};
6. Husky 和 lint-staged:自动化代码检查
6.1 安装与配置
安装 Husky 和 lint-staged:
pnpm add husky lint-staged -D
初始化 Husky:
pnpm husky install
添加 Git hooks:
echo "npx lint-staged" > .husky/pre-commit
echo 'npx --no-install commitlint --edit "$1"' > .husky/commit-msg
创建lint-staged.config.js文件
export default {
'*.{js,ts,tsx,vue}': ['eslint --fix', 'prettier --write'],
'*.{css,scss,vue,html}': ['stylelint --fix', 'prettier --write'],
'*.{json,md}': ['prettier --write'],
}
6.2 Git hooks 的重要性
Git hooks 允许我们在特定的重要动作发生时触发自定义脚本,例如 commit
、push
等。这为我们在提交代码前进行自动化检查提供了可能。
6.3 其他有用的 Git hooks
pre-push
:在推送代码到远程仓库前运行测试。post-merge
:在合并后更新依赖或重新构建项目。
7. 故障排除
- 工具冲突:确保 Prettier 和 ESLint 的规则不冲突,使用
eslint-config-prettier
可以帮助解决这个问题。 - 性能问题:对于大型项目,lint-staged 可能会变慢。可以考虑只在 CI 中运行完整检查,本地仅检查修改的文件。
- 规则过于严格:根据团队情况适当调整规则,找到平衡点。可以先设置为 "warn" 级别,而不是直接 "error"。
结论
通过配置和使用这套现代前端开发工具链,我们可以显著提高代码质量,增强团队协作效率。这些工具不仅帮助我们捕获潜在的错误,还能够强制执行一致的编码风格和提交规范。随着项目的发展,持续优化和调整这套工具链将会为团队带来长期的收益。
工具是为了服务开发过程,而不是成为负担。因此,要根据团队的实际情况和项目需求来灵活配置和使用这些工具。通过实践和迭代,您将找到最适合自己团队的工作流程