使用 "react-jsx" 作为 create-react-app 的 jsx 值的 Visual Studio 代码有问题

Problem with Visual Studio Code using "react-jsx" as jsx value with create-react-app

我正在努力解决 VSCode 中的以下“错误”:

Argument for '--jsx' option must be: 'preserve', 'react-native', 'react'

因此,当 react 值似乎有效时,react-scripts (create-react-app) 会自动将 jsx 键设置为 react-jsx 值。

实际上,代码运行完美并显示了我想要的页面,但是 IDE 将一切都作为错误下划线,说:

Cannot use JSX unless the '--jsx' flag is provided.

这是我的 tsconfig.json :

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx"
  },
  "include": [
    "src"
  ]
}

,和我的 package.json(默认由 create-react-app 提供 + 更新的包):

{
  "name": "front-office",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.6",
    "@testing-library/react": "^11.2.2",
    "@testing-library/user-event": "^12.2.2",
    "@types/jest": "^26.0.15",
    "@types/node": "^14.14.9",
    "@types/react": "^17.0.0",
    "@types/react-dom": "^17.0.0",
    "bootstrap": "^4.5.3",
    "react": "^17.0.1",
    "react-bootstrap": "^1.4.0",
    "react-dom": "^17.0.1",
    "react-scripts": "4.0.1",
    "typescript": "^4.1.2",
    "web-vitals": "^1.0.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

我使用的是最新版本的 Typescript,我用 ncu、closed/opened VSCode 更新了我的所有包(有时使用 tsconfig !)似乎没有任何解决办法那。

我很确定这是一个 VSCode 问题,但我 运行 不知道如何解决这个问题。

你们有什么想法吗?

编辑:

如果您按照上述步骤操作后 VSCode 仍然显示“-jsx”错误,请确保您已禁用 'TypeScript God' 扩展(并且任何其他 TS 扩展,直到问题不再出现。

这是因为 VSCode 的 Typescript 版本没有使用 create-react-app 默认使用的最新 babel 特性。

您可以 change VS Code to use the workspace's version of Typescript instead,这将解决此问题。

Open a TypeScript or JavaScript file and click on the TypeScript version number in the Status Bar. A message box will appear asking you which version of TypeScript VS Code should use

Select“使用工作区版本”以使用较新的 Create React App typescript 版本。

对于使用 VS 2019 的用户,我必须从这里为 visual studio 安装 typescript 4.1: https://marketplace.visualstudio.com/items?itemName=TypeScriptTeam.TypeScript-41

然后通过在 compilerOptions 等中使用新的 jsx 设置,它工作正常

在 PhpStorm 中(WebStorm 可能也是如此)我通过在 Remote JSON 模式。

如果您使用的是 VS Code,而 marksfrancis 的回答对您不起作用。也许你应该检查你的 TypeScript 扩展,在我的例子中,扩展 'TypeScript God' 是我仍然遇到这个问题的原因。

正在安装 JavaScript and TypeScript Nightly extension 并在 VSC 中重新选择 TS 版本(打开 .tsx 时,单击 TS 版本(右下角),然后单击“Select TypeScript 版本”->“使用 VS Code 的版本” ") 也有效。

(来源:https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-typescript-nightly-builds

如果您尝试通过在 vscode 编辑器中选择“使用工作区版本”来更新打字稿版本,但它仍然显示错误,请尝试更新 .tsconfig 中字段 "jsx" 的值文件到 "preserve".

  • 这将使您能够以旧方式编写 JSX。
import React from 'react';

function App() {
  return <h1>Hello World</h1>;
} 
  • 如果你使用值"react-jsx"值,你将不得不在新的React 17 Transform中编写react:
import { jsx as _jsx } from "react/jsx-runtime";
export const helloWorld = () => _jsx("h1", { children: "Hello world" }, void 0);

.tsconfig 文件参考(根据打字稿文档):here

新的 JSX 转换(根据 React 文档):here

如其他人所述,这是 create-react-app (CRA) 脚本的未解决问题。但是,上述解决方案的 none 对我有用。唯一对我有用的解决方案是在 .env 文件(在项目根目录中)中添加以下配置。

DISABLE_NEW_JSX_TRANSFORM=true

只是替换

 "jsx": "react-jsx"

"jsx": "react"

干杯!!

我将 Visual Studio 代码更改为较新的版本,最终解决了我的问题。