VSCode 在保存时从导入中删除 React

切换到 vscode 1.68.1 后

每次保存文件时,它都会自动从导入中删除 React,尽管这可能是一个 eslint 问题,因为我使用 eslint 进行格式化,但删除 eslint 插件后问题仍然存在

这是我的 settings.json

{
    "eslint.alwaysShowStatus": true,
    "editor.formatOnSave": true,
    "files.eol": "rn",
    "editor.codeActionsOnSave": {
        "source.fixAll": true,
        "source.organizeImports": true
    },
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
    "prettier.arrowParens": "avoid",
    "prettier.embeddedLanguageFormatting": "off",
    "prettier.enable": false,
    "eslint.format.enable": false,

    "[css]": {
        "editor.defaultFormatter": "aeschli.vscode-css-formatter"
    },
    "[html]": {
        "editor.defaultFormatter": "vscode.html-language-features"
    },
    "[json]": {
        "editor.defaultFormatter": "vscode.json-language-features"
    },
    "[jsonc]": {
        "editor.defaultFormatter": "vscode.json-language-features"
    }
}

这是.eslintrc

module.exports = {
    "env": {
        "browser": true,
        "es6": true
    },
    "extends": "airbnb",
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        "ecmaFeatures": {
            "jsx": true
        },
        "ecmaVersion": 2018,
        "sourceType": "module"
    },
    "plugins": [
        "react", "react-hooks"
    ],
    "rules": {
        "linebreak-style": ["error", "windows"],
        "react/forbid-prop-types": 0,
        "react/prop-types": 0,
        "max-len": ["error", { "code": 220 }]
    },
    "settings": {
        "import/resolver": {
          "node": {
            "moduleDirectory": ["node_modules", "src/"]
          }
        }
      }
};
stack overflow VSCode removing React from imports on save
原文答案

答案:

作者头像

尝试在 eslintrc 中添加这些规则:

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

或者

尝试将 "jsx": "react" 添加到您的 jsconfig 中:

{
  "compilerOptions": {
    "baseUrl": ".",
    "jsx": "react",
    "paths": {
      "*": ["*", "src/*"]
    }
  }
}

这有助于 VS-Code 理解 React 被文件中的 jsx 元素隐式引用。

我在多个项目中遇到了同样的问题,添加这些规则后,为我解决了这个问题。

作者头像
{
  // ...
  "rules": {
    // ...
    "react/jsx-uses-react": "on",
    "react/react-in-jsx-scope": "on"
  }
}

将这些规则添加到您的 eslint 配置中

作者头像

我也有同样的问题,删除扩展时发现是vscode,降级到1.67.2版解决了

作者头像

尝试从您的设置中删除 "source.organizeImports": true 行,或将其设置为 false

我认为 VS Code 认为 React 导入是不必要的,因为它仅隐式使用(如果您的编译器需要显式导入才能正确捆绑,这可能是一个问题)。

作者头像

在您的 tsx 文件中添加类型,以防止被 vscode 自动删除

import React from 'react';
type _react = typeof React

.eslint

{
  rules: {
    'react/jsx-uses-react': 0, // ignore validation must include react scope in jsx/tsx
    'react/react-in-jsx-scope': 0, // ignore validation must include react scope in jsx/tsx
    'no-unused-vars': 'off', // disable default eslint unused variable
    '@typescript-eslint/no-unused-vars': [ // ignore validation variable with prefix _
      'warn',
      {
        argsIgnorePattern: '^_',
        varsIgnorePattern: '^_',
        caughtErrorsIgnorePattern: '^_'
      }
    ]
  }
}
作者头像

VS Code 期望每个项目都声明一个 tsconfig.jsonjsconfig.json ,如果没有提供,它默认为

{
  "compilerOptions": {
    "jsx": "react"
  }
}

这实际上意味着如果你的代码中有 React 导入,它们将被保留。

要采用带有 _jsx 转换的最新 React 17+ 标准,环境类型需要为 react-jsx

{
  "compilerOptions": {
    "jsx": "react-jsx"
  }
}