大家好,我是今天的主讲人,咱们今天聊聊 JavaScript 代码界的两位“管家”:ESLint 和 Prettier。 这两位可不是吃素的,它们一个负责代码质量,一个负责代码美观,联手打造赏心悦目的代码体验。 准备好了吗? 咱们这就开始!
第一部分:ESLint,代码质量的“鹰眼”
ESLint,可以理解为代码界的“质检员”,它的主要职责就是检查你的代码,找出潜在的错误、不规范的地方,并给出建议,让你的代码更健壮、更易维护。
-
ESLint 的核心原理
ESLint 的工作流程大致可以分为以下几个步骤:
-
解析 (Parsing): ESLint 首先会将 JavaScript 代码解析成抽象语法树 (Abstract Syntax Tree, AST)。 AST 是代码的一种结构化表示,方便 ESLint 进行分析。
-
遍历 (Traversal): ESLint 会遍历 AST 的每一个节点,检查代码是否符合预先定义的规则。
-
规则 (Rules): 规则是 ESLint 的核心,它定义了哪些代码风格是可接受的,哪些是不允许的。 ESLint 内置了很多规则,同时允许你自定义规则。
-
报告 (Reporting): 如果代码违反了规则,ESLint 会生成报告,指出错误的位置和原因。
-
-
ESLint 的配置
ESLint 的配置主要通过
.eslintrc.js
(或者.eslintrc.json
,.eslintrc.yaml
等) 文件来完成。 这个文件告诉 ESLint 使用哪些规则,以及如何处理违反规则的代码。一个简单的
.eslintrc.js
示例:module.exports = { env: { browser: true, es2021: true, node: true, }, extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier', ], parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 12, sourceType: 'module', }, plugins: ['@typescript-eslint'], rules: { 'no-unused-vars': 'warn', // 将未使用的变量视为警告 'no-console': 'warn', // 将 console.log 视为警告 'semi': ['error', 'always'], // 强制使用分号 'quotes': ['error', 'single'], // 强制使用单引号 'no-unused-expressions': 'warn', // 警告未使用的表达式 }, };
- env: 指定代码运行的环境,比如
browser
(浏览器),node
(Node.js),es2021
(ES2021 语法) 等。 - extends: 继承其他配置,比如
eslint:recommended
(ESLint 官方推荐的规则),plugin:@typescript-eslint/recommended
(TypeScript 推荐规则),prettier
(整合 Prettier)。 - parser: 指定代码解析器,比如
@typescript-eslint/parser
(用于解析 TypeScript 代码)。 - parserOptions: 配置解析器的选项,比如
ecmaVersion
(ECMAScript 版本),sourceType
(模块类型)。 - plugins: 使用插件,比如
@typescript-eslint
(用于 TypeScript 支持)。 - rules: 自定义规则。 规则的值可以是以下几种:
"off"
或0
: 禁用该规则。"warn"
或1
: 将违反该规则视为警告。"error"
或2
: 将违反该规则视为错误。
- env: 指定代码运行的环境,比如
-
常用的 ESLint 规则
ESLint 提供了大量的规则,涵盖了代码风格、潜在错误、最佳实践等各个方面。 这里列举一些常用的规则:
规则名称 描述 示例 no-unused-vars
禁止未使用的变量。 const a;
// ESLint 会发出警告no-console
禁止使用 console.log
等方法。 在生产环境中,这些方法可能会泄露敏感信息。console.log('debug info');
// ESLint 会发出警告semi
强制使用分号。 统一代码风格,避免潜在的语法错误。 const a = 1
// ESLint 会发出错误,提示添加分号quotes
强制使用单引号或双引号。 同样是为了统一代码风格。 const str = "hello";
// 如果配置了单引号,ESLint 会发出错误eqeqeq
强制使用 ===
和!==
,而不是==
和!=
。 避免类型转换带来的意外情况。if (a == 1) { ... }
// ESLint 会发出错误,提示使用===
no-unused-expressions
禁止没有副作用的表达式. 经常是无意义的代码. a + b;
// 如果a+b没有赋值给任何变量, 没有函数调用, ESLint 会发出警告no-extra-boolean-cast
禁止不必要的布尔类型转换. if (!!foo) { ... }
// 如果foo本身已经是布尔值, 那么!!foo就是多余的. ESLint 会发出警告 -
ESLint 的集成
ESLint 可以集成到各种编辑器和构建工具中,实现代码的自动检查。
- 编辑器集成: VS Code, Sublime Text, Atom 等编辑器都有 ESLint 插件,可以实时检查代码。
- 构建工具集成: Webpack, Rollup, Parcel 等构建工具可以通过 ESLint 插件在构建过程中检查代码。
- Git Hooks 集成: 使用 Husky 和 lint-staged,可以在提交代码前自动运行 ESLint,确保提交的代码符合规范。
下面是一个使用 Husky 和 lint-staged 的示例:
-
安装 Husky 和 lint-staged:
npm install husky lint-staged --save-dev
-
配置
package.json
:{ "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ "eslint --fix", "git add" ] } }
-
启用 Husky:
npx husky install
这样,每次提交代码前,lint-staged 都会自动运行 ESLint,并修复可以自动修复的问题。
第二部分:Prettier,代码风格的“美容师”
Prettier 是一位专业的代码格式化工具,它的职责就是让你的代码看起来更漂亮、更统一。 它会自动调整代码的缩进、空格、换行等,让代码风格保持一致。
-
Prettier 的核心原理
Prettier 的工作原理和 ESLint 有些不同。 它不关心代码的语义,只关注代码的格式。
- 解析 (Parsing): Prettier 也会将代码解析成 AST。
- 格式化 (Formatting): Prettier 会根据预先定义的规则,将 AST 转换成格式化后的代码。 这个过程会涉及到代码的缩进、空格、换行等调整。
- 输出 (Printing): Prettier 将格式化后的代码输出。
-
Prettier 的配置
Prettier 的配置主要通过
.prettierrc.js
(或者.prettierrc.json
,.prettierrc.yaml
等) 文件来完成。 这个文件告诉 Prettier 使用哪些格式化规则。一个简单的
.prettierrc.js
示例:module.exports = { semi: true, // 强制使用分号 singleQuote: true, // 强制使用单引号 tabWidth: 2, // 使用 2 个空格作为缩进 useTabs: false, // 不使用 tab 缩进 trailingComma: 'es5', // 在 ES5 中允许尾随逗号 bracketSpacing: true, // 在括号内添加空格 arrowParens: 'always', // 箭头函数参数始终使用括号 };
- semi: 是否使用分号。
- singleQuote: 是否使用单引号。
- tabWidth: 缩进的空格数。
- useTabs: 是否使用 tab 缩进。
- trailingComma: 是否允许尾随逗号。
- bracketSpacing: 是否在括号内添加空格。
- arrowParens: 箭头函数参数是否使用括号。
-
Prettier 的优势
Prettier 的优势在于:
- 自动化格式化: Prettier 可以自动格式化代码,无需手动调整。
- 统一代码风格: Prettier 可以确保整个项目的代码风格一致。
- 节省时间: Prettier 可以节省大量手动格式化代码的时间。
- 减少争论: Prettier 可以减少团队成员在代码风格上的争论。
-
Prettier 的集成
Prettier 也可以集成到各种编辑器和构建工具中。
- 编辑器集成: VS Code, Sublime Text, Atom 等编辑器都有 Prettier 插件,可以实时格式化代码。
- 构建工具集成: Webpack, Rollup, Parcel 等构建工具可以通过 Prettier 插件在构建过程中格式化代码。
- Git Hooks 集成: 同样可以使用 Husky 和 lint-staged 在提交代码前自动运行 Prettier。
在上面的 Husky 和 lint-staged 示例中,只需要将
eslint --fix
替换为prettier --write
即可:{ "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ "prettier --write", "git add" ] } }
第三部分:ESLint 和 Prettier 的完美结合
ESLint 和 Prettier 各有所长,它们的结合可以实现代码质量和代码风格的双重保障。 但是,如果配置不当,它们可能会发生冲突。 比如,ESLint 可能会抱怨 Prettier 格式化后的代码不符合规则。
为了解决这个问题,我们需要使用 eslint-config-prettier
和 eslint-plugin-prettier
。
- eslint-config-prettier: 禁用所有可能与 Prettier 冲突的 ESLint 规则。 相当于告诉 ESLint,“代码风格的事情交给 Prettier 处理,你不要管了”。
- eslint-plugin-prettier: 将 Prettier 集成到 ESLint 中,让 ESLint 使用 Prettier 来格式化代码。 这样,ESLint 就可以检查 Prettier 格式化后的代码是否符合规范。
-
安装必要的依赖
npm install eslint-config-prettier eslint-plugin-prettier --save-dev
-
配置
.eslintrc.js
在
.eslintrc.js
的extends
数组中,添加prettier
和plugin:prettier/recommended
。 确保prettier
放在数组的最后面,这样可以覆盖之前的配置。module.exports = { // ... 其他配置 extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier', 'plugin:prettier/recommended', ], plugins: ['@typescript-eslint', 'prettier'], rules: { 'prettier/prettier': 'error', // 将 Prettier 的错误显示为 ESLint 的错误 // ... 其他规则 }, };
注意,
plugin:prettier/recommended
包含了eslint-plugin-prettier
和eslint-config-prettier
,它会自动配置eslint-plugin-prettier
,并禁用与 Prettier 冲突的规则。 -
配置
.prettierrc.js
配置 Prettier 的格式化规则,比如缩进、空格、换行等。 这个配置会影响最终的代码风格。
第四部分:最佳实践
-
保持配置简单
ESLint 和 Prettier 的配置应该尽量简单明了,避免过度配置。 使用官方推荐的规则和配置,可以减少出错的概率。
-
逐步引入
如果你的项目已经存在大量的代码,一次性引入 ESLint 和 Prettier 可能会导致大量的错误和警告。 建议逐步引入,先配置一些基本的规则,然后逐步增加规则。
-
自动修复
ESLint 和 Prettier 都提供了自动修复功能。 使用
--fix
参数可以自动修复一些简单的问题。 例如:eslint --fix src/**/*.js prettier --write src/**/*.js
-
代码审查
即使使用了 ESLint 和 Prettier,代码审查仍然是必不可少的。 代码审查可以发现一些 ESLint 和 Prettier 无法发现的问题,比如代码逻辑错误、性能问题等。
-
团队协作
在团队协作中,统一的代码风格非常重要。 确保所有团队成员都使用相同的 ESLint 和 Prettier 配置,可以减少代码冲突和代码风格不一致的问题。
第五部分:总结
ESLint 和 Prettier 是 JavaScript 开发中不可或缺的工具。 它们可以帮助我们提高代码质量、统一代码风格、节省开发时间。 通过合理的配置和使用,我们可以打造出更加健壮、易维护、赏心悦目的代码。
希望今天的讲解对你有所帮助。 记住,代码不仅仅是给机器运行的,也是给人看的。 让我们一起努力,写出更好的代码!
感谢大家的聆听!