介绍全新的 JSX 转换

简介: 介绍全新的 JSX 转换

虽然 React 17 并未包含新特性,但它将提供一个全新版本的 JSX 转换。看看怎么用吧?

先看看 React 16 的项目。react 和 react-dom 的版本都是16的。

    "react": "^16.8.6",
    "react-dom": "^16.8.6",
import React from 'react'; // 必须引入 React
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

必须引入 React,如果没有引入就会报错。

再看看 React 17 的项目。react 和 react-dom 的版本都是17的。

    "react": "^17.0.1",
    "react-dom": "^17.0.1",
// import React from 'react'; 不需要引入 React
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

你可以单独使用 JSX 而无需引入 React。

在浏览器中无法直接使用 JSX,所以大多数 React 开发者需依靠 Babel 或 TypeScript 来将 JSX 代码转换为 JavaScript。许多包含预配置的工具,例如 Create React App 或 Next.js,在其内部也引入了 JSX 转换。

React 17 提供了一个全新的,重构过的 JSX 转换的版本。升级至全新的转换完全是可选的,但升级它会为你带来一些好处:

1、使用全新的转换,你可以单独使用 JSX 而无需引入 React。
2、根据你的配置,JSX 的编译输出可能会略微改善 bundle 的大小。
3、它将减少你需要学习 React 概念的数量,以备未来之需。

新的转换有何不同?

当你使用 JSX 时,编译器会将其转换为浏览器可以理解的 React 函数调用。旧的 JSX 转换会把 JSX 转换为 React.createElement(...) 调用。

例如,假设源代码如下:

import React from 'react';

function App() {
  return <h1>Hello World</h1>;
}

旧的 JSX 转换会将上述代码变成普通的 JavaScript 代码:

import React from 'react';

function App() {
  return React.createElement('h1', null, 'Hello world');
}

然而,这并不完美:

如果使用 JSX,则需在 React 的环境下,因为 JSX 将被编译成 React.createElement。
有一些 React.createElement 无法做到的性能优化和简化。

为了解决这些问题,React 17 在 React 的 package 中引入了两个新入口,这些入口只会被 Babel 和 TypeScript 等编译器使用。新的 JSX 转换不会将 JSX 转换为 React.createElement,而是自动从 React 的 package 中引入新的入口函数并调用。

假设你的源代码如下:

function App() {
  return <h1>Hello World</h1>;
}

下方是新 JSX 被转换编译后的结果:

// 由编译器引入(禁止自己引入!)
import {jsx as _jsx} from 'react/jsx-runtime';

function App() {
  return _jsx('h1', { children: 'Hello world' });
}

注意,此时源代码无需引入 React 即可使用 JSX 了!

注意

react/jsx-runtime 和 react/jsx-dev-runtime 中的函数只能由编译器转换使用。如果你需要在代码中手动创建元素,你可以继续使用 React.createElement。它将继续工作,不会消失。

了解更多:https://zh-hans.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html

相关文章
|
5月前
|
前端开发 JavaScript
jsx的语法规则
jsx的语法规则
|
1月前
|
XML 前端开发 JavaScript
JSX 语法详解
【9月更文挑战第2天】本文详细介绍了React框架中核心组件JSX的基本概念与高级用法,包括基本语法、条件与列表渲染等。并通过具体示例讲解了如何避免常见的错误,如忘记闭合标签、未使用`key`属性及属性名大小写问题,帮助读者更好地理解和运用JSX,提升React应用程序的开发质量。
51 4
|
5月前
|
前端开发 JavaScript 安全
React中的JSX:语法与原理深入解析
【4月更文挑战第25天】本文深入解析React中的JSX,一种JavaScript语法扩展,使代码更直观。JSX让开发者以HTML样式描述组件UI,但最终编译成JavaScript。通过Babel转换,JSX标签转为React.createElement()调用,创建虚拟DOM。JSX的优势在于直观性、类型安全、代码复用和工具支持,助力高效开发React组件,适应不断发展的Web应用需求。
|
5月前
|
JavaScript
【vue】无法使用 JSX,除非提供了 “--jsx“ 标志
【vue】无法使用 JSX,除非提供了 “--jsx“ 标志
50 0
【vue】无法使用 JSX,除非提供了 “--jsx“ 标志
|
12月前
|
JavaScript 前端开发 C++
58Vue - Props(字面量语法 vs 动态语法)
58Vue - Props(字面量语法 vs 动态语法)
43 0
|
12月前
|
JavaScript 前端开发
12Vue - 模板语法(插值-使用JavaScript表达式)
12Vue - 模板语法(插值-使用JavaScript表达式)
213 0
|
5月前
|
XML 前端开发 JavaScript
jsx的语法规则?
jsx的语法规则?
|
5月前
|
XML JavaScript 前端开发
说说React jsx转换成真实DOM的过程?
说说React jsx转换成真实DOM的过程
64 0
|
11月前
|
前端开发 JavaScript
JSX语法入门
JSX语法入门
45 0
|
JavaScript
Vue2.js:TypeScript 支持Prop属性类型标注
Vue2.js:TypeScript 支持Prop属性类型标注
155 0