anddisign 2.x table无法引入_React 17.0.0-rc.2 版本发布,引入全新的 JSX 转换_weixin_39592137的博客-程序员宅基地

技术标签: anddisign 2.x table无法引入  jsxbin to jsx  IWorkbook 引入  tomocat 允许iframe 引入  npm install cracoc 老版本  rails6 引入 bootstrap  

0262c5c007e31c42ef49d1edc39b171f.png
北京时间 9 月 23 日凌晨,React 团队发布了关于全新 JSX 转换的博客,同时发布了 React 17 的 RC 版本,新的 JSX 转换不再依赖 React 环境,在转换时会自动引入新的 runtime。
原文链接: https:// reactjs.org/blog/2020/0 9/22/introducing-the-new-jsx-transform.html
作者:Luna Ruan
译者:QC-L
译文首发与 React 中文文档博客,欢迎关注 https://zh-hans.reactjs.org 或者关注 印记中文公众号。

虽然 React 17 并未包含新特性[1],但它将提供一个全新版本的 JSX 转换。本文中,我们将为你描述它是什么以及如何使用。

何为 JSX 转换?

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

React 17 发布在即,尽管我们想对 JSX 的转换进行改进,但我们不想打破现有的配置。于是我们选择与 Babel[2] 合作,为想要升级的开发者提供了一个全新版本的,重构过的 JSX 转换

升级至全新的转换完全是可选的,但升级它会为你带来一些好处:

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

此次升级不会改变 JSX 语法,也并非必须。旧的 JSX 转换将继续工作,没有计划取消对它的支持。

React 17 的 RC 版本[3] 已经引入了对全新 transform 的支持,所以你可以尝试一下!为了让大家更容易使用,在 React 17 正式发布后,我们还计划将其支持 React 16.x,React 15.x 以及 React 0.14x。你可以在下方[4]找到不同环境的升级说明。

接下来,我们来仔细对比新旧转换的区别。

新的转换有何不同?

当你使用 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 转换如何将你的 JSX 源码变成浏览器可以理解的 JavaScript 代码。

然而,这并不完美:

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

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

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

现在将转换为:

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

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

注意,此时源代码无需引入 React 即可使用 JSX 了!(但仍需引入 React,以便使用 React 提供的 Hook 或其他导出。)

此变化与所有现有 JSX 代码兼容,所以你无需修改组件。如果你对此感兴趣,你可以查看 RFC[6] 了解全新转换工作的具体细节。

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

如何升级至新的转换

如果你还没准备好升级为全新的 JSX 转换,或者你正在为其他库使用 JSX,请不要担心,旧的转换不会被移除,并将继续支持。

如果你想升级,你需要准备两件事:

  • 支持新转换的 React 版本(目前,只有 React 17 的 RC 版本[7] 支持它,但是 React 17.0 发布后,我们计划针对 0.14.x、15.x 以及 16.x 做兼容。)
  • 一个兼容新转换的编译器(请看下面关于不同工具的说明)。

由于新的 JSX 转换不依赖 React 环境,我们准备了一个自动脚本[8],用于移除你代码中不必要的引入。

Create React App

Create React App 已对其做兼容支持[9],并将在 即将发布的 v4.0 版本[10]中提供,该版本处于测试阶段。

Next.js

Next.js 的 v9.5.3[11]+ 会使用新的转换来兼容 React 版本。

Gatsby

Gatsby 的 v2.24.5[12]+ 会使用新的转换来兼容 React 版本。

注意
如果你在 Gatsby 中遇到 error[13],请升级至 17.0.0-rc.2,运行 npm update 解决此问题。

手动配置 Babel

Babel 的 v7.9.0[14] 及以上版本可支持全新的 JSX 转换。

首先,你需要更新至最新版本的 Babel 和 transform 插件。

如果你使用的是 @babel/plugin-transform-react-jsx

# npm 用户
npm update @babel/core @babel/plugin-transform-react-jsx

# yarn 用户
yarn upgrade @babel/core @babel/plugin-transform-react-jsx

如果你使用的是 @babel/preset-react

# npm 用户
npm update @babel/core @babel/preset-react

# yarn 用户
yarn upgrade @babel/core @babel/preset-react

目前,旧的转换的默认选项为("runtime": "classic")。如需启用新的转换,你可以使用 {"runtime": "automatic"} 作为 @babel/plugin-transform-react-jsx@babel/preset-react 的选项:

// 如果你使用的是 @babel/preset-react
{
  "presets": [
    ["@babel/preset-react", {
      "runtime": "automatic"
    }]
  ]
}

// 如果你使用的是 @babel/plugin-transform-react-jsx
{
  "plugins": [
    ["@babel/plugin-transform-react-jsx", {
      "runtime": "automatic"
    }]
  ]
}

从 Babel 8 开始,"automatic" 会将两个插件默认集成在 rumtime 中。欲了解更多信息,请查阅 Babel 文档中的 @babel/plugin-transform-react-jsx[15] 以及 @babel/preset-react[16]

注意
如果你在使用 JSX 时,使用 React 以外的库,你可以使用 `importSource` 选项[17]从该库中引入 — 前提是它提供了必要的入口。或者你可以继续使用经典的转换,它会继续被支持。

ESLint

如果你正在使用 eslint-plugin-react[18],其中的 react/jsx-uses-reactreact/react-in-jsx-scope 规则将不再需要,可以关闭它们或者删除。

{
  // ...
  "rules": {
    // ...
    "react/jsx-uses-react": "off",
    "react/react-in-jsx-scope": "off"
  }
}

TypeScript

TypeScript 将在 v4.1 beta[19] 版本中支持新的 JSX 转换。

Flow

Flow 将在 v0.126.0[20] 中支持新的 JSX 转换。

移除未使用的 React 引入

因为新的 JSX 转换会自动引入必要的 react/jsx-runtime 函数,因此当你使用 JSX 时,将无需再引入 React。将可能会导致你代码中有未使用到的 React 引入。保留它们也无伤大雅,但如果你想删除它们,我们建议运行 “codemod”[21] 脚本来自动删除它们:

cd your_project
npx react-codemod update-react-imports
注意:
如果你在运行 codemod 时出现错误,请尝试使用 npx react-codemod update-react-imports 选择不同的 JavaScript 环境。尤其是选择 "JavaScript with Flow" 时,即使你未使用 Flow,也可以选择它,因为它比 JavaScript 支持更新的语法。如果遇到问题,请 告知我们[22]
请注意,codemod 的输出可能与你的代码风格并不匹配,因此你可能需要再 codemod 完成后运行 Prettier[23] 以保证格式一致。

运行 codemod 会执行如下操作:

  • 升级到新的 JSX 转换,删除所有未使用的 React 引入。
  • 改变所有 React 的默认引入将被改为解构命名引入(例如,import React from "react" 会变成 import { useState } from "react"),这将成为未来开发的首选风格。codemod 不会 影响现有的命名空间引入方式(即 import * as React from "react"),这也是一种有效的风格,默认的引入将在 React 17 中继续工作,但从长远来看,我们建议尽量不使用它们。

示例:

import React from 'react';

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

将被替换为

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

如果你使用了 React 的其他导出 — 比如 Hook,那么 codemod 将把它们转换为具名导入。

示例:

import React from 'react';

function App() {
  const [text, useText] = React.useState('Hello World');
  return <h1>{text}</h1>;
}

会被替换为

import { useState } from 'react';

function App() {
  const [text, useText] = useState('Hello World');
  return <h1>{text}</h1>;
}

除了清理未使用的引入外,此工具还可帮你为未来 React 主要版本(不是 React 17 版本)做铺垫,该版本将支持 ES 模块,并且没有默认导出。

鸣谢

我们要感谢 Babel,TypeScript,Create React App,Next.js,Gatsby,ESLint 以及 Flow 的主要维护者为新 JSX 转换提供的实现和整合。我们还要感谢 React 社区对相关 RFC[24] 提供的反馈和讨论。

关注我们

我们将为你带来最前沿的前端资讯。

参考资料

[1] 并未包含新特性: /blog/2020/08/10/react-v17-rc.html

[2] Babel: https://babeljs.io/blog/2020/03/16/7.9.0#a-new-jsx-transform-11154httpsgithubcombabelbabelpull11154

[3] React 17 的 RC 版本: /blog/2020/08/10/react-v17-rc.html

[4] 下方: #how-to-upgrade-to-the-new-jsx-transform

[5] 性能优化和简化: https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#motivation

[6] RFC: https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#detailed-design

[7] React 17 的 RC 版本: /blog/2020/08/10/react-v17-rc.html

[8] 我们准备了一个自动脚本: #removing-unused-react-imports

[9] 对其做兼容支持: https://github.com/facebook/create-react-app/pull/9645

[10] 即将发布的 v4.0 版本: https://gist.github.com/iansu/282dbe3d722bd7231fa3224c0f403fa1

[11] v9.5.3: https://github.com/vercel/next.js/releases/tag/v9.5.3

[12] v2.24.5: https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby/CHANGELOG.md#22452-2020-08-28

[13] Gatsby 中遇到 error: https://github.com/gatsbyjs/gatsby/issues/26979

[14] v7.9.0: https://babeljs.io/blog/2020/03/16/7.9.0

[15] @babel/plugin-transform-react-jsx: https://babeljs.io/docs/en/babel-plugin-transform-react-jsx

[16] @babel/preset-react: https://babeljs.io/docs/en/babel-preset-react

[17] importSource 选项: https://babeljs.io/docs/en/babel-preset-react#importsource

[18] eslint-plugin-react: https://github.com/yannickcr/eslint-plugin-react

[19] v4.1 beta: https://devblogs.microsoft.com/typescript/announcing-typescript-4-1-beta/#jsx-factories

[20] v0.126.0: https://github.com/facebook/flow/releases/tag/v0.126.0

[21] “codemod”: https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb

[22] 告知我们: https://github.com/reactjs/react-codemod/issues

[23] Prettier: https://prettier.io/

[24] RFC: https://github.com/reactjs/rfcs/pull/107

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39592137/article/details/110220166

智能推荐

2016-01-05 y原始数据(3)-程序员宅基地

//// MyDocViewController_zhen.m// Patient//// Created by wangjian on 15/12/4.// Copyright 2015年 ShangYu. All rights reserved.//#import "MyDocViewController_zhen.h"#import "...

python识别图片文字_使用百度文字识别API进行图片中文字的识别-程序员宅基地

今天,为了满足我女朋友作业的需求,我使用Python制作了一个图片转文字的小应用。(当然,下面导入模块的问题我就不多说了,是非常简单的)一. 申请百度通用文字识别接口。1.先在百度AI开放平台注册账号(点击这里进入百度智能云)。一般使用百度账号即可。2.注册成功后登录,在右侧菜单栏中寻找文字识别功能。3.进入后创建一个新的应用,并按要求填写好应用名称等信息后,立即创建即可。4.创建完成后,我们可以..._python百度api识别图片上的字

python语言:烟花效果实现_python实现烟花_无水先生的博客-程序员宅基地

python烟花import tkinter as tkfrom PIL import Image, ImageTkfrom time import time, sleepfrom random import choice, uniform, randintfrom math import sin, cos, radianscolors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen',_python实现烟花

Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)-程序员宅基地

应用场景前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略:自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的成功率。自定义错误处理逻辑:如果业务上,消息处理失败之后有明确的降级逻辑可以弥补的,可以采用这种方式,但是2.0.x版本有Bug,2.1.x版本修复。那么如果代码本身存在逻辑错误,无论重试多少次...

[BUG] 安卓盒子rk3399-mid OFFLine 或 DISCONNECTED_rk3399 mid-程序员宅基地

安卓盒子一直正常使用,偶然二天,就出现了 这样的情况 。第一天 调试经过测试, 换数据线, 重启电脑,升级adb . 换设备adb kill-server 和 adb start-server ,都不行。重置了盒子也不可以 。第二天 调试早上拿了一台自己的有开发环境的笔记本,插上数据线,立马就识别到了 。查到电脑上面,就识别了 。但是,出去开会回来又识别..._rk3399 mid

CDMA简介_vivado地址不连续-程序员宅基地

CDMA 目录• CDMA专业定义 • CDMA技术背景 • CDMA技术标准 • CDMA所具优势 • CDMA技术持点 • 移动通讯技术分类 • 关于GSM与CDMA手机辐射问题 CDMA专业定义 CDMA是码分多址的英文缩写(Code Division Multiple Access),它是在_vivado地址不连续

随便推点

blockly研究(一)自定义菜单栏_blockly c++-程序员宅基地

由于最近一直比较忙,所以没有更新博客由于博主做的项目不需要舞台与模拟器的概念,所以在技术选型上也就没有选择s3等其他的图形化编程框架今天给大家带来的是blockly自定义左侧菜单栏、以及交互效果如何去加首先先看一下效果:修改之前: 修改之后:首先我们得了解blockly是什么?以及他提供的一些api、怎么用?谷歌blockly官网blockly源码某书上看到..._blockly c++

【Java系列】:Object类_Baridhu的博客-程序员宅基地

本文介绍了Object类常用的方法:equals,toString,hashCode,finalize。其中重点介绍了“==”和“equals"的区别。

J-Hi Java快速开发平台-程序员宅基地

 J-HI是一款JAVA WEB应用软件快速开发开源平台,主要服务于软件企业和传统行业企事业单位信息中心的开发人员,为他们提供一套完整的一站式的JAVA WEB应用软件快速开发解决方案。_j-hi

oracle转换文本文件,Oracle导出txt文本文件_我想有一只狗的博客-程序员宅基地

对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如:select taskindex||'|'||commonindex||'|'||tasktype||'|'||to_number(to_char(sysdate,'YYYYMMDD')) from ssrv_sendsms_task;spool常用的设置 set colsep' ';//域输出分隔符 set ech...

adb命令大全_adb命令行-程序员宅基地

本文链接:https://blog.csdn.net/MzTestor/article/details/79310900一、前言 1、介绍: 学习前是不是得先看看 adb 具体是啥东西,好吧,网上一大堆,截取了部分如下:SDK的Tools文件夹下包含着Android模拟器操作的重要命令adb,adb的全称为(Android Debug Bridge就是调试桥的作用。通过a..._adb命令行

anaconda3 mysql_如何在anaconda3 Jupyter中使用PyMySQL操作数据库-程序员宅基地

有很多开源的库可以用来与MySQL做交互,其中最有名的是PyMySQL,python2和3版本都支持,且Anaconda中已经自带。本文使用的环境是python3、腾讯云(Linux CENTOS7)。1.在shell中进入MySQLshell> mysql -uroot -p提示Password,输入临时密码即可进入数据库(密码不会显示)。2.新建一个数据库(数据库名称abc数据表名称sh..._如何在anaconda3中操作mysql数据库

推荐文章

热门文章

相关标签