当前位置: 首页 > 科技观察

React17中新的JSX增强

时间:2023-03-13 13:32:43 科技观察

我今天分享的是React17中JSX的新特性。本文主要介绍React17中JSX的新特性以及为什么你应该关心它。React17的发布是独一无二的。您几乎不会注意到任何新功能。但是,您可以找到一些对React核心产生重大影响的改进。在这些改进中,JJSX的变化非常明显。本文将讨论对JSX的改进、它们背后的动机,以及每个开发人员在升级到React17之前应该了解的内容。首先,也是最重要的,让我们看看您将从外部体验到的变化。开发人员看得见的变化对React17的肤浅研究肯定会让您不知所措。真正令人兴奋的不是新特性,而是React的编译方式。为了更好地理解这一点,让我们看一下使用旧版本React的组件中JSX的编译代码。在React17之前,您可能会注意到编译版本使用React.createElement,其中React的依赖项应该在范围内可用。这就是为什么你需要在每个组件中首先导入React。现在让我们看看它在React17中是如何工作的。使用React17,您不需要为JSX导入React。我希望这提供了编译版本不需要React导入的线索。如下图所示,React17编译器从react/jsx-runtime导入了一个新的依赖项,用于处理JJSX转换。使用React17的新JSX转换因此,作为开发人员,一旦升级到React17,您就可以从组件代码中删除React导入,如果它只存在于JSX中的话。但这是唯一的变化吗,这重要吗?正如您所注意到的,从外部看效果似乎微不足道。当您的代码库中有更多React组件时,了解整体效果会发挥作用很重要。为了更好地理解影响,让我们看看为什么移除对React.createElement的依赖对JSX很重要。删除createElement的好处首先,总结一下,有几点:减少捆绑文件的大小减少动态属性查询Props、Args和KeyRef相关的改进减少捆绑文件的大小首先,一个可以想到的事情of是:减少打包文件的大小。随着React导入的移除,编译后的包输出的大小会稍微变小。我希望这变得显而易见,因为我们需要删除每个组件中的React导入,编译器将其替换为React中的子模块,如下所示:减少动态属性查找由于React17不再为JSX使用React.createElement,因此不再需要动态属性查找。如前所述,您可以在前端代码库的编译版本中找到它。但是,这里的性能改进非常小,您几乎不会注意到这里的差异。这是因为现代JavaScript引擎大多针对动态属性查询进行了优化。与Props、Args和KeyRef相关的改进好吧,我只是想告诉你,这些改进存在于React17中。但是,这些改进太技术化了,无法详细说明。如果您有兴趣,可以在动机部分的create-element-changes中阅读它们。你需要React17吗?如果你在JSX之外创建动态元素,你仍然需要React.createElement方法。如果你需要在代码中手动创建元素,你应该继续使用React.createElement。还有,你可能会想,我们不是还在用react/jsx-runtime来代替React17的React.createElement的JSX吗,这些问题是不是都解决了?简而言之,是的!当我们查看新的react/jsx-runtime时,引入了一些设计更改以避免React.createElement方法中的瓶颈。引入其中一些更改是为了在未来的体系结构中发展。您可以在详细设计部分下的相同链接create-element-changes中阅读这些内容。链接:https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#motivation你还应该知道什么?好吧,它只不过是一个弃用通知。在React17JSX更改中,有一些您应该注意的通知。废除“模块模式”组件constFoo=(props)=>{return{onClick(){//...}render(){return;}}};但是,通过执行下面提到的两个更改,升级会更容易。使用函数表达式而不是箭头函数。添加带有isReactComponent的原型,告诉React区分类组件和函数组件结果如下所示。functionFoo(props){return{onClick(){//...}render(){return;}}};Foo.prototype={isReactComponent:true};同样,也会有下面的弃用通知。弃用函数组件上的defaultProps。丢弃对象中的传播密钥。过时的字符串引用(并删除生产mode_owner字段)。您可以在详细设计部分的同一链接create-element-changes中阅读有关它们的信息,链接:https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes。md#motivation但是,这些警告不会阻止您迁移到React17。您还有时间在下一个主要版本之前升级它们。总结JSX转换的好消息是它向后兼容,升级到React17的变化很小。但我觉得影响可能会更好,因为目前的改进在现实世界中几乎看不到。但是,了解这些改进中的大部分将有助于加快未来版本的发布也很重要。因此,升级到React17将使您的代码库面向未来。而且你不需要提醒自己将React导入保存在JSX文件中。此外,如果您要从旧版本升级,则值得参考弃用通知以避免将来出现任何麻烦。