08 · ESLint / Prettier

3 阅读1分钟

8.1 'React' must be in scope when using JSX

原因:老规则,React 17+ 不再需要 import React

修法:.eslintrc 关掉:

{
  "rules": {
    "react/react-in-jsx-scope": "off",
    "react/jsx-uses-react": "off"
  }
}

8.2 Parsing error: Cannot read file 'tsconfig.json'

eslint 的 parserOptions.project 路径错。

修法:用绝对路径或显式相对路径:

{
  "parserOptions": {
    "project": "./tsconfig.json",
    "tsconfigRootDir": "__dirname"
  }
}

8.3 Prettier 与 ESLint 冲突

两个工具都管格式化时会循环修改。

修法:装 eslint-config-prettier,关掉所有格式类规则,只让 prettier 管格式:

npm i -D eslint-config-prettier
{
  "extends": ["...", "prettier"]
}

prettier 必须放在 extends 数组最后,才能覆盖前面的格式规则。

8.4 react-hooks/exhaustive-deps 警告

症状:useEffect 警告依赖不全,加上后又触发无限循环。

修法:

  • 真依赖 → 加上,并用 useCallback / useMemo 稳定引用
  • 假依赖(只在 mount 跑一次) → 用 ref 持有,不放依赖
  • ❌ 不要图省事 // eslint-disable-next-line,先想清楚为什么不需要

8.5 no-restricted-imports 与 monorepo / 路径别名

想禁止 import xxx from '../../../api',强制用 @/api:

{
  "rules": {
    "no-restricted-imports": ["error", {
      "patterns": ["../*api*"]
    }]
  }
}

8.6 commit 时 ESLint 卡住

用 husky + lint-staged 时,如果改动文件很多,lint 全跑会很慢。

修法:

  • lint-staged 只 lint staged 文件
  • ESLint 用 --cache
  • 大改动绕过:git commit --no-verify(谨慎)

8.7 编辑器与 CLI 报错不一致

原因:VSCode ESLint 扩展用的版本和 CLI 不同;.eslintrc 在工作区根目录但项目在子目录。

修法:

  • .vscode/settings.json"eslint.workingDirectories": ["./frontend"]
  • 重启 ESLint server(Cmd+Shift+P → ESLint: Restart)