React Native 0.71正式版發(fā)布,Ts成為默認(rèn)開發(fā)語言

2023年1月14日,React Native官方發(fā)布了0.71版本,此版本帶來了很多重磅和突破性的更新,同時,感謝70多位貢獻(xiàn)者帶來的了1000多次提交。下面是0.71版本帶來的主要更新內(nèi)容:

  • 默認(rèn)開發(fā)語言為TypeScript
  • 使用Flexbox Gap使布局更加簡單
  • 開發(fā)者體驗提升
  • 有關(guān)新架構(gòu)內(nèi)容的升級
  • 引入的部分web開發(fā)標(biāo)準(zhǔn)的屬性,樣式及事件
  • 恢復(fù)PropTypes
  • 其他更新

TypeScript成為默認(rèn)開發(fā)語言

從0.71版本開始,我們將React Native的默認(rèn)開發(fā)語言從JavaScript變成TypeScript,在新建的項目的時候會有所體現(xiàn),與此同時項目根目錄會增加一個tsconfig.json文件用于輔助開發(fā)者編寫語法正確的Ts代碼。另外0.71版本因本身已支持ts,所以不需要再package.json文件中添加@types/react-native依賴。

有關(guān)TypeScript,我們可以將它理解為是增強(qiáng)版JavaScript。TypeScript 由微軟開發(fā)的自由和開源的編程語言,是 JavaScript 的一個超集,支持 ECMAScript 6 標(biāo)準(zhǔn)(ES6 教程)。TypeScript 設(shè)計的初衷就是為了應(yīng)對大型應(yīng)用開發(fā),它可以編譯成純 JavaScript,最終運(yùn)行在瀏覽器環(huán)境中。

Flexbox Gap讓布局更加簡單

此版本引入了web開發(fā)標(biāo)準(zhǔn)的屬性gap、rowGap、columnGap,使用這些屬性可以很方便的設(shè)置組件間隔。并且,在未來的版本中,我們還會增加百分比布局。
那gap、rowGap、columnGap屬性究竟有什么用呢?比如設(shè)置組件之間間隔為margin: 10,其效果如下圖。

image.png

margin的作用就是用在所有子元素的外邊緣,并且在Flexbox布局中下不會失效,主要用于設(shè)置元素外部的間距。同時,我們還可以通過設(shè)置非均勻邊距、在父元素上使用負(fù)邊距等來使得布局開發(fā)變得更加容易。

比如,使用gap屬性,我們還可以在容器上設(shè)置gap: 10來實現(xiàn)卡片內(nèi)部邊距,如下圖所示:

image.png

如果想要了解更多Flexbox gaps的內(nèi)容,可以參考 blogpost from CSS Tricks。

Web屬性支持

此版本添加了很多Web屬性的支持,使得React Native的api和Web平保持一致,比如 accessibility, behavior和style props等。這些新屬性都是是附加的,因此對于等效的可訪問性、行為或樣式,不會出現(xiàn)什么異常影響,比如Image和TextInput組件。

Accessibility

比如,我們引入ARIA屬性作為React Native的基礎(chǔ)屬性。事實上,這些屬性存在我們幾乎所有的React Native組件中,比如aria-label, aria-labelledby,aria-modal, id, aria-busy, aria-checked, aria-disabled, aria-expanded, aria-selected, aria-valuemax, aria-valuemin, aria-valuenow, and aria-valuetext。

并且,我們即將在未來的版本中引入其他一些行為屬性,比如aria-hidden, aria-live, role和 tabIndex等。如果想要了解更多關(guān)于Accessibility的內(nèi)容,可以打開Web Props umbrella issue。

Specific Behavior

未來,為了對齊Web標(biāo)準(zhǔn),我們還會再基礎(chǔ)組件中引入更多的可訪問性、行為或樣式等屬性,比如Image和TextInput組件。

  • Image: alt, tintColor, crossOrigin, height, referrerPolicy, src, srcSet, and width.
  • TextInput: autoComplete, enterKeyHint, inputMode, readOnly, and rows.

Styles

為了與Web平臺的css樣式保持一致,我們在React Native中添加了如下的樣式支持。

  • aspectRatio:現(xiàn)在支持字符串類型的值
  • fontVariant:現(xiàn)在支持空格分隔的字符串值
  • fontWeight:現(xiàn)在支持?jǐn)?shù)值類型的值
  • transform:現(xiàn)在支持字符串類型的值

同時,以下樣式屬性也被添加到現(xiàn)有React Native樣式中。

  • objectFit
  • pointerEvents
  • userSelect
  • verticalAlign

想要了解更多的Styles屬性,可以參考Web Styles umbrella issue。

Events

最后,我們還添加了PointerEvents可選擇項,一旦開啟這一特性,處理View視圖上的以下事件時將支持懸停。

  • onPointerOver, onPointerOut
  • onPointerEnter, onPointerLeave

當(dāng)然,上面的事件對于 React Native的Pressability也同樣適用。如果要開啟這一特性,需要將下面的內(nèi)容設(shè)置為true。

import ReactNativeFeatureFlags from 'react-native/Libraries/ReactNative/ReactNativeFeatureFlags';

// enable the JS-side of the w3c PointerEvent implementation
ReactNativeFeatureFlags.shouldEmitW3CPointerEvents = () => true;

// enable hover events in Pressibility to be backed by the PointerEvent implementation.
// shouldEmitW3CPointerEvents should also be true
ReactNativeFeatureFlags.shouldPressibilityUseW3CPointerEventsForHover =
  () => true;

恢復(fù)PropTypes

React Native的prop,如ViewPropTypes和Text.propTypes,在0.66版本中被棄用,如果直接使用它們會輸出過時的警告,并且在0.68版本中我們移除了對prop的支持,如果在0.68及以上版本中使用它將會遇到錯誤。

不過,最近的一些調(diào)查讓我們意識到棄用這一特性是錯誤的。首先,棄用警告并不總是可行的,這導(dǎo)致人們忽視了它們(比如issue one, issue two) 。其次,LogBox.ignoreLogs錯誤地過濾了棄用警告。不過,現(xiàn)在這兩個問題都已經(jīng)得到修復(fù)。

因此,在這個版本中,我們將重新添加了React Native的propTypes,以便開發(fā)者更容易的升級和遷移代碼。同時,我們在0.71版本中更新了之前棄用的deprecated-react-native-prop-types插件包。不過,我們?nèi)匀挥媱澰谖磥項売貌h除props。我們期望當(dāng)我們重新移除時,社區(qū)不會出現(xiàn)之前那么多的問題。

開發(fā)者體驗改善

React DevTools

在這個版本中,我們增加了兩個比較好用的調(diào)試代碼工具,即點(diǎn)擊元素檢查和組件高亮。 這對于我們開發(fā)中調(diào)試布局頁面來說更加友好,也更加容易讓我們定位組件元素,下面是演示圖。


Hermes

在0.70版本中,我們將Hermes作為了React Native的默認(rèn)引擎。在0.71版本中,我們對Hermes引擎做了進(jìn)一步的升級,包括如下:

  • JSON.parse性能提升30%
  • 增加對String, TypedArray, and Array屬性at()的支持
  • 在Metro中通過網(wǎng)絡(luò)實現(xiàn)加載source maps

新架構(gòu)

當(dāng)然,在這個版本中,我們也帶來了諸多關(guān)于新架構(gòu)體驗及性能方面的升級。

  • 大幅度減少了Android平臺的編譯時間,并解決了諸多Window平臺的編譯問題
  • 現(xiàn)在可以啟用新體系結(jié)構(gòu),而無需在應(yīng)用程序中添加任何C++代碼,并且CLI應(yīng)用程序模板已清除所有C++代碼和CMake文件。
  • 在iOS平臺設(shè)置開啟新架構(gòu)支持更加簡介
  • 在iOS平臺,在podspec中新增了install_module_dependencies函數(shù)用于管理所有需要的依賴項。

其他重大修復(fù)

  • 更好的堆棧幀管理:我們已經(jīng)更新了React Native的內(nèi)部幀列表,因此調(diào)用LogBox將將會更加頻繁,可以幫助開發(fā)者更快地調(diào)試問題。
  • 構(gòu)建時間改進(jìn):我們將assets部分代碼遷移到Maven Central中,以改善Hermes在當(dāng)前和新架構(gòu)下的構(gòu)建時間(iOS和Android)。
  • Android模板改進(jìn):Android模板被清理,現(xiàn)在完全依賴于React Native Gradle插件,開發(fā)者可以直接在React Native Gradle Plugin中找到配置說明。

其他重大更新

除了上面的介紹的更新外,此版本還帶來了如下一些重大更新。

  • 更改控制臺日志:現(xiàn)在直接使用LogBox.ignoreLog不再過濾控制臺日志,這意味著會在控制臺中看到LogBox中靜默的日志。有關(guān)更多細(xì)節(jié),請參閱LogBox.isIgnoredLog() 。
  • 移除AsyncStorage和MaskedViewIOS:這些組件在0.59版本已被棄用,所以是時候完全刪除它們了。對于替代方案,請查看React Native社區(qū)的替換方案。
  • JSCRuntime移到react-jsc: react-jsi現(xiàn)在分為react-jsc和react-jsi兩部分。如果需要使用JSCRuntime,只需要添加react-jsc作為依賴項即可。

參考文檔:https://reactnative.dev/blog/2023/01/12/version-071

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容