虽然 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><aclassName="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><aclassName="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

介绍全新的 JSX 转换相关推荐

  1. 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

     1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...

  2. React jsx转换成原生JavaScript的一个例子

    jsx代码: var React = require('react'); var ReactDOM = require('react-dom'); var MyButtonController = r ...

  3. 视频剪辑工作者的福音,视频格式转换工具4Videosoft Video Converter Ultimate的介绍使用,可以转换所有的视频格式

    使用平台:Windows10,当然macOS也有相关的版本,我这里就不做介绍了 app:4Videosoft Video Converter Ultimate 文末附下载文件路径,全部测试安全 文章目 ...

  4. cifar数据集介绍及到图像转换的实现

    CIFAR是一个用于普通物体识别的数据集.CIFAR数据集分为两种:CIFAR-10和CIFAR-100.The CIFAR-10 and CIFAR-100 are labeled subsets ...

  5. Quoted-printable 编码认识、介绍、编码解码转换

    我们在做接收邮件时,有些邮件的Content-Transfer-Encoding类型为quoted-printable Quoted-printable 可译为"可打印字符引用编码" ...

  6. 外媒介绍全新表情密码 用emoji解锁安全吗?

    如果你的手机开机密码能根据心情而变化会怎样,用(emoji笑哭表情)做密码是不是很有意思?虽然现在智能手机指纹识别越来越普及,但是密码键盘开锁仍是广大人民群众的首选.这意味着,我们除了要费心记住各种A ...

  7. 二、八、十、十六进制介绍及进制转换

    进制:是计算机中数据的一种表示方法.N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F表示. 10进制:用0~9的数表示,逢10进1. 16进制:由0~9,A~F组成,与10进制的对应关系是 ...

  8. 虚拟网络编辑器三种模式工作原理详细介绍(桥接-网络地址转换-主机模式)

     1.桥接模式(Bridged) 使用该模式的虚拟操作系统是局域网中的一个独立主机,具有独立访问网络中其他主机的功能.它的配置信息由VMnet0虚拟网络提供,不支持DHCP服务.用户需要按照一定的规则 ...

  9. lol1月24服务器维护,LOL1月24日更新内容介绍 全新9.2版本上线

    今日凌晨4点,<英雄联盟>将正式开启全区停机维护,而这次维护的目的就是开启全新的9.2版本.这次更新的时间约为8小时,服务器将在中午12点重新开启. 这次的9.2版本更新是英雄联盟的一个比 ...

最新文章

  1. 【Qt】使用sqlite3数据库时,主键自增和获取自增后的主键的
  2. Lambda表达式的语法格式
  3. md5可以解密吗_Python训练营作业1:加密解密
  4. 音视频技术开发周刊(第120期)
  5. 火遍全网的Hutool,如何使用Builder模式构建线程池
  6. Microsoft Visual Studio 2008从试用版转为正式版
  7. Updating Homebrew... ...长时间卡住的问题
  8. 避免jQuery名字冲突--noConflict()方法
  9. 拓端tecdat|R语言Meta分析效应量
  10. 将c语言编译成verilog,是否可以将System Verilog函数编译为C或C?
  11. mysql hash分区 子分区_mysql分区管理 - hash分区
  12. 长ping命令返回结果输出为文本
  13. 使用Arduino+声音模块+LCD显示屏制作分贝仪
  14. 苹果手机怎么连接不了无线网络连接服务器,苹果手机连接wifi显示无互联网连接怎么办?...
  15. WebSocket多人聊天室
  16. 交换机的原理及其配置(一)
  17. 安装VC 6.0,出现 DOSX.EX must be in your AUTOEXEC.NT的信息
  18. access数据库连接sqlserver实现远程连接
  19. 红外传感器型号和参数_红外传感器参数
  20. AjaxPro的应用

热门文章

  1. 云原生火爆技术人朋友圈,你可别云里雾里了!
  2. 程序员不会SQL?骨灰级工程师:全等着被淘汰吧!这是必会技能!
  3. 谈谈能带来高薪报酬的软件技术
  4. Google 搜索点击量不到 50%?
  5. 如何用 200 行 JavaScript 代码实现人脸检测?
  6. Python 3.8 新功能大揭秘
  7. 2019 Go 开发者路线图,请收下这份指南!
  8. Node.js 与 JavaScript 基金会正式合并,JS 喜提新主场
  9. 程序员如何抓住工业互联网风口实现逆袭?
  10. 面向对象编程已死,OOP 永存!