ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vue项目代码格式化实战:Vetur、ESLint与Prettier高效协作指南

Vue项目代码格式化实战:Vetur、ESLint与Prettier高效协作指南 1. 从“能跑就行”到“优雅协作”为什么我们需要代码格式化插件刚接触Vue项目那会儿我的代码风格基本处于“狂野派”。缩进全靠空格键手感分号时有时无单双引号随机切换。自己写的代码过两周再看感觉像在看天书。更别提团队协作了每次合并代码Git的diff记录里充斥着大量无意义的格式改动真正逻辑的变更反而被淹没。这种混乱不仅影响阅读效率埋下潜在的语法错误更破坏了团队协作的默契。后来我意识到代码不仅是给机器执行的指令更是给人包括未来的自己阅读的文档。一套统一的、自动化的代码风格是项目可维护性的基石。在VsCode这个前端开发的主战场上围绕Vue的代码格式化逐渐形成了以Vetur、ESLint、Prettier为核心的三驾马车。它们各司其职又相互协作共同构建了一个从语法高亮、错误检查到自动格式化的完整开发体验链。简单来说你可以这样理解它们的分工VeturVue项目的“专属管家”。它让VsCode能理解.vue单文件组件的特殊结构template、script、style并提供语法高亮、智能提示、代码片段等基础语言支持。没有它VsCode处理.vue文件就像看乱码。ESLint代码的“纪律委员”。它专注于代码质量根据预设或自定义的规则检查你的代码是否存在潜在错误、不良实践或不符合团队约定的写法例如变量未使用、使用而非。它的核心是“检查”和“告警”。Prettier代码的“美容师”。它只关心一件事代码风格。它会强制将你的代码重新格式化为统一的风格包括缩进、换行、引号、分号等。它不在乎你的代码逻辑对不对只在乎它看起来是否整齐划一。它的核心是“格式化”。很多新手会困惑ESLint和Prettier的区别甚至觉得它们功能重叠。这里有个生动的比喻ESLint就像一位语文老师检查你的文章有没有错别字、病句或者用了不推荐的网络用语规则检查而Prettier就像一位排版员不管文章内容好坏只负责把字体、字号、行间距、段落缩进调整得整整齐齐风格统一。一个管“对错”一个管“好看”。本文将带你深入这套工具链不仅告诉你如何安装和配置更会剖析它们协同工作的原理分享在实际项目中如何平衡规则、解决冲突以及我踩过的一些坑。目标是让你在Vue项目中获得既高效又省心的代码开发体验。2. VeturVue单文件组件的基石支持没有Vetur的VsCode开发Vue项目就像用记事本写代码——只能纯文本编辑毫无智能体验。Vetur是VsCode官方推荐的Vue语言支持插件它的首要任务就是让编辑器“认识”.vue文件。2.1 核心功能不止于语法高亮安装Vetur后最直观的变化是.vue文件有了色彩分明的语法高亮。但这只是冰山一角。Vetur的核心能力在于将单文件组件中的三部分模板、脚本、样式进行“语言区域”划分并分别调用对应的语言服务。template块Vetur会将其视为HTML或Pug并提供HTML的智能提示、标签补全和语法检查。script块根据你使用的语言JavaScript/TypeScriptVetur会调用对应的语言服务提供变量提示、方法跳转、类型检查等。style块同样根据你使用的预处理器CSS、SCSS、Less、Stylus提供相应的语法支持和提示。更重要的是Vetur集成了Vue Language Server。这是一个独立的语言服务器协议LSP实现它提供了更高级的功能如组件属性类型推断、模板表达式检查、甚至能找到模板和脚本中未使用的变量。例如你在模板中使用了{{ user.nmae }}而脚本中的数据是user.nameVetur就能给出拼写错误的警告。2.2 基础配置与格式化功能Vetur自身也内置了基础的格式化功能。在VsCode的设置settings.json中你可以针对Vue文件的不同区域指定格式化工具{ vetur.format.defaultFormatter.html: prettier, // 使用Prettier格式化模板 vetur.format.defaultFormatter.js: prettier, // 使用Prettier格式化JS vetur.format.defaultFormatter.css: prettier, // 使用Prettier格式化CSS vetur.format.defaultFormatter.scss: prettier, vetur.format.defaultFormatter.less: prettier, vetur.format.defaultFormatter.postcss: prettier, vetur.format.defaultFormatter.stylus: stylus-supremacy, // Stylus有专用工具 vetur.format.defaultFormatter.ts: prettier }这里已经可以看到Vetur与Prettier的初步结合Vetur作为调度者将不同区域的格式化任务委托给更专业的Prettier去执行。注意在Vue 2项目中Vetur的模板格式化有时会与某些ESLint规则如vue/html-indent冲突。这是因为Vetur或它调用的Prettier的格式化逻辑与ESLint插件对模板的检查逻辑可能不一致。这是后续需要解决的一个关键冲突点。2.3 实用技巧与常见问题禁用Vetur的语法检查随着项目复杂度提升我们更倾向于使用专门的ESLint通过vue-eslint-parser来检查Vue文件。可以在设置中关闭Vetur的语法检查以避免重复或冲突的报错{ vetur.validation.template: false, vetur.validation.script: false, vetur.validation.style: false }将语法检查的职责完全交给ESLint。处理TypeScript项目在Vue 3 TypeScript项目中确保Vetur能正确识别TypeScript类型。有时需要显式配置vetur.experimental.templateInterpolationService为true来获得模板内表达式更好的类型支持。性能问题在大型项目中Vetur可能会有些卡顿。可以尝试关闭一些非核心功能如vetur.completion.autoImport自动导入补全或者确保你的jsconfig.json/tsconfig.json配置正确避免语言服务器分析不必要的文件。个人心得Vetur是Vue开发的“水电煤”必须安装但通常无需深度配置。我们的最佳实践是让Vetur只做它最擅长的“语言支持”工作高亮、提示、区域划分而将“检查”和“格式化”的职责明确剥离给ESLint和Prettier。这样职责清晰后续的配置冲突也更容易定位。3. ESLint守护代码质量的卫士如果说Vetur给了代码“生命”可识别那么ESLint就是赋予代码“健康”的医生。它通过一系列规则rules来约束代码写法目标是避免错误、统一风格、提升代码质量。3.1 在Vue项目中安装与集成ESLint现代Vue项目尤其是使用vue/cli或 Vite 创建的项目通常已经集成了ESLint。如果没有你需要手动安装核心包和Vue相关解析器、插件npm install eslint eslint-plugin-vue typescript-eslint/parser typescript-eslint/eslint-plugin --save-dev # 或 yarn add eslint eslint-plugin-vue typescript-eslint/parser typescript-eslint/eslint-plugin -D关键包说明eslint: ESLint核心库。eslint-plugin-vue: Vue.js的官方ESLint插件提供了Vue专属的规则如vue/component-name-in-template-casing要求组件名在模板中的书写格式。typescript-eslint/parser: 用于解析TypeScript代码的解析器让ESLint能理解TS语法。typescript-eslint/eslint-plugin: 提供TypeScript相关的ESLint规则。接下来需要在项目根目录创建ESLint配置文件通常是.eslintrc.js、.eslintrc.json或eslint.config.jsESLint 9 新格式。这里以.eslintrc.js为例module.exports { root: true, // 标识为根配置文件避免被上级目录的配置覆盖 env: { browser: true, es2021: true, node: true, }, extends: [ eslint:recommended, // ESLint内置推荐规则 plugin:vue/vue3-recommended, // 使用Vue 3的推荐规则集。如果是Vue 2则用 plugin:vue/recommended plugin:typescript-eslint/recommended, // TypeScript推荐规则 prettier, // 重要将prettier配置放在最后用于关闭与格式冲突的ESLint规则 ], parser: vue-eslint-parser, // 指定使用vue-eslint-parser来解析.vue文件 parserOptions: { parser: typescript-eslint/parser, // 告诉vue-eslint-parser使用typescript-eslint/parser来解析script块 ecmaVersion: latest, sourceType: module, }, plugins: [vue, typescript-eslint], rules: { // 在这里覆盖或添加自定义规则 vue/multi-word-component-names: off, // 关闭组件名必须多单词的规则个人或团队偏好 typescript-eslint/no-unused-vars: [warn], // 未使用变量改为警告 no-console: process.env.NODE_ENV production ? warn : off, // 生产环境禁止console }, };这个配置的关键在于extends数组的顺序和parser的配置。vue-eslint-parser专门用于解析.vue文件并将script块的内容交给指定的解析器这里是typescript-eslint/parser处理。3.2 规则Rules的配置哲学ESLint的强大与灵活都源于规则。规则有三种状态off或0: 关闭规则。warn或1: 违反规则时产生警告黄色下划线但不会导致 lint 失败。error或2: 违反规则时产生错误红色下划线会导致 lint 失败例如在CI/CD流程中阻止构建。配置规则时我的建议是从预设开始优先使用extends中官方或社区的推荐规则集如eslint:recommended,plugin:vue/recommended它们代表了最佳实践的集合。渐进式收紧项目初期可以将一些严格的规则设为warn让团队有个适应过程。待大家习惯后再逐步改为error。团队协商像“单引号还是双引号”、“结尾分号”这类纯风格问题建议交给Prettier统一管理并在ESLint中关闭相关规则这正是extends: [prettier]的作用。ESLint应更关注可能导致错误的逻辑问题如no-unused-vars未使用变量、eqeqeq要求使用和!等。3.3 与VsCode深度集成保存时自动修复仅仅在命令行运行npx eslint .检查是不够的。我们需要在编写代码时就能实时获得反馈。安装VsCode的ESLint插件后编辑器就能实时显示错误和警告。更高效的是配置保存时自动修复。在VsCode的settings.json中添加{ editor.codeActionsOnSave: { source.fixAll.eslint: explicit }, eslint.validate: [ javascript, javascriptreact, typescript, typescriptreact, vue, html ] }这样当你保存一个文件时ESLint插件会自动尝试修复所有它能修复的问题比如自动添加缺失的分号、修复引号等。对于无法自动修复的问题它会以错误或警告的形式展示出来让你手动处理。踩坑记录曾经遇到一个诡异的问题保存时ESLint自动修复不生效。排查后发现是因为项目的工作区根目录下有多个.eslintrc.*文件或者package.json中的eslintConfig与根目录的配置文件冲突导致ESLint插件无法确定使用哪个配置。确保项目只有一个明确的ESLint配置源是避免此类问题的关键。4. Prettier无情的代码风格格式化机器Prettier的哲学是“Opinionated”即“固执己见”。它提供极少的配置选项但强制推行一套统一的代码风格。这听起来很霸道但却极大地简化了团队协作中的风格争论。你不再需要讨论“缩进用2空格还是4空格”因为Prettier已经帮你决定了默认是2空格。4.1 安装与最小化配置安装Prettier及其与ESLint协同的插件npm install prettier eslint-config-prettier eslint-plugin-prettier --save-dev # 或 yarn add prettier eslint-config-prettier eslint-plugin-prettier -Dprettier: Prettier核心库。eslint-config-prettier: 这个包的作用是关闭所有与Prettier风格冲突的ESLint规则。确保ESLint只做代码质量检查不管格式。eslint-plugin-prettier: 这个插件将Prettier作为ESLint的一条规则来运行。这样当你违反Prettier的格式规则时会在ESLint中直接报错。创建Prettier配置文件.prettierrc.js或.json、.yaml等module.exports { semi: true, // 语句末尾打印分号 singleQuote: true, // 使用单引号 printWidth: 100, // 每行代码长度默认80可根据显示器调整 tabWidth: 2, // 每个缩进级别的空格数 useTabs: false, // 使用空格缩进 trailingComma: es5, // 在多行逗号分隔的句法结构中尽可能打印尾随逗号如对象、数组。es5表示在ES5中有效的结尾添加逗号对象、数组等 bracketSpacing: true, // 对象字面量的大括号间是否有空格 arrowParens: always, // 箭头函数参数始终添加括号 (x) x endOfLine: lf, // 换行符使用 lf (Linux/macOS风格)。可设为 auto 让Prettier根据系统自动检测 // Vue文件相关配置 vueIndentScriptAndStyle: false, // 是否对Vue文件中script和style标签内的代码应用缩进Vue 3 推荐false };这个配置文件定义了你的项目代码风格。团队每个成员共享此配置就能保证输出格式完全一致。4.2 与ESLint的协作模式两种主流方案让Prettier和ESLint和平共处是配置的核心。有两种主流方案方案一职责分离推荐这是更清晰、更少冲突的方案。ESLint只负责代码质量检查Prettier只负责格式化。安装eslint-config-prettier。在ESLint配置的extends数组最后加入prettier。这样它会覆盖之前所有与格式相关的ESLint规则。不安装eslint-plugin-prettier。分别配置VsCode的保存动作{ editor.formatOnSave: true, // 开启保存时格式化 editor.defaultFormatter: esbenp.prettier-vscode, // 默认格式化工具设为Prettier [vue]: { editor.defaultFormatter: esbenp.prettier-vscode // Vue文件也用Prettier }, editor.codeActionsOnSave: { source.fixAll.eslint: explicit // 保存时执行ESLint修复 } }这样保存文件时会先由Prettier进行格式化然后由ESLint进行质量检查并修复可自动修复的问题。两者并行不悖。方案二集成运行将Prettier作为ESLint的一条规则来运行。安装eslint-config-prettier和eslint-plugin-prettier。在ESLint配置中扩展和添加插件extends: [ // ... 其他扩展 plugin:prettier/recommended // 注意这个扩展等价于同时做了三件事1. 启用plugin:prettier2. 设置prettier规则为error3. 扩展eslint-config-prettier的配置。 ],VsCode设置只需配置ESLint保存修复即可因为Prettier问题也会通过ESLint报错和修复。{ editor.codeActionsOnSave: { source.fixAll.eslint: explicit } }个人偏好与选择我强烈推荐方案一职责分离。原因在于性能更好Prettier格式化速度极快独立运行不影响ESLint检查。职责清晰错误来源明确。格式问题看Prettier输出逻辑问题看ESLint输出。避免循环在某些边缘情况下集成方案可能导致ESLint和Prettier互相“打架”反复修改同一段代码。4.3 处理Vue单文件组件的格式化Prettier官方支持Vue文件。通过安装prettier和VsCode的Prettier插件它就能处理.vue文件。关键在于.prettierrc中的vueIndentScriptAndStyle选项。在Vue 2时代为了更好的格式化效果常将其设为true。但在Vue 3中官方推荐设为false因为Vue 3的模板编译器对缩进的处理更加智能保持false可以避免一些不必要的缩进问题。如果你在格式化Vue文件时遇到奇怪的缩进可以检查并调整这个选项。5. 实战解决工具链冲突与优化工作流理论配置完成后在实际项目中你几乎一定会遇到工具之间的冲突。最常见的场景是ESLint报告了一个错误你按照它的建议修改后保存Prettier又把它格式化成另一个样子触发了ESLint另一个错误如此循环。5.1 典型冲突案例与解决方案案例模板属性换行假设你有以下Vue模板MyComponent :prop-avalueA :prop-bvalueB clickhandleClick /ESLint (vue/max-attributes-per-line)可能规则要求每行最多一个属性它会要求你将click换到新的一行。PrettierPrettier的默认行为可能会将多个短属性放在同一行以节省空间。解决方案优先使用Prettier的格式既然决定用Prettier统一风格就应以其为准。找到导致冲突的ESLint规则通常是vue/max-attributes-per-line、vue/html-indent、vue/singleline-html-element-content-newline等来自eslint-plugin-vue的格式相关规则。用eslint-config-prettier关闭它们确保你的ESLint配置extends数组中包含了‘prettier’和‘plugin:prettier/recommended’取决于你的方案它会自动关闭这些规则。你可以通过命令npx eslint-config-prettier path/to/your/.eslintrc.js来检查是否还有冲突规则未被关闭。手动调整规则如果eslint-config-prettier没有覆盖某个特定规则特别是第三方插件规则你需要在.eslintrc.js的rules中手动将其关闭rules: { ‘vue/max-attributes-per-line’: ‘off’, ‘vue/html-indent’: ‘off’, // ... 其他冲突规则 }案例引号与分号这是最经典的冲突。ESLint可能配置了quotes: [‘error‘ ‘single’]和semi: [‘error‘ ‘never’]而Prettier配置了singleQuote: false和semi: true。解决方案毫无悬念删除ESLint中所有关于风格引号、分号、缩进、空格、逗号、行长度等的规则完全交给Prettier管理。这正是eslint-config-prettier存在的意义。5.2 配置VsCode实现无缝体验一个理想的工作流是你编码时编辑器实时提示ESLint错误红色波浪线。按下保存键CtrlS后编辑器自动完成三件事调用Prettier将文件格式化成统一风格。调用ESLint修复所有可自动修复的质量问题如自动添加分号、转换引号。对于ESLint无法自动修复的问题如未使用的变量保持错误提示让你手动处理。基于推荐的“职责分离”方案完整的VsCodesettings.json工作区配置示例如下{ // 针对特定语言设置默认格式化器 “[javascript]”: { “editor.defaultFormatter”: “esbenp.prettier-vscode” }, “[typescript]”: { “editor.defaultFormatter”: “esbenp.prettier-vscode” }, “[vue]”: { “editor.defaultFormatter”: “esbenp.prettier-vscode” }, “[json]”: { “editor.defaultFormatter”: “esbenp.prettier-vscode” }, “[html]”: { “editor.defaultFormatter”: “esbenp.prettier-vscode” }, “[css]”: { “editor.defaultFormatter”: “esbenp.prettier-vscode” }, “[scss]”: { “editor.defaultFormatter”: “esbenp.prettier-vscode” }, // 核心设置 “editor.formatOnSave”: true, // 保存时格式化 “editor.codeActionsOnSave”: { “source.fixAll.eslint”: “explicit” // 保存时执行ESLint修复 }, // 确保ESLint插件能处理Vue和TypeScript文件 “eslint.validate”: [ “javascript”, “javascriptreact”, “typescript”, “typescriptreact”, “vue”, “html” ], // 关闭Vetur的格式化功能避免与Prettier冲突 “vetur.format.enable”: false, // 可选在状态栏显示当前文件的格式化工具 “editor.formatOnSaveMode”: “file”, }5.3 添加Git提交前检查Husky lint-staged为了确保提交到仓库的代码都是符合规范的可以在Git提交前自动进行检查和修复。这是保证代码仓库清洁的最后一道防线。安装工具npm install husky lint-staged --save-dev # 或 yarn add husky lint-staged -D初始化Huskynpx husky init这会在项目根目录创建.husky文件夹并在package.json中添加脚本。配置package.json{ “scripts”: { “prepare”: “husky install” }, “lint-staged”: { “*.{js,ts,vue}”: [ “eslint --fix”, // 先尝试用ESLint修复 “prettier --write” // 再用Prettier格式化 ] } }创建Git钩子在.husky目录下编辑或创建pre-commit文件#!/usr/bin/env sh . “$(dirname — “$0”)/_/husky.sh” npx lint-staged现在当你执行git commit时lint-staged会对你本次提交的暂存区staged中的JS、TS、Vue文件依次运行ESLint修复和Prettier格式化。如果ESLint有无法自动修复的错误提交会被阻止直到你手动修复所有错误为止。踩坑记录曾经在配置lint-staged时错误地将命令顺序写为[“prettier —write“, “eslint —fix“]。这导致Prettier格式化后ESLint又按照自己的规则去“修复”产生了冲突。正确的顺序应该是先eslint —fix修复代码质量问题再prettier —write统一代码风格因为Prettier的格式化是最终且不可协商的。
返回列表