为什么React 17开始无需在组件中引入React了?

结论:因为新的 JSX Transform 不再需要 React 作用域来编译 JSX 了。

React 17 引入了 全新的 JSX 转换机制(New JSX Transform),React 18 继续沿用。

👉 从 React 17+(包含 React 18)开始, JSX 编译时已经不再依赖 React 本体,因此组件文件无需必须 import React。


React 16及以前为什么必须 import React

在 React 16 及以前,JSX 会被编译成类似这样的代码:

jsx 复制代码
const element = <div>Hello</div>;

会被 Babel 编译成:

js 复制代码
const element = React.createElement("div", null, "Hello");

所以:

  • JSX -> React.createElement

  • 编译后的代码需要 React 全局变量

  • 所以文件顶部必须写:

    js 复制代码
    import React from 'react';

否则 React.createElement 找不到会报错。


React 17:新的 JSX Transform

从 React 17 开始,React 引入了 新的 JSX Transform ,不再编译成 React.createElement,而是编译成更轻量的 helper 函数(由 React 自动引入)。

例如:

jsx 复制代码
const element = <div>Hello</div>;

会被编译成:

js 复制代码
import { jsx as _jsx } from "react/jsx-runtime";

const element = _jsx("div", { children: "Hello" });

特点:

  1. 编译结果不再需要全局 React

JSX 不再使用 React.createElement,而是用来自 react/jsx-runtime 的自动注入 helper。

  1. 自动引入 helper,不需要你手动写 import

Babel 或 SWC 会自动在文件里加入:

js 复制代码
import { jsx } from 'react/jsx-runtime';

在 Webpack / Vite 项目中如何启用?

Vite(默认启用)

Vite 默认使用 esbuild / SWC 编译 JSX,自动启用新 JSX transform。

你不需要做任何配置。


Webpack(React 17 + Babel)

需要安装:

bash 复制代码
npm i @babel/preset-react

babel.config.js:

js 复制代码
module.exports = {
  presets: [
    ['@babel/preset-react', { runtime: 'automatic' }]
  ]
};

runtime: 'automatic' 就是"自动注入 JSX helper"。


为什么 React 团队要这么做?

官方给出的原因:

  1. 更少的样板代码(boilerplate)

不用每个组件都写 import React

  1. 更小的 bundle

不再频繁使用 React.createElement,helper 更轻量。

  1. 为未来的 React 特性(如 Server Components)铺路

新的 transform 更灵活,扩展性更好。

  1. 更快的编译(尤其在 Vite / ESBuild 下)

JSX => helper 的转换更简单,利于性能。

相关推荐
于慨1 天前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz1 天前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
从前慢丶1 天前
前端交互规范(Web 端)
前端
CHU7290351 天前
便捷约玩,沉浸推理:线上剧本杀APP功能版块设计详解
前端·小程序
GISer_Jing1 天前
Page-agent MCP结构
前端·人工智能
王霸天1 天前
💥别再抄网上的Scale缩放代码了!50行源码教你写一个永不翻车的大屏适配
前端·vue.js·数据可视化
小领航1 天前
用 Three.js + Vue 3 打造炫酷的 3D 行政地图可视化组件
前端·github
@大迁世界1 天前
2026年React大洗牌:React Hooks 将迎来重大升级
前端·javascript·react.js·前端框架·ecmascript
PieroPc1 天前
一个功能强大的 Web 端标签设计和打印工具,支持服务器端直接打印到局域网打印机。Fastapi + html
前端·html·fastapi
悟空瞎说1 天前
深入 Vue3 响应式:为什么有的要加.value,有的不用?从设计到源码彻底讲透
前端·vue.js