文章目录
前言
遇到一个,配置了eslint,prettier 在ts文件会爆红提示,但遇到vue文件就不会。 自动保存格式化也是。记录思路:
采用了**“分而治之”**的策略,并严格遵守了 ESLint 新一代“平铺配置”(Flat Config)的规则。
最终版 eslint.config.mjs
的工作原理拆解成几个关键点,让你一看就懂:
1. 核心理念:从“一个大包袱”到“流水线作业”
- 以前的错误尝试:我们试图用一个大大的配置对象,告诉 ESLint “请用这一套规则处理所有文件”。这就像让一个工人同时处理木材、金属和塑料,他会感到困惑,最终导致对
.ts
文件使用了错误的 Vue 解析器。 - 现在的正确做法:最终的配置
export default [...]
是一个数组,你可以把它想象成一条流水线。当 ESLint 检查一个文件时,会把这个文件依次送上流水线上的每一个工位(也就是数组里的每一个配置对象),看它是否符合当前工位的加工条件。
2. 流水线上的工位(配置对象的拆解)
工位 ①:全局忽略 (ignores
)
{
ignores: ["dist/", "node_modules/", ...],
}
这是流水线的安检门。任何来自这些文件夹的文件,直接被拦下,不参与后续的所有检查,提高了效率。
工位 ②:基础规则铺设 (...tseslint.configs.recommended
, ...vuePlugin.configs["flat/recommended"]
)
...tseslint.configs.recommended,
...vuePlugin.configs["flat/recommended"],
这是流水线的底漆工序。我们直接把 TypeScript 和 Vue 官方推荐的最佳实践规则(它们本身就是配置数组)全部铺开在流水线上。这为我们提供了一个非常扎实的基础。
之前的错误:我们曾错误地把这些数组用
...
展开到一个对象内部,这在语法上是错误的,导致了Unexpected key "0"
的报错。现在我们是把它们正确地展开在顶层数组中。
工位 ③:全局定制 (rules
, plugins
, globals
)
{
rules: { /* ... */ },
plugins: { /* ... */ },
// ...
}
这是我们的个性化定制车间。在铺完官方底漆后,我们用这个工位来覆盖、修改或添加一些我们自己团队的规则,比如 uni
全局变量的声明,或者关闭一些我们不在意的规则(如 vue/multi-word-component-names
)。
工位 ④:Vue 文件专属的“精加工” (files: ["**/*.vue"]
)
{
files: ["**/*.vue"],
languageOptions: {
parser: vueParser,
parserOptions: {
parser: tseslint.parser,
},
},
}
这是解决 .vue
文件问题的关键! 这个工位只处理 .vue
文件。
parser: vueParser
: 它告诉 ESLint:“当你看到.vue
文件时,不要自己动手,把它交给专业的 Vue 解析器(vue-eslint-parser
)。”parserOptions: { parser: tseslint.parser }
: 然后,它进一步告诉 Vue 解析器:“当你从.vue
文件里把<script>
标签里的代码剥离出来后,请把这部分代码交给 TypeScript 解析器(tseslint.parser
) 去做精细分析。”
这个“双层解析”的策略,完美地处理了 .vue
文件这种“文件套文件”的特殊结构,所以 ESLint 才能在 <script>
内部正确地应用所有规则。
工位 ⑤:最后的“风格统一官” - Prettier
prettierConfig,
这是流水线的最后一站,也是最重要的一站。prettierConfig
的作用是:关闭所有之前工位上与代码格式相关的 ESLint 规则。
这保证了代码“长什么样”(比如分号、空格、换行)这件事,永远只由 Prettier 说了算,彻底避免了 ESLint 和 Prettier “打架”的问题。把它放在最后,确保了它的最高优先级。
总结
我们最终的成功,是因为我们为不同的文件类型(.vue
和 .ts
/.js
)设立了不同的、专门的“加工工位”,并确保了整条流水线的工序(规则继承、覆盖、解析)是清晰且无冲突的。这就是现代前端工程化中配置管理的精髓所在。