ESLint 不相信我在我的 tsconfig 中包含了 .vue 文件

Posted

技术标签:

【中文标题】ESLint 不相信我在我的 tsconfig 中包含了 .vue 文件【英文标题】:ESLint doesn't believe that I've included .vue files in my tsconfig 【发布时间】:2021-01-11 01:21:48 【问题描述】:

我有一个 Vue.js 2 项目,我正在努力移植到 TypeScript(一次一点)。我正在尝试让 ESLint 解析我的 TypeScript 文件和 Vue 组件,但是当我运行 vue-cli-service lint 我所有的 .vue 文件时都会报告此错误:

error: Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser.
The file does not match your project config: src/path/to/Foo.vue.
The file must be included in at least one of the projects provided

当然,.vue 文件肯定包含在我的 tsconfig.json 文件中,如图:

// tsconfig.json


  "compilerOptions": 
    "target": "ES5",
    "module": "ES2020",
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "strict": true,
    "alwaysStrict": true,
    "noEmitOnError": true,
    "noUnusedLocals": true,
    "importHelpers": true,
    "allowJs": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "jsx": "preserve",
    "outDir": "dist",
    "baseUrl": ".",
    "types": ["webpack-env", "jest", "node", "googlemaps"],
    "typeRoots": ["./node_modules/@types", "./src/typings", "./src"],
    "paths": 
      "@/*": ["./src/*"]
    
  ,
  "include": ["src/**/*.js", "src/**/*.ts", "src/**/*.vue"],
  "exclude": [
    "node_modules",
    "functions",
    "scripts",
    "coverage",
    "__snapshots__",
    "src/**/*.test.ts",
    "src/**/*.test.js",
    "tests/**"
  ]

我的 ESLint 配置是这样设置的:

// .eslintrc.js

module.exports = 
  extends: [
    "eslint:recommended",
    "plugin:vue/recommended",
    "prettier/vue",
    "plugin:prettier/recommended",
    "@vue/typescript",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ],

  env: 
    browser: true,
    amd: true,
    node: true,
    es6: true
  ,

  parser: "vue-eslint-parser",
  plugins: ["@typescript-eslint", "vue"],
  parserOptions: 
    parser: "@typescript-eslint/parser",
    sourceType: "module",
    project: "./tsconfig.json",
    extraFileExtensions: [".vue"]
  ,

  rules: 
    "vue/component-name-in-template-casing": ["error", "PascalCase"],
    "no-console": "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "error" : "warn",
    "no-async-promise-executor": "off",
    semi: "error",
    "jest/expect-expect": "off",
    "jest/no-try-expect": "off",
    "@typescript-eslint/require-await": "warn",
    "@typescript-eslint/no-floating-promises": "warn",
    "@typescript-eslint/no-unsafe-member-access": "warn",
    "@typescript-eslint/restrict-template-expressions": "warn",
    "@typescript-eslint/restrict-plus-operands": "warn",
    "@typescript-eslint/no-unsafe-call": "warn",
    "@typescript-eslint/no-unsafe-assignment": "warn",
    "@typescript-eslint/no-unsafe-return": "warn"
  ,

  overrides: [
    
      files: ["**/*.test.j,ts?(x)"],
      env: 
        jest: true
      
    
  ]
;

我有一个包含这些条目的 .eslintignore 文件:

/tests
.eslintrc.js
sw.js
*.config.js
*-config.js

我也在运行以下相关插件:

// package.json
...
  "@typescript-eslint/eslint-plugin": "^4.2.0",
  "@typescript-eslint/parser": "^4.2.0",
  "@vue/cli": "^4.5.4",
  "@vue/eslint-config-typescript": "^5.1.0",
  "eslint": "^7.9.0",
  "eslint-plugin-vue": "^7.0.0-beta.4",
...

我已经尝试了几乎所有我知道要做的事情,除了我现在所拥有的(见上文):

将我的 tsconfig 更改为 ["src/**/*.js", "src/**/*.ts", "src/**/*.vue"] Changing my tsconfig includes 至 "src/**/*" 更改我将 ESLint 指向 tsconfig 的方式: "tsconfig.json" path.resolve(__dirname, "./tsconfig.json") 扩展@vue/typescript/recommended 规则而不是 @vue/typescript 扩展@vue/typescript/recommended 规则之后 @vue/typescript 扩展 @vue ESLint 规则 从 .eslintrc.js 中的 env 条目中排除 es6: true 省略plugins: ["@typescript-eslint", "vue"]

...每个都有相同的结果。

如您所见,我已将 @typescript-eslint/parser 列为自定义解析器,根据 this Vue doc。

This typescript-eslint issue 似乎不适用,因为问题出在 CLI 中,而不是 VSCode 中。此外,这不仅仅是“新的” .vue 文件,而是项目中的所有 .vue 文件。

ESLint 是否正确,我配置错误?如何让它正确地 lint 我的 SFC 组件?

【问题讨论】:

【参考方案1】:

我通过使用solution-style tsconfig 并使用eslintrc overrides 来选择特定的文件扩展名并将ESLint 指向正确的配置来解决了这个问题。

巧妙地应用。

【讨论】:

以上是关于ESLint 不相信我在我的 tsconfig 中包含了 .vue 文件的主要内容,如果未能解决你的问题,请参考以下文章

Typescript / Eslint 在我开始的每个项目中都会抛出“无法读取文件 tsconfig.json”

typescript-eslint 未使用 tsconfig

带有 TypeScript 解析器/插件的 ESLint:如何包含从 tsconfig.json 中排除的 .spec.ts?

解析错误:遵循 Firebase Cloud Functions 初始化说明后无法读取文件 '\tsconfig.json' eslint

错误:Angular CLI v10.1.0 及更高版本(并且没有 `tsconfig.base.json`)

如果我在 tsconfig 中使用自定义路径,Webpack 开发服务器找不到带有 Typescript 的模块