React 17中的新JSX增强功能

React 17是独特的。您几乎不会注意到任何新功能。但是,您可以找到对React核心的一些有重大影响的改进。其中,对JSX的更改非常引人注目。

本文将讨论JSX的改进,背后的动机以及每个开发人员在升级到React 17之前应了解的知识。

首先,让我们看看您将从外部经历的变化。

开发人员的可见变化

对React 17进行一次表面检查肯定会让您印象深刻。真正令人兴奋的东西不是新功能,而是React编译的方式。

为了更好地理解这些内容,我们来看一下使用旧版React的组件中JSX的编译代码。


在React 17之前

您可能会注意到编译后的版本使用React.createElement,其中React依赖项在范围中应该可用。这就是为什么您需要在每个组件中首先导入React的原因。

现在让我们看一下它如何与React 17一起工作。

使用React 17,您不需要将React导入JSX

我希望可以提供一个提示,说明编译后的版本不需要React导入。如下图所示,React 17编译器从导入一个新的依赖项react/jsx-runtime,该依赖项处理JSX转换。


带有React 17的新JSX转换

因此,作为开发人员,一旦升级到React 17,就可以从组件代码中删除React导入(如果仅适用于JSX)。

但这是唯一的变化吗?

正如您已经注意到的那样,从外部看,效果似乎无关紧要。

重要的是要了解,当代码库中有更多React组件时,整体效果将是可见的

为了更好地理解其影响,让我们看一下为什么要删除与React.createElementJSX有关的依赖关系。

移除 React.createElement带来的好处

减小包装尺寸

随着React import的移除,编译后的捆绑输出的大小将变得稍小。我希望它变得显而易见,因为我们需要从每个组件中删除React导入,在该组件中编译器将它替换为React中的子模块,如下所示。

import {jsx as _jsx} from 'react/jsx-runtime';

共享组件变得更加容易

听起来可能并不多,但是每当将React组件从React项目共享到Bit.dev或将组件发布到NPM时,您始终需要确保react未将其配置为,dependency而是配置为peerDependency。这样做是为了减小组件的捆绑大小,并防止在不同版本下多次安装React的情况(在应用程序中使用共享组件时)。

React在Bit.dev上共享的组件

减少动态属性查找

由于React 17不再将React.createElement用于JSX,因此无需进行动态属性查找。如前所述,您可以在前端代码库的编译版本中找到它。

但是,此处的性能提升非常小,您几乎不会注意到其中的区别

这是因为现代JavaScript引擎主要针对动态属性查找进行了优化。

那么我们需要带有React 17的React.createElement吗?

React.createElement如果要在JSX之外创建动态元素,则仍然需要该方法。

如果需要在代码中手动创建元素,则应继续使用React.createElement

此外,您可能想知道,我们是否仍在使用react/jsx-runtimeJSX代替React.createElementReact 17,并且这些问题是否已解决?简而言之,是的!

当我们查看新功能时,react/jsx-runtime它将带来一些设计更改,以避免React.createElement方法中出现的瓶颈。引入了其中的一些更改以发展未来的体系结构。

作为开发人员,我还应该知道什么?

好吧,这不过是弃用通知而已。在React 17 JSX的更改中,您应该注意到一些注意事项。

弃用“module pattern”组件

const Foo = (props) => {
  return {
    onClick() {
      //...
    }
    render() {
      return <div onClick={this.onClick.bind(this)} />;
    }
  }
};

但是,通过执行下面提到的两个更改,升级起来会更容易。

  1. 使用函数表达式而不是箭头函数。
  2. 添加一个带有isReactComponent的prototype,以告知React区分类和函数组件。

结果如下。

function Foo(props) {
  return {
    onClick() {
      //...
    }
    render() {
      return <div onClick={this.onClick.bind(this)} />;
    }
  }
};
Foo.prototype = { isReactComponent: true};

同样,将有的弃用通知;

  • 不赞成使用defaultProps功能组件。
  • 从对象弃用散布密钥。
  • 弃用字符串引用(并删除生产模式_owner字段)。

但是,这些警告并不是迁移到React 17的障碍。您也将有时间直到下一个主要版本进行升级。

结论

JSX转换的好消息是它向后兼容,只需很少的更改即可升级到React17。但是我觉得影响可能会更好,因为当前的改进在现实世界中几乎是看不到的。

但是,了解这些改进中的大多数将有助于加快将来的发布速度也很重要。因此,升级到React 17将使您的代码库成为未来的证明。而且您不需要提醒自己将React import保留在JSX文件中。

此外,如果您从旧版本升级,则值得参考弃用声明,以免将来出现麻烦。

参考

New JSX Enhancements in React 17

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容