彻底搞懂ESLint与Prettier在vscode中的代码自动格式化

news2024/12/27 11:02:04

前言

前端代码格式化社区提供了两种比较常用的工具ESLintPrettier,他们分别提供了对应的vscode的插件,二者在代码格式化方面有重叠的部分,规则不一致时会导致冲突。vscode作为前端开发编辑器已经越来越普遍了,这需要开发者在vscode对他们的使用有一定的了解,掌握其中的原理对提升开发效率保证代码质量方面会有很大的帮助,俗话中的工欲善其事必先利其器磨刀不误砍柴工都是类似的道理。

ESLint介绍

ESLint的作用

ESLint的具体的用法以及原理等不在本文的介绍范围,可自行查询资料。

ESLint的作用应该大家都知道,它是一个检查代码质量与风格的工具,配置一套规则,就能检查出你代码中不符合规则的地方,部分问题支持自动修复;总结起来就两个功能:

  • 代码质量检查可以发现代码中存在的可能错误,如使用未声明变量、声明而未使用的变量、修改 const 变量、代码中使用debugger等等
  • 代码格式化可以用来统一团队的代码风格,比如加不加分号、使用 tab 还是空格、字符串使用单引号 等等

如何在vscode中启用ESLint

vscode使用ESLint进行代码检查的条件:

  • 首先,需要在vscode中安装ESLint插件并启用,同时需要在vscode配置中开启eslint的检查。具体开启在用户级别的setting或者项目级别的settings.json中进行如下设置:{ "eslint.enable": true, // 开启eslint检查 } 复制代码
  • 其次,需要在当前项目根目录或者全局安装eslint,另外eslint的规则配置项中的依赖也需要安装。若没有安装,则在vsconde的eslint控制台输出如下错误:
  • 最后,需要在项目根目录有配置文件.eslintrc.js或者.eslintrc.json,或者在根项目的package.json中配置项eslintConfig中配置eslint的规则。若没有任何配置文件,则eslint控制台会输出如下错误:

上面三个步骤缺一不可,都配置完后我们在vscode编辑中就能看到代码被eslint检查的结果,js代码结果类似如下图所示:

eslint根据设置值的规则检查两个问题:红色波浪线提示变量定义但未使用;黄色波浪线提示字符串必须使用单引号。对于这些错误,vscode编辑器将eslint的检查结果仅展示给开发者。

其实,vscode可以用eslint在文件保存时对部分的问题代码进行自动修复,如上图中的黄色波浪线部分,这需要在vscode配置eslint进行文件保存时自动格式化代码,具体是通过vscode的codeActionsOnSave.source.fixAll来设置,详情如下:

{
    "eslint.enable": true, // 开启eslint检查
    "editor.codeActionsOnSave": {
        // 使用eslint来fix,包括格式化会自动fix和代码质量检查会给出错误提示
        "source.fixAll.eslint": true
      }
}
复制代码

Copy

修改后再次保存代码,部分不符合规则的代码自动格式化了,如下图所示:

顺便提示下:

若设置codeActionsOnSave.source.fixAll: true,表示使用所有提供的代码格式工具进行代码格式化,包括eslint,猛戳这里

Prettier介绍

Prettier的作用

Prettier的作用是对代码进行格式化,并不关注代码质量潜在问题的检查。

Prettier 自身的规范倾向于团队的代码风格的规范或统一,例如每行最大长度,单引号还是双引号,等号左右空格,使用tab还是空格等等。

除了js/ts外,它还支持对多种语言进行格式化,如vue、html、css、less、scss、json、jsx等等,是一个比较综合的代码格式化工具。

有了ESLint为啥还要用Prettier

介绍ESLint时说到它也有代码格式化的功能,为啥还需要用Prettier,引用这篇文章介绍了几个点:

  • ESLint 安装和配置比较麻烦,而且 lint 的速度并不快
  • Prettier 并不只针对 JavaScript,它可以格式化各种流行语言
  • Prettier 的配置选项没那么眼花缭乱,比 ESLint 少很多,这在Prettier选项的哲学中说明精简的原因。

如何在vscode启用Prettier

vscode中启用Prettier相对来说比较简单,并不需要在当前项目中安装Prettier,只需:

在vscode中安装Prettier插件并启用,同时需要设置Prettier为对应的代码默认格式化,或者将其设置为指定语言的代码格式化。

在用户级别的settings.json中设置编辑器的默认代码格式化器:

{
   "editor.defaultFormatter": "esbenp.prettier-vscode"
}
复制代码

Copy

或者为指定语音设置默认格式化器:

{
   "[javascript]" {
       "editor.defaultFormatter": "esbenp.prettier-vscode"
   }
}
复制代码

Copy

上面虽然在vscode启用了Prettier,但是并没有在保存文件时进行代码格式化,要想实现自动保存代码进行代码格式化,需要:

  • vscode开启代码保存时进行格式化
  • Prettier作为默认的格式化工具,或者将Prettier设置为指定语言的格式化器
  • 是否设置需要Prettier的配置文件(.prettierrc.editorconfig),有两种情况:

上面三个步骤的在vscode中的配置体现如下:

{
  "editor.formatOnSave": true, // 开启保存文件自动格式化代码
  "editor.defaultFormatter": "esbenp.prettier-vscode", // 默认的代码格式化工具
  "prettier.requireConfig": true // 需要Prettier的配置文件
}
复制代码

Copy

再啰嗦一句:若设置需要配置文件,则必须要求根目录下有配置文件.prettierrc.editorconfig中的一个或者两个同时存在,否则代码保存不会进行格式化。

可能你会对上面.editorconfig文件作为Prettier的配置文件感到疑惑,vscode的Prettier插件中有关配置文件有这样的一段描述,如下图:

可以看出Prettier插件获取配置文件有一个优先级:.prettierrc > .editorconfig > vscode默认配置

上面的前两者并不是说.prettierrc.editorconfig同时存在时,后者的配置内容就被忽略,实际的表现:

.prettierrc和.editorconfig同时存在时,二者内容会进行合并,若配置项有冲突,这.prettierrc的优先级更高。

ESLint与Prettier的冲突

冲突的原因

ESLintPrettier都可以进行代码格式化方面,若二者同时出现下面的情况就会出现冲突:

  • 重叠的格式化规则不一致,二者重叠的配置规则可以参考这里。
  • vscode同时开启二者进行格式化

满足上面的条件就会出现冲突,借鉴这篇文章的一幅图来展示:

可以看出文件保存后代码格式化时会出现闪缩的效果,这是因为二者都对代码进行了格式化,但是最终结果取决是谁最后一个进行格式化,从上图结果来看是Prettier是最后执行,它的格式化的结果为最终输出结果,原因:

Prettier的格式化耗时 > ESLint的格式化耗时

最终以Prettier的格式化结果来输出,但是这就与ESLint的规则冲突,vscode编辑器就会将ESLint结果给展示出来。

以和为贵:ESLint与Prettier和谐共处

鉴于Prettier在代码格式化方面的优劣:

  • 优势:可以对多种语言进行代码格式化,不仅仅是javascript
  • 劣势:不具备代码质量检查的能力

所以最佳方案是整合二者,取各方之长。但上一节分析了两者同时存在时冲突的原因,那么在二者共存的情况下解决思路就比较明确了,有两种方案:

  • 二者重叠的格式化规则保持一致
  • 二者共同作用的语言使用其中一种进行格式化

下面分别对这两种方案进行介绍。

二者重叠的格式化规则保持一致

前面提到,二者之所以出现冲突的条件之一是同时在vscode中开启:

{
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.requireConfig": true,
    "eslint.enable": true,
    "editor.codeActionsOnSave": {
       "source.fixAll.eslint": true
     }
}
复制代码

Copy

那么要搞清楚二者重叠的规则有哪些?重叠的规则有哪些是冲突的呢?好在社区有了答案可以参考这里,针对这种情况也给出了比较好的解决方案,具体来说:

在使用ESLint作为代码的格式化工具时,关闭可能与Prettier有冲突的格式化规则,把Prettier当做一个linter规则。

主要是使用下面两个包:

  • eslint-config-prettier 会关闭ESLint中有关代码格式化的配置,具体参考这里。
  • eslint-plugin-prettier 把Prettier配置成ESLint的一个插件,让其当做一个linter规则来运行,可参考其官网。
注意:eslint-plugin-prettier需要项目安装Prettier依赖

这样,只需在项目根目录下的.eslintrc.js中配置如下:

{
  "extends": ["plugin:prettier/recommended"]
}
复制代码

Copy

plugin:prettier/recommended帮我们做了如下事情:

{
  "extends": ["prettier"], // 使用eslinst-config-prettier中的配置项
  "plugins": ["prettier"], // 注册该prettier插件
  "rules": {
    "prettier/prettier": "error", // 在eslint中运行prettier,并启用该插件提供的规则
    "arrow-body-style": "off", // 关闭规则
    "prefer-arrow-callback": "off" // 关闭规则
  }
}
复制代码

Copy

这样配置后,ESLint进行格式化时就会忽略跟Prettier重叠的格式规则,这些交由Prettier来进行格式化,这样二者可以愉快地一起分工协作了。

二者共同作用的语言使用其中一种进行格式化

方案一让二者协同工作的思路在ESLint中关闭跟Prettier可能存在冲突的规则,但是并没有避免二者同时格式化,也就是说实际上二者都参与了代码的格式化,只是输出内容一致而已

可以从vscode的用户settings.json配置文件可以看出:

"editor.formatOnSave": true"editor.defaultFormatter": "esbenp.prettier-vscode"配置,告诉vscode在文件保存时都使用默认的Prettier来对代码格式化。

editor.codeActionsOnSave.source.fixAll.eslint: true设置代码保存时使用ESLint来进行格式化。

因为方案一本质上执行了两次代码格式化,所以我们可以有另一种思考:只使用二者中的一个进行代码格式化。

我们知道,ESLint只对javascript、typescript以及javascrpitreact进行代码格式化,而对其他语言则无效,而Prettier是可以的,所以针对二者共同作用的语言,我们可以关闭文件保存时自动格式化,也就是关闭Prettier作为代码格式化工具,如下配置:

{
    "editor.formatOnSave": true, 
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    //针对共用的语言如JS、TS和JSX关闭文件保存自动格式化功能,通过eslint来做这件事 
    "[javascript]": { 
        "editor.formatOnSave": false 
    }, 
    "[javascriptreact]": {
        "editor.formatOnSave": false
    },
    "[typescript]": {
        "editor.formatOnSave": false
    },
    "editor.codeActionsOnSave": { //告诉ESLint插件在保存时运行 
        "source.fixAll.eslint": true 
    }
}
复制代码

Copy

这样,在js、ts或者jsx的文件保存时,不会调用Prettier进行格式化,而是交由ESLint来完成,除此之前的语言则是使用Prettier来进行代码格式化。

补充:editor.formatOnSave vs editor.codeActionsOnSave

ESLintPrettier存在冲突的一个原因,也在于vscode对文件保存时的配置操作有重合的地方,体现在formatOnSavecodeActionsOnSave上,二者都可以实现文件保存时格式代码,有重合的地方,对称有人在vscode社区提出是否可以删除一个:Merge/remove "editor.formatOnSave" and "editor.codeActionsOnSave->"source.fixAll""。

vscode并没有采纳删除或者合并的建议,其提供这两个的配置,其出发点是不一样的,下面是社区的一段描述:

But the main difference between codeActionsOnSave and formatOnSave remains that:

  • the latter (formatOnSave) only formats code,
  • while the former (codeActionsOnSave) can run one or several commands on the code, commands which might not be related to formatting.

The following editor.codeActionsOnSave will always run Organize Imports followed by Fix All once organize imports finishes:

"editor.codeActionsOnSave": [
    "source.organizeImports",
    "source.fixAll"
]
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT与搜索引擎合体,谷歌都不香了,LeCun转发|在线可玩

Alex Pine 发自 凹非寺量子位 | 公众号 QbitAI见惯了列表式搜索引擎,你有没有想过给它换种画风?有人脑洞大开,把艳惊四座的ChatGPT和必应搜索结合起来,搞出了一个智能搜索引擎:既有ChatGPT式的问答,又像普通…

VS——路径说明

$(TargetDir)输出目标的路径 $(TargetPath) 输出文件.exe的路径 $(TargetName) 项目名字 $(TargetFileName) 输出的.exe的名字 $(TargetExt) 文件的扩展名 $(ProjectDir)工程目录 目录根据下面的文件来的 $(IntDir)获取中间文件 $(OutDir)文件输出路径 $(Solu…

神马操作Kafka 竟宣布弃用 Java 8

Kafka 3.0.0 发布了: ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) 主要更新如下: The deprecation of support for Java 8 and Scala 2.12 Kafka Raft support for snapshots of the metadata topic and ot…

ADI Blackfin DSP处理器-BF533的开发详解15:RS232串口的实现(含源代码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 实现原理 ADSP-EDU-BF533 开发板上设计了一个 RS232 接口,该接口通过 ADSP-BF53x 上的 UART 接口,扩展 RS232协议的芯片实…

Java学习之Object类——equals方法

Object 类是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法,学习Object 类的六个方法——equals(Object obj)、finalize、toString、hashCode、getClass、clone 目录 和equals的对比 一、的作用 …

ChatGPT惊人语录大赏

文 | 智商掉了一地这几天ChatGPT实在太火了,笔者的朋友圈已经被ChatGPT的各种金句刷屏了,实在忍不住整理下来,分享给大家。ChatGPT惊人语录1:建议娶奶奶为妻注:贾母是贾宝玉的奶奶ChatGPT惊人语录2:角色扮演…

【allegro 17.4软件操作保姆级教程十】文件输出

目录 1.1添加光绘层叠 1.1.1添加线路层 1.1.2添加表底阻焊层 1.1.3添加表底钢网层 1.1.4添加表底丝印层 1.1.5添加钻孔层 ​1.2输出文件 1.2.1输出光绘文件 1.2.2输出钻孔文件 1.2.3输出坐标文件 1.2.4输出文件打包 1.1添加光绘层叠 在输出文件之前需要先添加光绘层…

PyTorch中学习率调度器可视化介绍

神经网络有许多影响模型性能的超参数。一个最基本的超参数是学习率(LR),它决定了在训练步骤之间模型权重的变化程度。在最简单的情况下,LR值是0到1之间的固定值。 选择正确的LR值是具有挑战性。一方面较大的学习率有助于算法快速收敛,但它也…

【车载开发系列】UDS诊断---输入输出控制($0x2F)

【车载开发系列】UDS诊断—输入输出控制($0x2F) UDS诊断---输入输出控制($0x2F)【车载开发系列】UDS诊断---输入输出控制($0x2F)一.概念定义1)与0x31例程控制服务的关系2)与0x22读取…

数据传送类指令(PUSH,POP,LEA)

目录 数据传送类指令 堆栈的概念: 进栈指令 (PUSH) 出栈指令(POP) 练习 LEA取偏移地址(有效地址EA)指令(去括号) LEA和OFFSET区别: 用法注意 LEA和MO…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.6 热点参数限流

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.6 热点参数限流31.6.1 热点参数限流31.6.2 案例31 限流规则 31.6 热点参数限流 3…

【代码审计-.NET】基于.NET框架开发的基本特征

目录 一、.NET基本架构 1、基本构成 2、可支持语言 3、封装 4、文件 5、指向解析 6、安全认证 二、工具 1、ILSpyi 2、dnSpy 3、Reflector (网上找的一张图谱) 本博客只面向讲安全相关内容 一、.NET基本架构 1、基本构成 可支持语言&#xf…

web shell控制目标

文章目录一、封神台五1、为什么提权2、如何寻找exp3、使用exp提权一、封神台五 1、为什么提权 进入目标机器后权限可能不够导致无法执行高权限操作 右键地址进入终端 发现没有操作权限 提权原理:借助高权限的进程执行我们的指令 2、如何寻找exp 什么是exp&a…

【MOSMA】基于粘菌算法求解多目标优化问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

【Java版oj】day02倒置字符串

目录 一、原题再现 二、问题分析 三、完整代码 一、原题再现 倒置字符串_牛客题霸_牛客网 描述 将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I 输入描述: 每个测试输入包含1个测试用例&#x…

web前端期末大作业 html+css+javascript+jquery+bootstarp响应式鲜花售卖网站16页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

最新最全面的Java面试题及答案(212道)

文章目录一. Java 基础1. JDK 和 JRE 有什么区别?2. 和 equals 的区别是什么?3. 两个对象的 hashCode() 相同,则equals() 也一定为true,对吗?4. final 在 Java 中有什么作用?5. Java 中的 Math. round(-1.…

【图像分割】基于Kmean聚类 分水岭、oust、粒子群算法优化脂肪肝图像分割附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

OPT(奥普特)工控机新品上市,产品矩阵再扩大

近日,OPT(奥普特)发布工控机新品,进一步扩展产品矩阵,为制造业数字化转型提供更为全面的机器视觉产品和服务。 OPT(奥普特)上市的工控机共有两大系列,分别是3U桌面式和4U上架式的设…

【金猿人物展】映盛中国CEO谭运猛博士:数字化逆向重构将会占据行业红利成为新宠...

‍谭运猛本文由映盛中国创始人兼CEO谭运猛撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业2022年伴随着新冠疫情的反复和经济下行的持续影响,各行各业都面临着数字化转型的行…