尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VSCode中配置Prettier与ESLint实现前端代码自动格式化

VSCode中配置Prettier与ESLint实现前端代码自动格式化 1. 为什么我们需要代码格式化如果你和我一样在VSCode里写过HTML、CSS、Vue和JS那你一定经历过这种场景接手一个项目打开一个文件代码缩进混乱不堪有的地方用两个空格有的地方用四个空格甚至还有制表符Tab和空格混用的情况。标签属性挤在一行CSS选择器嵌套得毫无章法Vue的template、script、style块之间没有清晰的空行分隔。这时候你只想做一件事按下一个快捷键让所有代码瞬间变得整洁、统一、赏心悦目。这就是代码格式化的魔力。它远不止是让代码“好看”那么简单。统一的代码风格是团队协作的基石它能显著提升代码的可读性减少因格式不一致导致的合并冲突更重要的是它能帮你规避许多因书写不规范而引发的潜在错误。想象一下一个缺少闭合标签的HTML结构或者一个因缩进错误而逻辑混乱的JavaScript函数在格式化工具的“火眼金睛”下往往能原形毕露。在VSCode这个强大的编辑器里实现这一切的核心就是格式化器Formatter和相关的插件Extension。我们的目标就是为这四种前端核心语言HTML、CSS、JavaScript/TypeScript、Vue配置一套高效、统一、符合现代前端开发规范的自动格式化工作流。让你在保存文件时或者按下Shift Alt FWindows/Linux或Shift Option FMac时代码自动“归位”。2. 核心工具选型Prettier 与 ESLint 的定位与协作面对众多的格式化工具如何选择在前端生态中Prettier和ESLint是两座绕不开的大山但它们的职责有清晰的分工。Prettier是一个“有主见的”代码格式化工具。它的核心目标是格式化即代码的“外貌”。它强制推行一套统一的代码风格规则比如缩进、分号、引号、行宽、对象和数组的尾随逗号等。你几乎无法配置“要不要分号”只能选择“用单引号还是双引号”这类有限的选项。这种“专制”带来的好处是团队中不再需要为代码风格争论所有人的代码输出格式完全一致。Prettier 原生支持 JavaScript、TypeScript、HTML、CSS、JSON、Markdown 等并通过插件支持 Vue、Less、SCSS 等。ESLint则是一个“可配置的”代码质量检查工具。它的核心目标是代码质量与潜在错误即代码的“健康”。它可以检查出未使用的变量、可能的逻辑错误、不符合最佳实践的写法如使用而非等。ESLint 有大量的规则可供配置团队可以根据自身情况选择开启或关闭某些规则。它主要负责逻辑层面对格式的检查只是其功能的一部分。那么在VSCode中我们如何让它们和谐共处最佳实践是让 Prettier 负责所有格式化工作让 ESLint 专注于代码质量问题。具体来说我们需要安装eslint-config-prettier这个配置它会关闭所有与 Prettier 冲突的 ESLint 格式化规则防止两者“打架”。这样当你保存文件时Prettier 会先执行格式化然后 ESLint 再基于代码质量规则进行检查并报告问题。对于 Vue 项目情况稍微特殊一点。Vue 单文件组件.vue包含了三种语言块。我们需要一个能理解这种混合语法的工具。这就是Volar和Vue - Official扩展VSCode 官方推荐结合 Prettier 插件的能力。或者你也可以直接使用prettier-plugin-vue等专用插件。在我们的配置中将重点展示如何让 Prettier 完美处理 .vue 文件。3. 环境准备与核心插件安装工欲善其事必先利其器。首先确保你已安装最新版的 VSCode。然后我们通过 VSCode 的扩展市场安装以下核心插件Prettier - Code formatter由 Prettier 官方维护的插件。这是我们的主力格式化器。ESLint由 Microsoft 官方维护的 ESLint 集成插件。VolarVue 3 官方推荐的开发体验插件它提供了强大的语言支持并内置了格式化能力通常与 Prettier 协作。对于新项目建议使用 Volar 并禁用旧的Vetur插件。安装完成后我们还需要在项目中通过 npm 或 yarn 安装对应的 Node.js 包以确保格式化规则的一致性。在你的项目根目录下打开终端执行# 使用 npm npm install --save-dev prettier eslint eslint-config-prettier # 如果你使用 Vue 3 且需要更细致的 Vue 相关规则可以额外安装 npm install --save-dev vue/eslint-config-prettier # 使用 yarn yarn add --dev prettier eslint eslint-config-prettier vue/eslint-config-prettier注意这里安装到devDependencies(--save-dev) 是因为格式化工具只在开发阶段需要不应打包到生产环境中。4. 配置文件详解.prettierrc 与 .eslintrc.js工具装好了接下来就是定规矩。我们需要创建配置文件来定义具体的格式化规则。4.1 创建 Prettier 配置文件.prettierrc在项目根目录创建一个名为.prettierrc的文件或者.prettierrc.json,.prettierrc.js等。这里以 JSON 格式为例配置一套我个人和团队常用的、符合现代前端习惯的规则{ printWidth: 100, tabWidth: 2, useTabs: false, semi: true, singleQuote: true, quoteProps: as-needed, jsxSingleQuote: false, trailingComma: es5, bracketSpacing: true, bracketSameLine: false, arrowParens: always, htmlWhitespaceSensitivity: css, vueIndentScriptAndStyle: true, endOfLine: lf }关键参数解析printWidth: 100每行代码的最大宽度。100 是一个比较折中的值既能保持较好的可读性又不会让代码行过早换行。tabWidth: 2useTabs: false使用2个空格作为一个缩进层级。这是前端社区的普遍共识能保证在不同编辑器、终端下显示一致。绝对不要使用 Tab 字符这是引发格式混乱的罪魁祸首之一。semi: true语句末尾使用分号。虽然 JavaScript 允许省略分号依靠 ASI 机制但显式地加上分号能避免一些极端情况下的解析错误让代码意图更清晰。singleQuote: true使用单引号而不是双引号。这同样是社区主流选择敲起来更快看起来也更简洁。trailingComma: es5在对象、数组等字面量的最后一项后面添加尾随逗号。这样做的好处是当你增删条目时git 的 diff 会更清晰只显示变更的行且不会因为漏掉逗号而产生语法错误。vueIndentScriptAndStyle: true为 Vue 文件的script和style块内容添加缩进。这能让 Vue 单文件组件的结构层次更分明。endOfLine: lf统一使用 LF (\n) 作为行结束符。这是 Unix/Linux/macOS 和 Git 的标准能避免在 Windows 系统默认 CRLF\r\n上协作时产生的行尾符差异。4.2 创建 ESLint 配置文件.eslintrc.js同样在根目录创建.eslintrc.js文件使用 CommonJS 语法。这里我们配置一个集成 Prettier 的基础规则集module.exports { root: true, // 标识当前目录为根目录ESLint 将不再向上查找配置 env: { browser: true, // 启用浏览器全局变量如 window, document es2021: true, // 启用 ES2021 语法支持 node: true // 启用 Node.js 全局变量 }, extends: [ eslint:recommended, // 使用 ESLint 官方推荐规则 plugin:prettier/recommended // 继承 prettier 配置并关闭冲突规则。**这是关键步骤** ], parserOptions: { ecmaVersion: latest, // 使用最新的 ECMAScript 语法 sourceType: module // 使用 ES 模块 }, rules: { // 这里可以覆盖或添加自定义规则 no-console: process.env.NODE_ENV production ? warn : off, // 生产环境禁止 console no-debugger: process.env.NODE_ENV production ? warn : off // 生产环境禁止 debugger } };核心要点extends数组中的plugin:prettier/recommended至关重要。它做了三件事1. 启用eslint-plugin-prettier将 Prettier 作为 ESLint 规则运行2. 继承eslint-config-prettier关闭冲突的格式规则3. 将 Prettier 错误显示为 ESLint 错误。这样代码风格问题就统一由 Prettier 管ESLint 只报告代码质量问题。对于 Vue 3 项目你的配置可能需要扩展 Vue 和 TypeScript 相关规则module.exports { ..., extends: [ eslint:recommended, plugin:vue/vue3-recommended, // 使用 Vue 3 推荐规则 vue/eslint-config-prettier, // Vue 项目专用的 Prettier 集成配置 // 如果使用 TypeScript vue/eslint-config-typescript ], ... };5. VSCode 工作区与用户设置精调插件和项目配置好了最后一步是告诉 VSCode 如何以及何时使用它们。这通过 VSCode 的settings.json文件完成。我强烈建议将格式化相关的配置放在项目根目录的.vscode/settings.json中这样配置可以随项目走保证团队每个成员的环境一致。在项目根目录创建.vscode文件夹并在其中创建settings.json文件{ // 1. 指定默认格式化工具 [html]: { editor.defaultFormatter: esbenp.prettier-vscode }, [css]: { editor.defaultFormatter: esbenp.prettier-vscode }, [javascript]: { editor.defaultFormatter: esbenp.prettier-vscode }, [typescript]: { editor.defaultFormatter: esbenp.prettier-vscode }, [vue]: { editor.defaultFormatter: Vue.volar // 对于 Vue 文件使用 Volar 作为默认格式化器它内部会调用 Prettier // 或者你也可以直接指定为 Prettier: esbenp.prettier-vscode }, [json]: { editor.defaultFormatter: esbenp.prettier-vscode }, // 2. 启用保存时自动格式化 editor.formatOnSave: true, // 3. 启用保存时自动修复 ESLint 可修复的问题 editor.codeActionsOnSave: { source.fixAll.eslint: explicit }, // 4. 关闭 VSCode 自带的基于类型的格式化避免与 Prettier 冲突 editor.formatOnType: false, // 5. 确保 Prettier 解析文件时使用项目本地版本而非全局版本 prettier.prettierPath: ./node_modules/prettier, // 6. 为特定语言调整格式化规则可选 prettier.documentSelectors: [**/*.vue], // 7. 文件编码与行尾符统一防乱码和 Git 差异 files.encoding: utf8, files.eol: \n }设置项深度解析editor.defaultFormatter这是最关键的一步。它为每种语言文件指定了首选的格式化工具。确保 HTML、CSS、JS/TS 都指向 Prettier (esbenp.prettier-vscode)。对于 Vue 文件使用 Volar 通常能获得更好的体验因为它深度理解 Vue 语法。editor.formatOnSave设置为true实现“保存即格式化”的自动化流程无需手动按快捷键。editor.codeActionsOnSave这个设置配合 ESLint 插件可以在保存时自动修复那些 ESLint 能自动修复的问题比如引号转换、简单的语法问题。“source.fixAll.eslint”: “explicit”是推荐的写法。prettier.prettierPath这个设置非常重要它强制 VSCode 的 Prettier 插件使用你项目node_modules里安装的 Prettier 版本及其配置文件。这确保了团队所有成员、CI/CD 环境都使用完全相同的规则避免了因全局安装的 Prettier 版本或配置不同导致的格式不一致。files.eol与.prettierrc中的endOfLine设置呼应从编辑器层面统一行尾符。6. 实战演练格式化效果前后对比理论说再多不如看效果。我们来看几个具体的例子感受一下格式化前后的巨大差异。案例一混乱的 HTML 片段格式化前div idapph1标题/h1p classdesc这是一段描述文字非常长超过了printWidth的设置所以它应该被自动换行处理。/pulli项目1/lili项目2/li/ul/div格式化后printWidth: 100htmlWhitespaceSensitivity: “css”div idapp h1标题/h1 p classdesc 这是一段描述文字非常长超过了printWidth的设置所以它应该被自动换行处理。 /p ul li项目1/li li项目2/li /ul /div可以看到标签被正确嵌套和缩进长文本根据宽度自动换行结构一目了然。案例二不一致的 JavaScript 对象格式化前const user {name:张三, age:25,hobbies:[篮球,音乐,阅读], address:{city:北京,street:中关村} }; function greet(user){console.log(你好${user.name});}格式化后singleQuote: true,trailingComma: “es5”,bracketSpacing: trueconst user { name: 张三, age: 25, hobbies: [篮球, 音乐, 阅读], address: { city: 北京, street: 中关村, }, }; function greet(user) { console.log(你好${user.name}); }单引号、尾随逗号、对象花括号内的空格、函数声明的空格全部被统一。代码的“呼吸感”立刻出来了。案例三Vue 单文件组件格式化前vueIndentScriptAndStyle: falsetemplatedivbutton clickhandleClick点击/button/div/template scriptexport default {methods:{handleClick(){this.$message.success(操作成功);}}};/script style scoped.btn { color: red; }/style格式化后vueIndentScriptAndStyle: truetemplate div button clickhandleClick点击/button /div /template script export default { methods: { handleClick() { this.$message.success(操作成功); }, }, }; /script style scoped .btn { color: red; } /style不仅各个语言块被正确格式化script和style块内部的内容也获得了正确的缩进与template的缩进层级保持一致整个组件结构非常清晰。7. 高级技巧与疑难杂症排查即使配置得当在实际开发中你仍可能会遇到一些棘手的情况。这里分享几个我踩过的坑和解决方案。7.1 格式化不生效逐层排查法检查文件关联首先确认当前打开的文件语言模式是否正确。VSCode 右下角可以看到语言标识如“Vue”、“JavaScript”。如果不对点击它手动选择或者检查.vscode/settings.json中是否有“files.associations”的误配置。检查默认格式化器在问题文件中按Ctrl Shift P打开命令面板输入 “Format Document With…”查看当前使用的格式化器是不是你期望的如 Prettier 或 Volar。如果不是在这里选择或者回头检查settings.json中的“editor.defaultFormatter”设置。检查插件是否启用确认 Prettier、ESLint、Volar 插件都已启用非禁用状态。检查项目本地依赖在终端运行./node_modules/.bin/prettier --version或npx prettier --version确认项目内已安装 Prettier。同时检查node_modules中eslint-config-prettier等包是否存在。查看输出面板VSCode 的“输出”面板CtrlShiftU选择“Prettier”或“ESLint”通道里面常有详细的错误日志比如配置文件语法错误、找不到模块等。7.2 与项目现有风格如 .editorconfig冲突许多项目根目录下会有.editorconfig文件它也可以定义缩进、字符集等基础格式。Prettier 的优先级高于 .editorconfig。但为了保持一致性建议让.editorconfig的规则与.prettierrc对齐或者确保 Prettier 已安装editorconfig支持prettier-plugin-editorconfig但通常 Prettier 自己的配置是权威的。7.3 忽略特定文件或代码块你肯定不想让 Prettier 格式化dist目录、node_modules或者一些自动生成的代码。这时需要创建.prettierignore文件语法类似.gitignore# 忽略目录 node_modules dist build coverage # 忽略特定文件类型 *.min.js *.min.css # 忽略特定文件 package-lock.json yarn.lock对于代码块可以使用prettier-ignore注释。例如在 HTML 中你想保留一段特定的排版!-- prettier-ignore -- div classspecial-layout iduniqueID 这里的内容将完全不被格式化 /div在 JavaScript/CSS 中也有对应的// prettier-ignore和/* prettier-ignore */。7.4 在团队中强制执行Git Hooks如何确保每个团队成员在提交代码前都进行了格式化最优雅的方式是使用Git Hooks特别是pre-commithook。工具lint-staged和husky是绝配。安装依赖npm install --save-dev lint-staged husky在package.json中配置{ scripts: { prepare: husky install }, lint-staged: { *.{js,ts,vue,html,css,scss,json,md}: [ prettier --write, eslint --fix ] } }初始化 husky 并创建 hooknpx husky install npx husky add .husky/pre-commit npx lint-staged执行npm run prepare确保 hooks 目录被创建。这样当团队成员执行git commit时lint-staged会自动对本次提交的暂存区staged文件运行 Prettier 格式化和 ESLint 修复确保进入仓库的代码都是整洁统一的。7.5 处理 CSS-in-JS 或特殊框架语法对于在 JavaScript 中书写 CSS 的情况如 styled-componentsPrettier 可能无法完美格式化。这时可以寻找社区插件例如prettier-plugin-styled-components安装后 Prettier 会自动识别并应用。对于 React 的 JSX/TSX 文件Prettier 原生支持良好只需确保[javascriptreact]和[typescriptreact]的defaultFormatter也指向了 Prettier。8. 个性化配置与性能优化建议一套配置不可能满足所有项目。你可以根据团队或个人喜好调整.prettierrc。更严格的代码风格如果你追求极致的简洁可以尝试“semi”: false不加分号和“arrowParens”: “avoid”箭头函数单个参数不加括号。但请务必团队统一并与 ESLint 配置同步。处理超长属性对于 Vue 模板或 JSX 中带有大量属性的标签Prettier 可能会将其折行成多行。如果你希望保持单行直到超过printWidth可以尝试调整“htmlWhitespaceSensitivity”: “ignore”但这可能会影响依赖空格敏感的 CSS 渲染。性能考虑对于大型项目保存时自动格式化ESLint修复可能会造成短暂的卡顿。如果感觉明显可以将“editor.formatOnSave”设为false改用快捷键手动格式化。调整“editor.codeActionsOnSave”的触发条件或只为特定严重问题开启自动修复。使用.prettierignore忽略掉那些不需要格式化的大文件或生成文件。确保 VSCode 的files.watcherExclude设置排除了node_modules和dist等目录减少不必要的文件监听开销。配置代码格式化不是一劳永逸的事它需要随着项目技术栈和团队习惯的演变而调整。核心在于建立一套统一、自动、可执行的规范。当你在任何项目中按下保存键看到代码自动变得整齐划一时那种顺畅感和专业感就是对这项投入最好的回报。从今天起让你的 VSCode 成为代码整洁度的强力守护者吧。
返回列表