写了一份前端 Linter 的总结教程

2022-01-18 15:23:37 +08:00
 Haixiang

最近在搞项目的基建,在配置 ESLint 和 Prettier 的时候感觉非常痛苦:NPM 的包太多了,而且名字又太像: eslint-plugin-prettier, eslint-prettier, eslint-config-prettier...

不仅配好了 ESLint 还要考虑 ESLint x TypeScript 结合,ESLint x LintStaged 结合等等一堆东西。受不了了,所以直接重新学习了一下前端 Linter 这块的内容,最后写了一份总结:

上手教程网站

Github

希望可以帮助前端 er 来理解这些概念。如何你看完这个教程后再看自己项目的 .eslintrc, .prettierrc 以及 package.json 里相关 NPM 包时,都能知道他们什么意思,那这个教程的目的就达到了。

因为网上对这些工具的介绍都比较简单,所以我能参考的资源也比较少,一般来自文档、Issue 和 Wiki ,所以如果你发现了错误,或者你有更好的配置方案,也可以提 Issue ,不要喷太重哈~ 小弟我已经尽力了。

这里依然有两个问题我没能解决:

目前我翻看了网上一些文章和文档,都没找到更好的解决方案,小弟我已经尽力了。

3750 次点击
所在节点    程序员
48 条回复
darknoll
2022-01-18 19:06:44 +08:00
支持
WhateverYouLike
2022-01-18 19:42:30 +08:00
点赞,完全命中我的困扰
robinlovemaggie
2022-01-18 20:36:02 +08:00
当你熟读这些个格式规则烂熟于心并能做到兼收并蓄之后,你会发现你的项目进度已经接近 deadline ,而项目经理完全不屑你搞的这些劳什子。
Haixiang
2022-01-18 20:39:35 +08:00
@robinlovemaggie 所以我才把它们都总结起来,方便其它人可以在 ddl 前搞完项目
EPr2hh6LADQWqRVH
2022-01-18 20:51:39 +08:00
我进来是要喷规则的,LZ 你在规则上竟然不站队,太不男人了,shame on you.

我想说的是,prettier 懂个屁,已禁。

airbnb 规则蠢就算了,邪说还舔脸放出来,天灭 airbnb, 壮哉我大 Covid, 坐等你家倒闭。

最后一条,分号不是给编译器看的,是给程序员潜意识降低心智负担的,谁不写分号还拒绝归化的,立刻🔥
connection
2022-01-18 20:53:57 +08:00
@Haixiang 我的是 eslint 仅仅用来 check ,不使用它的 fix.
kensoz
2022-01-19 07:56:31 +08:00
期待 eslint-plugin-import 的配置,配置一次恶心一次
steins2628
2022-01-19 09:02:01 +08:00
写的真好 收藏收藏
a1248499257
2022-01-19 09:23:54 +08:00
prettier 格式化的时候某些地方会多一些 ;;; 有没有大佬遇到过🤔️
Haixiang
2022-01-19 09:26:07 +08:00
Haixiang
2022-01-19 09:26:24 +08:00
@kensoz 还有这玩意,我研究研究
Haixiang
2022-01-19 09:27:03 +08:00
@a1248499257 这倒是没有,可以给 eslint-plugin-prettier 提个 Issue
Haixiang
2022-01-19 09:28:27 +08:00
@kensoz 看了一下主要是支持 import/export 语法的吧,这个如果用 TS 的话,可以用 TypeScript 的 Parser 解决,如果写 JS 一般也可以用 Babel Parser 解决。
a1248499257
2022-01-19 11:19:16 +08:00
@Haixiang 老早之前就有人提了,open 了好几年没解决
kensoz
2022-01-19 11:55:57 +08:00
@Haixiang
是,就是检查 import/export ,貌似国内用的不多
一般的导入导出检查 ts 就可以了,适用于需要自定义的场合
下面这是我的 lint 全家福( react 开发)
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.9.1",
"@typescript-eslint/parser": "^5.9.1",
"eslint": "^8.6.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-html": "^6.2.0",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-react": "^7.28.0",
"eslint-plugin-react-hooks": "^4.3.0",
"prettier": "^2.5.1"
}

我现在有时间也会研究 lint ,目前有这么几个课题
1.react 开发只配置过 airbnb ,上面这套就是 airbnb 的常用配置,不知道 Google 和 Standard 是怎么配置
2.vue 开发纯复制粘贴老项目的,没用过 eslint init
3.extends 和 plugins 的区别
4."prettier"到底写在哪里

lint 的坑太多了
Haixiang
2022-01-19 14:50:11 +08:00
@kensoz 说下我自己的理解哈:
1. 这个应该查一下 eslint-config-google , eslint-config-standard ,然后 extends 一下就好了, eslint-config-xxx 就是 xxx 的规则集
2. vue 的规则比 react 感觉简单很多,eslint-plugin-vue 就搞定了,除了可以识别 .vue 文件,还有自己一些规则
3. extends 一般是 extends 规则,但是也可以作为一些配置“缩写”的方式,可以参考 eslint-config-prettier 的配置,plugins 一般是用来识别不同的框架、文件下缀的,比如 eslint-plugin-vue, eslint-plugin-react 。这里和 Parser 又是不一回事,像我们用到的 Parser ,eslint 本身就自带了一个 ES 的 Parser ,TypeScript 还有自己的 parser ,Babel 也有对应的 ESLint Parser
4. prettier 作为规则是要写成 'prettier/prettier': 'error'
如果你用 typescript 的 parser 来解析 TS 文件,其实 jsx, react, import/export, es6 这些语法都能通过 tsconfig.json 来配置识别,可以不需要重复的 esling-plugin-xxx
newbieRenew
2022-01-19 15:36:56 +08:00
没那么多条条框框。统一用 standardJS, 保存后 ALE 后台自动执行格式化、Fix
kensoz
2022-01-19 17:34:11 +08:00
@Haixiang
给力老哥,我先研究一下,你这么一说我又想折腾折腾了
kensoz
2022-01-19 17:39:18 +08:00
@Haixiang
关于第四条,4."prettier"到底写在哪里
是因为有很多网上的教程不仅把 prettier 写到 plugins 里
还经常以 plugins/prettier... 的形式写到 extend 里,有点头大
在怀疑是不是和 prettier 版本有关
Haixiang
2022-01-19 19:22:39 +08:00
```
{
"extends": ["plugin:prettier/recommended"]
}
```
是下面的缩写
```
{
"extends": ["prettier"],
"plugins": ["prettier"],
"rules": {
"prettier/prettier": "error",
"arrow-body-style": "off",
"prefer-arrow-callback": "off"
}
}
```
大概就是总让人困惑的原因吧, https://github.com/prettier/eslint-plugin-prettier#recommended-configuration

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829010

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX