当前位置:首页 > 科技  > 软件

Eslint团队终于妥协了...

来源: 责编: 时间:2023-10-31 10:26:19 465观看
导读大家好,我卡颂。配置过代码格式化的同学一定纠结过如下问题:Eslint和Prettier都能格式化代码风格,是单用Eslint,还是两个一起用呢?从今以后,你再也不用纠结这个问题,因为Eslint团队已经妥协了 —— 根据官方博客[1]所说,从v8.

4Jj28资讯网——每日最新资讯28at.com

大家好,我卡颂。4Jj28资讯网——每日最新资讯28at.com

配置过代码格式化的同学一定纠结过如下问题:Eslint和Prettier都能格式化代码风格,是单用Eslint,还是两个一起用呢?4Jj28资讯网——每日最新资讯28at.com

从今以后,你再也不用纠结这个问题,因为Eslint团队已经妥协了 —— 根据官方博客[1]所说,从v8.53.0起,Eslint中「代码风格相关规则」将被弃用。4Jj28资讯网——每日最新资讯28at.com

有意思的是,造成上述局面的原因并不是技术问题导致的,更多是市场行为。4Jj28资讯网——每日最新资讯28at.com

本文让我们聊聊事情的来龙去脉。4Jj28资讯网——每日最新资讯28at.com

Eslint的崛起

在2013年之前,前端工程师通常使用JSLint或JSHint作为「代码检查器」,用以检测:4Jj28资讯网——每日最新资讯28at.com

代码质量问题

比如:应该避免使用 eval(),应该使用===而不是==...4Jj28资讯网——每日最新资讯28at.com

代码中的错误

比如:未定义的变量、类型转换的问题...4Jj28资讯网——每日最新资讯28at.com

其中,JSLint基于内部实现的JS解析器,对生成的token流(词法单元流)进行分析,检查代码语法。4Jj28资讯网——每日最新资讯28at.com

JSHint是从JSLint派生出来的,他们工作原理类似,但JSHint更灵活 —— 他提供了.jshintrc配置文件方便开发者自定义规则。4Jj28资讯网——每日最新资讯28at.com

上述两个工具都能检查代码,但由于实现原理的限制,没法进行复杂的规则检查。同时,他们对「代码风格」的检查也较少。4Jj28资讯网——每日最新资讯28at.com

在这一时期,「代码风格检查」(比如:缩进、行长度、引号类型、是否在语句末尾使用分号...)主要交给JSCS。4Jj28资讯网——每日最新资讯28at.com

2013年,Eslint问世。他将代码解析为AST并分析:4Jj28资讯网——每日最新资讯28at.com

  • 相比于JSHint或JSLint的实现,AST保留了更多代码上下文信息。

所以,Eslint不仅可以进行更复杂的规则校验,还能让开发者以插件的形式自己编写规则。4Jj28资讯网——每日最新资讯28at.com

  • 相比于JSCS,Eslint支持「代码自动修复」

所以,Eslint不仅能对代码风格提出建议,还能自动修复「不符合规范的风格」。4Jj28资讯网——每日最新资讯28at.com

更先进的功能,再加上作者身份加持(作者是红宝书作者),使得Eslint逐渐淘汰了上述竞品。4Jj28资讯网——每日最新资讯28at.com

Eslint与Prettier之争

虽然Eslint提供了大量规则,但并不是所有开发者都想配置一套自己的规则集。4Jj28资讯网——每日最新资讯28at.com

慢慢的,一些「Eslint规则集的最佳实践」被提出(比如Airbnb规则[2]、standard规则[3])。4Jj28资讯网——每日最新资讯28at.com

开发者通常会在这些规则集的基础上再做些个性化修改,组成项目的lint规则集。4Jj28资讯网——每日最新资讯28at.com

这些规则集中,通常包含三类规则:4Jj28资讯网——每日最新资讯28at.com

  • 代码质量检查
  • 代码错误检查
  • 代码风格检查

其中「代码风格检查」通常是非常主观的。如果团队成员的「代码风格检查规则」配置不一样,很影响提交时git diff的可读性。4Jj28资讯网——每日最新资讯28at.com

为了强制规范「代码风格检查」,Prettier出现了。这是一款「固执己见」的代码风格格式化工具,他集成了一套代码风格,并且可配置程度不高。4Jj28资讯网——每日最新资讯28at.com

「可配置程度不高」是一把双刃剑,一方面,他能强制规范团队成员的代码风格。4Jj28资讯网——每日最新资讯28at.com

但另一方面,如果想对代码风格做些个性化设置,Prettier很有可能不支持。4Jj28资讯网——每日最新资讯28at.com

举个例子(来自为什么我不使用 Prettier中的例子),Prettier中通过printWidth属性配置「一行可以显示的字符数」,超过就会折行。4Jj28资讯网——每日最新资讯28at.com

有时候我们并不需要「超过某个字符数就折行」,因为在Git Diff时,折行会破坏Diff信息的可读性:4Jj28资讯网——每日最新资讯28at.com

4Jj28资讯网——每日最新资讯28at.com

然而遗憾的是,Prettier并没有提供配置关闭这一行为。4Jj28资讯网——每日最新资讯28at.com

基于上述原因,出现了两种解决方案:4Jj28资讯网——每日最新资讯28at.com

方案1  Eslint与Prettier配合使用

其中Eslint负责代码质量、错误检查,Prettier负责代码风格检查。优点是能够满足代码质量、风格检查。缺点是:4Jj28资讯网——每日最新资讯28at.com

  • Eslint与Prettier规则可能冲突,配置成本高。
  • 代码风格检查的可配置性低(Prettier配置性低)。

案2 只使用Eslint

使用「代码风格相关规则的集合」,比如@stylistic/eslint-plugin-js[4]管理代码风格。再使用其他规则管理代码质量。4Jj28资讯网——每日最新资讯28at.com

这种方式优点明显 —— 可配置性高,且配置简单(只需要配置Eslint)。4Jj28资讯网——每日最新资讯28at.com

显然,方案2是优于方案1的。既然如此,Eslint团队为什么要弃用所有「代码风格相关规则」呢?4Jj28资讯网——每日最新资讯28at.com

Eslint团队的妥协

设想一下,每当出现新的语言特性,与该特性相关的规则包括:4Jj28资讯网——每日最新资讯28at.com

  • 少量的代码质量相关规则
  • 少量的代码错误相关规则
  • 各种奇怪的代码风格规则

显然前两者的优先级、重要性都高于第三者。如果说,在Eslint成长初期,为了收割JSCS的用户,Eslint必须实现所有「JSCS支持的代码风格规则」,此时实现各种代码风格规则是必要的。4Jj28资讯网——每日最新资讯28at.com

但今时今日,Eslint早已成为JS领域「代码检查器」的老大,不需要再为了市场份额努力满足社区的一切需要。况且,有些时候,考虑「规则冲突」以及「一致性」,有些需求甚至无法满足。4Jj28资讯网——每日最新资讯28at.com

规则冲突

最理想的情况,所有核心规则都能很好地相互配合,这意味着没有两个规则应该标记同一个问题,也不会有任何两个核心规则给出相互冲突的建议。4Jj28资讯网——每日最新资讯28at.com

当核心规则少于30条时,这很容易。但对于越来越多的规则,这很难做到。4Jj28资讯网——每日最新资讯28at.com

一致性问题

ESLint规则之间是无法互相访问的。这意味着我们会遇到无法正确修复错误的问题,因为信息可能位于另一个规则中。4Jj28资讯网——每日最新资讯28at.com

举个例子,如果自动修复需要添加新的代码行,就需要知道文件是如何缩进的,以便应用正确的修复。但是,规则indent控制ESLint的缩进,这意味着其他规则需要在不缩进的情况下应用修复,然后相信indent规则将在后续传递中修复缩进。4Jj28资讯网——每日最新资讯28at.com

总结

ESLint从v8.53.0起,将弃用「代码风格相关规则」。这么做主要是因为继续维护「代码风格相关规则」对核心团队来说,投入产出比太低。4Jj28资讯网——每日最新资讯28at.com

试想一下,核心团队花费大力气解决问题(规则冲突、一致性问题),推出新的「代码风格规则」,开发者会感谢Eslint核心团队的付出么?4Jj28资讯网——每日最新资讯28at.com

不会的,这些「代码风格规则」会被集成到规则集中,并被冠以「某种开发理念」兜售给开发者(比如Airbnb规范)。4Jj28资讯网——每日最新资讯28at.com

实际收获名利的是站在台前的「宣传开发理念的团队」,而背后辛苦干活的Eslint核心团队往往被忽略了,换你你乐意么?4Jj28资讯网——每日最新资讯28at.com

参考资料

[1]官方博客:https://eslint.org/blog/2023/10/deprecating-formatting-rules/。4Jj28资讯网——每日最新资讯28at.com

[2]Airbnb规则:https://airbnb.io/javascript/。4Jj28资讯网——每日最新资讯28at.com

[3]standard规则:https://standardjs.com/。4Jj28资讯网——每日最新资讯28at.com

[4]@stylistic/eslint-plugin-js:https://www.npmjs.com/package/@stylistic/eslint-plugin-js。4Jj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16023-0.htmlEslint团队终于妥协了...

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python控制流程:条件、循环和异常处理

下一篇: 通过实例理解Web应用用户密码存储方案

标签:
  • 热门焦点
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top