从仓库的角度看待 Eslint 跟 Prettier

去年,anfu 谈论了他对 Prettier 跟 Eslint 的看法-为什么我不使用 Prettier,同样在那个时候,VUECONF 2022 也分享了关于对前端项目 linter 跟 formatter 的实践- Vue 项目配置:最佳实践与个人偏见,彼时,这些经验与分享让我重新审视这些代码规范化工具。一年后的今天,笔者写下这篇文章,期望以这段时间的总结与收获帮助各位读者理解跟使用这些工具。

大部分前端入门者一般会困惑于 npm 包 Eslint、Prettier 跟 vscode 拓展 Eslint 、Prettier这个四个工具,之后陷入工具包的配置难题,这个时候,已经脱离了使用工具的初衷,因为我们为了使用这些工具,需要去阅读文档、配置工具、解决 Eslint 跟 Prettier 之间的冲突问题,之后为了加快 Eslint 的修复速度,还去引入 lintstage,这些工具真的让我们的开发变简单了么?实则没有。笔者认为,在 formatter 跟 linter 代码的过程中,大部分开发者对整体流程没有一个清晰的认知,从而导致了工具的不正确使用与滥用。

工具定位

简单来说,Prettier 是代码格式化工具,Eslint 的代码风格跟质量检测工具。这些工具都提供了命令行对项目代码进行操作,执行 Prettier 的命令可以格式化整个项目的代码,执行 Eslint 可以检测出项目中出现的问题,同时 Eslint 也具备一定的修复功能。

那为什么还会出现 Prettier 跟 Eslint 的 IDE 拓展呢?Prettier 包的执行需要命令行去格式化,IDE 拓展 Prettier 把这种格式化的功能添加到了 Vscode 上,开发者通过 Vscode 就可格式化指定的片段代码或者文件。同样上图中红色波浪线那种表明代码质量问题的 UI 效果需要 IDE 拓展 Eslint 赋予给 Vscode。

目前业界实践出现的问题

琐碎配置

各种配置文件会提高项目的门槛,如果需要管理这些文件,首先需要把 User 跟 WorkSpace 分开,然后配置 Prettier 拓展,Eslint 拓展,之后为了项目整体格式化跟项目质量检测还需要配置脚本执行,同时.vsocde 下的 setting.json 任何更改都会影响其他同学的开发体验。

工具混用导致的一系列问题

Prettier + Eslint 同时作为格式化工具会出现冲突,这点 anfu 在博客做过相关描述,具体来说就是 本地格式化通过 Prettier 格式化后,在 lint 自动修复是 Eslint 修复的地方跟 Prettier 的规范有冲突。 为了解决冲突,部分实践通过顺序 format 进行格式化。

json 复制代码
"lint-staged": {
    "*.{js,ts,jsx,tsx}": [
      "prettier --write",
      "eslint --fix"
    ],
    "*.vue": [
      "stylelint --fix",
      "prettier --write",
      "eslint --fix"
    ],
    "*.{less,css}": [
      "stylelint --fix",
      "prettier --write"
    ]
  },

同时两个工具同时运行检查和格式化,对性能是双重打击。这会导致保存和提交代码变得明显缓慢,降低开发效率,为此还需引入 lint-staged 提高效率。

个人最佳实践

0 拓展配置 + prettier(formatter) + eslint(linter)

以团队角度来讲,拓展+ setting.json 本身一方面造成部分内存的使用,一方面增加了同时之间的维护与理解成本,该文章的目的是不安装拓展的情况下,进行项目协同开发,仓库角度来讲,线上部署的代码跟 .vscode 上配置的 setting.json 半毛钱关系都没有。

为什么我建议使用 Prettier ,Eslint 一方面会因为检测出的 error 中断 git hook 的向下执行,一方面 Eslint 无法对 max-len 进行 format,github.com/eslint/esli...

以开发者的角度,只期望工具对代码风格进行 rewrite,也就是只修改格式,不要修改代码内容,足够简单即可。linter 在开发中不应频繁使用,使用 Eslint format 代码本身就存在 linter 的滥用, linter 的 lint 过程本质上是检查代码中的异味,linter 规则的制定需要团队成员共同接受,在此之上解决冲突规则的覆盖,成本并不是很高,相反如果将 lint 下沉到每次 commit,反而会增加团队中每个开发人员开发人员的负担。

hook 的时机

  • formatter的时机

什么时候期望代码格式化呢,formatOnSave 应该是大部分开发者第一个想到的,但是如果就有些同学没在这个 hook 格式化怎么办呢,部分开发者会想到 pre-commit,事实上还可以再晚一点,只要保证远程仓库的代码是格式化后的代码就行,按照 CI 的角度来说,formatter 的最佳时机就是者每次 push 前,对项目进行整体的格式化,目的就是保证 repo 上的代码是按照团队的 格式化规则组织的,而没必要每次 commit 都去格式化代码。

  • linter 的时机以及如何处理异味

这个就见仁见智了,笔者看来,linter 的最佳时机为项目发版或者每次迭代前,或者不放心的话再提前一点,保证 test 分支 prod 生产环境上的代码必须是经过质量检测且修复的就行。

笔者的最佳实践可以总结为

仓库维度的原子化的 formatter + 定期的 linter

仓库角度来说,并不关心每个 IDE 上怎么配置,如何制定规范,仓管只要求每个成员 pull 跟 push 上的代码是格式化的,可读的。至于 linter,看公司跟团队规范就可以,保证交付部署产物一定是通过 linter 扫描且通过的就可以。

相关推荐
祈澈菇凉7 分钟前
什么是 Vue 的自定义事件?如何触发和监听?
前端·javascript·vue.js
2301_766536052 小时前
调试无痛入手
开发语言·前端
@大迁世界3 小时前
构建 Next.js 应用时的安全保障与风险防范措施
开发语言·前端·javascript·安全·ecmascript
IT、木易4 小时前
ES6 新特性,优势和用法?
前端·ecmascript·es6
is今夕4 小时前
postcss.config.js 动态配置基准值
javascript·vue.js·postcss
青茶绿梅*24 小时前
500字理透react的hook闭包问题
javascript·react.js·ecmascript
计算机软件程序设计4 小时前
vue和微信小程序处理markdown格式数据
前端·vue.js·微信小程序
指尖时光.4 小时前
【前端进阶】01 重识HTML,掌握页面基本结构和加载过程
前端·html
前端御书房4 小时前
Pinia 3.0 正式发布:全面拥抱 Vue 3 生态,升级指南与实战教程
前端·javascript·vue.js