🔧 React17 + webpack 不导入React,报错的解决方案

4,184 阅读1分钟

最近在自己配置脚手架项目,解决完这个问题,怀着无比激动的心情于凌晨2点写完第一篇分享。

背景

react17之后,无需引入React就可以使用JSX官网文档

image.png

问题描述

本文使用webpack^5.72.0 + react^18.0.5 + eslint^8.13.0 + ts^4.6.3配置后报错,报错如下:

'React' must be in scope when using JSX eslint(react/react-in-jsx-scope)

'React'指 UMD 全局,但当前文件是模块。请考虑改为添加导入。ts(2686)

Uncaught ReferenceError: React is not defined

在不引入React的前提下,参考cra项目弹出配置后的webpack.config.js的配置解决问题,关键变量hasJsxRuntime

解决方案

1. Eslint静态代码检查报错: 'React' must be in scope when using JSX eslint(react/react-in-jsx-scope)

修改.eslintrc.js (eslint配置文件)

extends:[  ...,  'plugin:react/jsx-runtime']
2. “React”指 UMD 全局,但当前文件是模块。请考虑改为添加导入。ts(2686)

修改.tsconfig.json (ts配置文件)

"compilerOptions"[
  ...,
  "jsx": "react-jsx",
]

ts文档说明

react-jsxreact-jsxdev是用来支持react17的_jsx构造方法。

// React 17 transform: "react-jsx"
import { jsx as _jsx } from "react/jsx-runtime";
import React from 'react';
export const HelloWorld = () => _jsx("h1", { children: "Hello world" });
// React 17 dev transform: "react-jsxdev"
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
const _jsxFileName = "/home/runner/work/TypeScript-Website/TypeScript-Website/index.tsx";
import React from 'react';
export const HelloWorld = () => _jsxDEV("h1", { children: "Hello world" }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 32 }, this);
3. 'React' must be in scope when using JSX eslint(react/react-in-jsx-scope)

修改.babelrc.js (babel配置文件)

presets: [
    [
      '@babel/preset-env',
      {
        modules: false,
      },
    ],
    [      '@babel/preset-react',      {        runtime: 'automatic', // 这句是关键      },    ],
    '@babel/preset-typescript',
  ],

cra-ts项目弹出配置后可以看一下这个位置的代码

image.png

第一次分享,有问题欢迎指正!