React 17中的新JSX增強(qiáng)功能

React 17是獨(dú)特的。您幾乎不會(huì)注意到任何新功能夷家。但是蒸其,您可以找到對(duì)React核心的一些有重大影響的改進(jìn)。其中库快,對(duì)JSX的更改非常引人注目摸袁。

本文將討論JSX的改進(jìn),背后的動(dòng)機(jī)以及每個(gè)開發(fā)人員在升級(jí)到React 17之前應(yīng)了解的知識(shí)义屏。

首先靠汁,讓我們看看您將從外部經(jīng)歷的變化。

開發(fā)人員的可見變化

對(duì)React 17進(jìn)行一次表面檢查肯定會(huì)讓您印象深刻闽铐。真正令人興奮的東西不是新功能蝶怔,而是React編譯的方式。

為了更好地理解這些內(nèi)容兄墅,我們來看一下使用舊版React的組件中JSX的編譯代碼踢星。


在React 17之前

您可能會(huì)注意到編譯后的版本使用React.createElement,其中React依賴項(xiàng)在范圍中應(yīng)該可用察迟。這就是為什么您需要在每個(gè)組件中首先導(dǎo)入React的原因斩狱。

現(xiàn)在讓我們看一下它如何與React 17一起工作。

使用React 17扎瓶,您不需要將React導(dǎo)入JSX

我希望可以提供一個(gè)提示所踊,說明編譯后的版本不需要React導(dǎo)入。如下圖所示概荷,React 17編譯器從導(dǎo)入一個(gè)新的依賴項(xiàng)react/jsx-runtime秕岛,該依賴項(xiàng)處理JSX轉(zhuǎn)換。


帶有React 17的新JSX轉(zhuǎn)換

因此,作為開發(fā)人員继薛,一旦升級(jí)到React 17修壕,就可以從組件代碼中刪除React導(dǎo)入(如果僅適用于JSX)。

但這是唯一的變化嗎遏考?

正如您已經(jīng)注意到的那樣慈鸠,從外部看,效果似乎無關(guān)緊要灌具。

重要的是要了解青团,當(dāng)代碼庫中有更多React組件時(shí),整體效果將是可見的

為了更好地理解其影響咖楣,讓我們看一下為什么要?jiǎng)h除與React.createElementJSX有關(guān)的依賴關(guān)系督笆。

移除 React.createElement帶來的好處

減小包裝尺寸

隨著React import的移除,編譯后的捆綁輸出的大小將變得稍小诱贿。我希望它變得顯而易見娃肿,因?yàn)槲覀冃枰獜拿總€(gè)組件中刪除React導(dǎo)入,在該組件中編譯器將它替換為React中的子模塊珠十,如下所示料扰。

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

共享組件變得更加容易

聽起來可能并不多,但是每當(dāng)將React組件從React項(xiàng)目共享到Bit.dev或?qū)⒔M件發(fā)布到NPM時(shí)宵睦,您始終需要確保react未將其配置為记罚,dependency而是配置為peerDependency。這樣做是為了減小組件的捆綁大小壳嚎,并防止在不同版本下多次安裝React的情況(在應(yīng)用程序中使用共享組件時(shí))桐智。

React在Bit.dev上共享的組件

減少動(dòng)態(tài)屬性查找

由于React 17不再將React.createElement用于JSX,因此無需進(jìn)行動(dòng)態(tài)屬性查找烟馅。如前所述说庭,您可以在前端代碼庫的編譯版本中找到它。

但是郑趁,此處的性能提升非常小刊驴,您幾乎不會(huì)注意到其中的區(qū)別

這是因?yàn)楝F(xiàn)代JavaScript引擎主要針對(duì)動(dòng)態(tài)屬性查找進(jìn)行了優(yōu)化。

那么我們需要帶有React 17的React.createElement嗎寡润?

React.createElement如果要在JSX之外創(chuàng)建動(dòng)態(tài)元素捆憎,則仍然需要該方法。

如果需要在代碼中手動(dòng)創(chuàng)建元素梭纹,則應(yīng)繼續(xù)使用React.createElement

此外躲惰,您可能想知道,我們是否仍在使用react/jsx-runtimeJSX代替React.createElementReact 17变抽,并且這些問題是否已解決础拨?簡而言之氮块,是的!

當(dāng)我們查看新功能時(shí)诡宗,react/jsx-runtime它將帶來一些設(shè)計(jì)更改滔蝉,以避免React.createElement方法中出現(xiàn)的瓶頸。引入了其中的一些更改以發(fā)展未來的體系結(jié)構(gòu)塔沃。

作為開發(fā)人員蝠引,我還應(yīng)該知道什么?

好吧芳悲,這不過是棄用通知而已立肘。在React 17 JSX的更改中,您應(yīng)該注意到一些注意事項(xiàng)名扛。

棄用“module pattern”組件

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

但是,通過執(zhí)行下面提到的兩個(gè)更改茧痒,升級(jí)起來會(huì)更容易肮韧。

  1. 使用函數(shù)表達(dá)式而不是箭頭函數(shù)。
  2. 添加一個(gè)帶有isReactComponent的prototype旺订,以告知React區(qū)分類和函數(shù)組件弄企。

結(jié)果如下。

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

同樣区拳,將有的棄用通知拘领;

  • 不贊成使用defaultProps功能組件。
  • 從對(duì)象棄用散布密鑰樱调。
  • 棄用字符串引用(并刪除生產(chǎn)模式_owner字段)约素。

但是,這些警告并不是遷移到React 17的障礙笆凌。您也將有時(shí)間直到下一個(gè)主要版本進(jìn)行升級(jí)圣猎。

結(jié)論

JSX轉(zhuǎn)換的好消息是它向后兼容,只需很少的更改即可升級(jí)到React17乞而。但是我覺得影響可能會(huì)更好送悔,因?yàn)楫?dāng)前的改進(jìn)在現(xiàn)實(shí)世界中幾乎是看不到的。

但是爪模,了解這些改進(jìn)中的大多數(shù)將有助于加快將來的發(fā)布速度也很重要欠啤。因此,升級(jí)到React 17將使您的代碼庫成為未來的證明屋灌。而且您不需要提醒自己將React import保留在JSX文件中洁段。

此外,如果您從舊版本升級(jí)声滥,則值得參考棄用聲明眉撵,以免將來出現(xiàn)麻煩侦香。

參考

New JSX Enhancements in React 17

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纽疟,隨后出現(xiàn)的幾起案子罐韩,更是在濱河造成了極大的恐慌,老刑警劉巖污朽,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件散吵,死亡現(xiàn)場離奇詭異,居然都是意外死亡蟆肆,警方通過查閱死者的電腦和手機(jī)矾睦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炎功,“玉大人枚冗,你說我怎么就攤上這事∩咚穑” “怎么了赁温?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淤齐。 經(jīng)常有香客問我股囊,道長,這世上最難降的妖魔是什么更啄? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任稚疹,我火速辦了婚禮,結(jié)果婚禮上祭务,老公的妹妹穿的比我還像新娘内狗。我一直安慰自己,他們只是感情好待牵,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布其屏。 她就那樣靜靜地躺著,像睡著了一般缨该。 火紅的嫁衣襯著肌膚如雪偎行。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天贰拿,我揣著相機(jī)與錄音蛤袒,去河邊找鬼。 笑死膨更,一個(gè)胖子當(dāng)著我的面吹牛妙真,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荚守,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼珍德,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼练般!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锈候,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤薄料,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泵琳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摄职,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年获列,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谷市。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡击孩,死狀恐怖迫悠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巩梢,我是刑警寧澤及皂,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站且改,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏板驳。R本人自食惡果不足惜又跛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望若治。 院中可真熱鬧慨蓝,春花似錦、人聲如沸端幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婆跑。三九已至此熬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滑进,已是汗流浹背犀忱。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扶关,地道東北人阴汇。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像节槐,于是被迫代替她去往敵國和親搀庶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拐纱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容