解决 prettier/prettier 和 indent 冲突问题和一点简单思考

用过 prettier 的都知道,经常会遇到 prettier 与 eslint 的某些规则冲突的情况。在之前的一篇文章中,我简单地描述过怎么搭建起应用 eslint/prettier 的基本配置,也提到了怎么解决 prettier 与 eslint 的一些冲突问题。

其中有这么一段话,我直接引用过来:

项目中要不要使用 Prettier 取决于个人,没有强制的要求,毕竟没有 Prettier 之前,大家也活得挺好。做这个决定前要搞清楚 Prettier 和 ESLint / StyleLint 这类 Linter 扮演的角色分别是什么。简单说就是 Prettier 负责代码风格,而 Linter 负责代码质量

引用官方文档的一句话:Prettier for formatting and linters for catching bugs!

读过 Prettier 的这篇文档你就可以知道,Prettier 和 Linters 会有一些功能交叉和规则冲突。功能交叉指的是 Linter 除了负责代码质量外,本身也可以定义规则约束代码风格,这就有可能会与 Prettier 的代码风格产生冲突。这个时候,就需要通过 Linter 体系中的一些插件配置关掉一部分与 Prettier 有冲突的规则,尽量在风格上以 Prettier 为准,比如 eslint-config-prettierstylelint-config-prettier

这虽然解决了大部分问题,但是我偶尔在一些 tsx 的使用过程还是会遇到一些问题,比如 prettier/prettier 与 indent 的冲突问题。具体表现为:

prettier 和 indent rule 交替生效,进入死循环。

刚开始一直想不明白,明明已经使用 eslint-config-prettier 关闭冲突了,为什么还会有这种问题。想不明白总得解决问题,当时就只是通过加上 eslint-disable 先关闭出现问题的那个文件的 prettier/prettier 规则。

这个问题也并不是在所有 tsx 文件中都会出现,大概率会出现在三元运算符的缩进场景下。

终于,前几天在写一个新的 tsx 文件时,又遇到了这个问题,这次我实在是受不了了,也不想将就,就只能找找有没有新的讯息。

幸运的是,还真的让我找到了,之前翻看 eslint-config-prettier github 的时候似乎还没找到这一段,可能是太多用户遇到了这个问题,现在 README 都有这个案例了。

it cannot touch "rules"! (That's how ESLint works -- it lets you override configs you extend.)

所以根本问题在于 rules 的优先级很高,即便是 extends 里用了 eslint-config-prettier 也没法优先于 rules 中的相关规则。

因此我们只要把 rules 中的 indent 配置删掉即可,把 indent 的控制能力交给 prettier 即可,eslint rules 就别操这个心了!正如前文所说,既然你选择了 prettier,就要明白代码风格由 prettier 管,eslint 主要负责代码质量就好了!

附上 github 链接:This eslintrc example has a conflicting rule "indent" enabled

要说根本原因,可能还是没仔细研究过 eslint 的工作机制,或者说没有一个很深的印象,之前也是知道 rules 的优先级是更高的,不过在遇到这个问题时,根本没往那方面想,emm。

相关推荐
渣哥11 分钟前
从 AOP 到代理:Spring 事务注解是如何生效的?
前端·javascript·面试
toobeloong26 分钟前
Electron 从低版本升级到高版本 - 开始使用@electron/remote的改造教程
前端·javascript·electron
悠哉摸鱼大王29 分钟前
前端获取设备视频流踩坑实录
前端·javascript
铅笔侠_小龙虾38 分钟前
深入理解 Vue.js 原理
前端·javascript·vue.js
西西学代码42 分钟前
Flutter---showCupertinoDialog
java·前端·flutter
你的眼睛會笑44 分钟前
vue3 使用html2canvas实现网页截图并下载功能 以及问题处理
前端·javascript·vue.js
ZTLJQ1 小时前
植物大战僵尸HTML5游戏完整实现教程
前端·游戏·html5
无光末阳1 小时前
vue 环境下多个定时器的创建与暂停的统一封装
前端·vue.js
Hilaku1 小时前
技术Leader的“第一性原理”:我是如何做技术决策的?
前端·javascript·面试