mscinsidious 2019-11-16
心中一直有个疑惑,添加 --fix 参数后的 eslint 是否能替代 prettier 作为 JavaScript 格式化工具。
凑巧在网上看到一篇文章《到底如何配置,才能在vscode中正常使用eslint和prettier?》,聊了类似的问题。于是,顺着这个思路,我也来说一说。
eslint
The pluggable linting utility for JavaScript and JSX
prettier
Prettier is an opinionated code formatter
一个是 lint 工具,一个是格式化工具,两者本各司其职,相得益彰。但偏偏 eslint 有个附属功能也能干格式化的活,于是问题随之而来——同干一件事,规则冲突时,到底该听谁的呢?
// .prettierrc
{
"trailingComma": "all"
}
// code
var a = [1, 2]你会惊奇的发现,prettier 并没有在数组最后一项之后添加逗号。其实,prettier 的这个配置等价于
.eslintrc.js
{
rules: {
'comma-dangle': [2, 'only-multiline'],
}
}如果你希望总是显示尾部的逗号,按照下面配置,那么,冲突已发生
{
rules: {
'comma-dangle': [2, 'always'],
}
}vscode 插件 prettier-eslint 的出现,提供了一个思路:
Code ➡️ prettier ➡️ eslint --fix ➡️ Formatted CodeThe
eslintConfigandprettierOptionscan each be provided as an argument. If
theeslintConfigis not provided, thenprettier-eslintwill look for them
based on thefileName(if nofileNameis provided then it usesprocess.cwd()). Onceprettier-eslinthas found theeslintConfig, theprettierOptionsare inferred from theeslintConfig. If some of theprettierOptionshave already been provided, thenprettier-eslintwill only
infer the remaining options. This inference happens insrc/utils.js.
最终以 prettierOptions 的配置优先,因此,结果可能并不符合 eslint 配置的规则。
我认为是可以替代的,有以下几点理由:
eslint-config-prettier 与 eslint-plugin-prettier 两个包可以佐证。虽然 eslint-config-prettier 是这么介绍自己的:
Turns off all rules that are unnecessary or might conflict with Prettier.
两者都是基于 AST 工作的,所以 eslint 是可以替代 prettier 的。至于,格式化代码性能上表现,由于没有深入研究,不作讨论。
prettier 的优点也是其缺点——配置简单,而 eslint 的配置相对来说更复杂。
因此,要么单独配置 eslint 完成格式化功能,要么,添加 eslint-config-prettier 与 eslint-plugin-prettier 两个包后,再配合两者一起使用。