ESLint+Prettier,让 Vue、TypeScript 乖乖听话

2,158 阅读3分钟

前言

是的,网上这样的教程很多,但是我跟着配置后,发现还是有问题。

要么:save 后发现格式化了两次又恢复警告 warning 的样子。

要么:可以格式化了,却没有 fix 成功,还有若干 error

以前只有 eslint 的时候,世界没这么混乱啊...

那么不废话,直接一次爆破它:

1. 安装插件

vscode 插件选项搜索这 4 个:Vetur、ESLint、Prettir-Code formatter、Prettier ESLint 直接安装。

2. 直接食用,答疑去 3

项目根目录创建 .vscode 文件夹,里面创建 settings.json(注意:不要写入 .gitignore)。

{
  "------[vue]------": "使用 prettier 识别 vue,其他框架类似",
  "[vue]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "eslint.alwaysShowStatus": true,
  "eslint.packageManager": "yarn",
  "prettier.packageManager": "yarn",
  "eslint.run": "onSave",
  "vetur.validation.template": false,
  "editor.formatOnPaste": true,
  "editor.formatOnType": true,
  "editor.formatOnSave": true,
  "files.eol": "\n",
  "------typescript------": "参考自 https://github.com/microsoft/vscode",
  "[typescript]": {
    "editor.defaultFormatter": "vscode.typescript-language-features"
  },
  "[javascript]": {
    "editor.defaultFormatter": "vscode.typescript-language-features"
  },
  "typescript.tsc.autoDetect": "off",
  "------mark below------": "关闭 vetur 中、js/ts 中的默认 format 格式化,打开 eslint 格式化",
  "javascript.format.enable": false,
  "vetur.format.defaultFormatter.js": "none",
  "typescript.format.enable": false,
  "vetur.format.defaultFormatter.ts": "none",
  "eslint.format.enable": true,
  "eslint.validate": ["vue", "javascript", "javascriptreact", "typescript"],
  "------editor.codeActionsOnSave------": "开启 eslint 自动修复 js/ts 功能,最新语法",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}

项目根目录创建 .prettierrc.json

{
  "tabWidth": 2,
  "useTabs": false,
  "endOfLine": "auto",
  "singleQuote": true,
  "semi": false,
  "trailingComma": "none",
  "bracketSpacing": true
}

打开 ESLint 和 Prittier 开关,插件右下角打勾 Allow Everywhere:

搞定收工!以上配置基于 vue-cli 创建的工程项目,确保有 .eslintrc.js 等必要文件,配置完记得 reload 下 vscode!

另外这里就不贴 .eslintrc.js 的代码了,可以参考大厂的,也可以默认,统一规范嘛,习惯之后会香的,或者你可以参考我这个 canvas 制作的 摇奖小游戏 的配置。

3. 答疑

Q:我知道 vetur 内置了 prettier 和 eslint 的能力,这些插件还有必要单独装?

A:如果你想偷懒,就很有必要!

vetur 语法高亮,附带格式化及报错,但功能不全。eslint 用于质量检查校验代码,会在 VSCode 中抛出警告,需要你手动修改,而通常这样的错误都是空格、符号、无用变量之类的,让我动手?这很不优雅...这个时候需要一个自动化工具: prettier可以自动格式化,顺带统一风格,省时省力。

另外,项目中的配置文件优先级是高于 VSCode setting.json 的。

Q:为什么 save 后会进行两次格式化,出现闪回

A:因为你的格式化插件太多了,VSCode 到底该听谁的?

  • VSCode 本身有个格式化程序。

  • eslint 可以执行格式化 js。

  • prettier 可以执行格式化 js html css 等。

  • vetur 可以执行格式化 vue 单文件中的各类语言。

然后,prettier 又比较慢,执行时间最长,你一按 save 键,eslint -> default -> prettier 依次执行,假如中间有任何不一致的规则,那不是闪闪闪......

Q:为什么格式化后依旧报错

A:还是插件冲突。

vetur 内置了 prettier 和 eslint 的能力,有时候 prettier 的执行慢于 eslint。就会出现 Vue 文件中 js 格式化后 eslint 还报错的情况。

综上,我们直接暴力拆除,关掉不必要的默认配置,查看上文:

"------mark below------": "关闭 vetur 中、js/ts 中的默认 format 格式化,打开 eslint 格式化"

Q:其他方法 tips1:之前浏览了一个文章,有朋友直接使用了 eslint-plugin-prettiereslint-config-prettier 让这些格式化插件只听 prettier 的,不管顺序,大家有兴趣可以试试,反正我不试,够用就好...

tips2:更暴力地,干脆别装插件了,全部卸载留个代码高亮,然后使用 vue-cli 集成好的格式化配置,貌似也可以。

最后

如果你觉得这篇内容对你有点帮助,记得点个 丫。

另外,这篇本章会一直更新、修正和补充,地址不变,后续我计划在尾部补充工程化的其他实践作为扩展,算是笔记啦。

往期精选:

「中高级前端面试」手写代码合集

TLS 握手流程详解

Canvas 扭扭乐小游戏