React Strict DOM:React Native 通用应用程序的未来


Meta宣布发布了 react-strict-dom。从根本上讲,这将改变我们使用 React Native(以及在网页上使用 React)的方式。它提供了一套统一的 UI 原语,带有样式,可以在网页和移动设备上通用使用!现在,“编写一次,到处部署”对于那些在通用 RN 领域的人来说并不是新闻——r eact-native-web 已经存在多年,可以处理将 RN 的源码转换为网页· DOM· 元素。这是一种 ·RN ·优先,网页次之的方法,但是付出了一定的代价。

本文探讨了为什么react-strict-dom很重要,它与 react-native-web有何不同,以及为什么你应该感到兴奋!

背景

RN UI 在网页和移动设备上的尝试

在网页上使用 React Native 的重要里程碑的时间线


“编写一次,随处运行”的愿景早在 2015 年 React Native发布后就产生了,人们开始思考如何在网页和移动设备上都使用 RNNicolas Gallagher 在 2016 年发布了 React Native Web,作为 React NativeReact DOM 之间的互操作层,从根本上将 RN 的组件和 API转换为网页组件。 Twitter Lite使用`` React Native Web 创建了仅用于网页的组件,并且至今仍在为 Twitter 网页版提供大部分组件。

与此同时,微软的开发人员开发了 ReactXP,这是他们如何弥合 React网页版和 React Native之间 UI 层差距的方式。这个项目获得了很大的关注,并被用于 Skype。最终,ReactXP 在 2020 年被弃用。

与此同时,Expo 的开发人员也一直在致力于实现通用视觉。早在 2019 年,Expo宣布支持进入 web 测试版。从那时起,Evan Bacon 一直在努力构建 ExpoWeb 上的 RN视觉。在 2020 年,Evan 发布了如何使用 Metro 打包 web应用程序的演示。到 2022 年,Expo Router 被宣布推出,这是 ``Expo 关于如何使用遵循网页和移动标准的导航路由器来驱动web和移动设备的单一代码库的看法。Expo Router 在底层使用 Metro,统一了应用程序的网页和移动版本的打包过程。

减少 React DOM 和 React Native 之间 API 碎片化的 RFC:react-strict-dom

在 2022 年 8 月,React Native Web的创建者 Nicolas Gallagher创建了一个RFC,提议应该努力减少 React在网页上与 React Native之间的 API 差异。最初被称为“strict DOM”,这是 React DOM 的子集。

RFC的主要目标是:

  • 提高网页上的性能
  • 使 React开发人员更容易转向React Native
  • 实现更高质量的“通用”应用程序。

NicolasMeta 的其他人员(以及来自开源社区的密集讨论和建议)在一年多的时间里一直在努力推动这一工作,直到 2024 年 2 月推出。

为什么 react-strict-dom 如此重要?

虽然社区一直在努力实现通用应用程序的愿景,但直到 RSD发布之前,Meta从未“认可”这一点。Meta总是推崇“学一次,随处编写”的口号,暗示 React Native可用于多个平台,但需要为每个平台进行不同的实现。这与社区一直向着“编写一次,随处运行”的愿景相反。RSDMeta首次正式认可的跨平台UI解决方案,涵盖了网页和移动设备。

深入了解细节,这些是我认为这是一件非常重要的事情的主要原因!

Meta 本身正在使用它

当你在 Github 上查看 react-strict-dom存储库时,它提到Meta的团队已经在生产中使用 RSD,以“更快地发布功能,覆盖更多平台,并减少工程师数量”。


MetaUI的“通用”解决方案的直接投资意味着它将加速其发展。此外,如果 Meta将其用于生产中的应用程序,这意味着它将在一些最频繁使用的网站/应用程序中经过实战测试,这自然意味着它将被极度优化和可扩展化。

网页性能提升

我对 React Native Web 的一个问题是它是一个相当庞大的依赖项。如果没有启用树摇,捆绑大小接近300KB。加上 React-DOM的约 125KB,你的依赖项仅处理捆绑就有约425KB(尽管这些是未压缩的大小)。这是因为 React Native Web尝试覆盖 React Native API的整个实现,因此将不得不支持大量可能不想在网页上使用的功能。

例如,Animated API ``在 react-native-web中超过70KB的大小,并且依赖于JS层来执行动画,这比仅使用 CSS 进行动画要慢。同样,您可能不想在网页上使用 VirtualizedList、PanResponders 和其他React Native `生态系统的组件。

对于 react-native-web,转译和支持 API的负担在网页应用程序上,这可能会导致性能下降,因为诸如 SEO 排名之类的原因。

React Strict DOM采取了一种几乎相反的方法。它将兼容性和 API 的翻译负担放在了移动端,那里可以更充分地处理将 API映射到原生层功能的负担。如果有任何性能损失,这已经存在于React Native 工作方式的核心,其中JS层必须将视图、文本和其他元素委托给原生层实现。

将 React 开发人员池与 React Native 更接近

阻碍 web开发人员从 React 切换到React Native 的主要因素之一是API的重大差异。Web开发人员习惯于 DOM,这也是使 React首先具有吸引力的原因之一。您可以使用<div><input><button>和几乎任何其他在 DOM中存在的元素,几乎不需要修改(最初对人们来说最大的困惑通常是从 class切换到 className)。

React Native 显然更加受限制 - 开发人员需要熟悉一组定义良好的 API,这些 APIDOM类似,但在根本上却有很大的不同。这意味着开发人员开始使用 React Native存在着显著更大的学习曲线。

RSD接受DOM元素,并通过引入对React开发人员来说更加熟悉的API来消除开发人员从 React迁移到 React Native 时的认知负担。

不仅是 API,作为 RFC 的一部分,诸如重新设计 React Native事件循环以使其更接近 web 事件循环之类的事情也正在进行中。

关注点

原生设备上的性能

React Strict DOM中将翻译层从网页端移至原生实现可能会对移动应用程序的性能产生负面影响,这是一个潜在的关注点。React Native 在性能方面一直备受质疑,因此测试这一点并确保使用 RSD不会出现任何退化是非常重要的。

为了了解性能影响,我进行了一些初步测试,使用Flashlight渲染了一个 Flatlist中的1000个项目(手动覆盖任何虚拟化),每个项目都有一个视图和一些文本。

从我的基本测试中,我发现React NativeReact Strict DOM几乎产生了相同的结果,这是一个令人鼓舞的迹象。但是,这只是一个非常基本的测试,需要更大范围的测试,测试更多的 API 表面来更准确地了解性能影响。

对于现有的通用应用程序的实际采用计划

另一个考虑因素是现有应用程序使用 react-native-web 或普通 RN如何迁移到 react-strict-dom,而无需对其代码库进行大规模改造。理想情况下,应该有一条平稳的迁移路径,最大限度地减少手动修改的需求。

我想到的一些想法是利用代码转换来自动处理大部分迁移。这可能涉及自定义的 Babel配置或其他构建时工具,将现有的 React Native Web代码转换为与 React Strict DOM 兼容的代码。

另一种方法可能是积极地将 UI原语抽象为自定义组件,这些组件目前使用 React Native Web,但将来可以轻松地与 React Strict DOM 相当的组件进行替换。通过及早构建这个抽象层,迁移到 React Strict DOM 可能会更容易。

更现实的情况是,像 TamaguiGluestack这样的流行通用 UI 库也可以通过抽象掉 React Native WebReact Strict DOM之间的基本差异来促进迁移。由于这些库已经在RN API之上有了抽象层,所以在它们将来采用 RSD的情况下,建立在这些库之上的应用程序应该能够在几乎不修改代码库的情况下从 React Native Web 切换到 RSD

何时稳定?

这自然引出了最后一个问题。RSD 在一个多月前宣布。它仍处于实验阶段,RSD何时可以准备投入生产仍然不清楚。在为原生应用程序准备就绪之前,仍然有很大一部分 API 表面需要涵盖。

最初的RFC 是在 2022 年夏季开放的,这表明开发已经进行了大约两年。考虑到项目的范围和复杂性,如果再过一两年才完全稳定,那也不足为奇。

总结

对于 React Native社区和更广泛的React生态系统来说,这是一个令人兴奋的时刻。看到 Meta使用 RSD进入通用应用程序领域意味着由大型科技公司采纳了一个代码库可以驱动原生应用程序 + 网页的愿景。这个努力将意味着作为一个社区,我们将看到更高质量、性能更好的通用应用程序,并且未来将会有更多的工具来促进它们的构建。



喜欢的朋友记得点赞、收藏、关注哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452215.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

package.json 里的 dependencies和devDependencies区别

dependencies&#xff08;依赖的意思&#xff09;&#xff1a; 通过 --save 安装&#xff0c;是需要发布到生产环境的。 比如项目中使用react&#xff0c;那么没有这个包的依赖就会报错&#xff0c;因此把依赖写入dependencies npm install <package-name>// 缩写 np…

【含文档】基于Springboot+Vue的点餐系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于直播美颜SDK的实时美颜平台开发指南

随着直播平台的快速发展&#xff0c;用户对视频质量的要求越来越高&#xff0c;尤其是对于美颜效果的需求。为满足这一市场需求&#xff0c;基于直播美颜SDK的实时美颜平台应运而生。本文将探讨如何开发这样一个平台&#xff0c;助力开发者在激烈的竞争中脱颖而出。 一、理解美…

Dorado7 全局缓存当前登录人信息 localStorage

登录成功时赋值 com.gs.mcf.view/index.js // like12 add,20240906,全局缓存当前登录人信息var currentName view.get(#userNameLb).get(tip);if(window.localStorage){localStorage.setItem("currentName", currentName);} 使用 // like12 add,20240906,全局缓存…

软考(网工)——网络安全

文章目录 &#x1f550;网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552;Hash …

Java 入门基础篇15 - java构造方法以及认识新的关键字

一 今日目标 构造方法static关键字代码块math类package关键字import关键字 二 构造方法概述 2.1 构造方法描述 构造方法是一个特殊方法&#xff0c;作用是创建对象&#xff0c;对对象进行初始化。 ​ 如&#xff1a; 对对象中的成员进行初始化值 2.1 构造方法的特征 1、方…

集群与分布式

Cluster(集群)概述 当单独一台主机无法承载现有的用户请求量&#xff1b;或者一台主机因为单一故障导致业务中断的时候&#xff0c;就可以增加服务主机数&#xff0c;这些主机在一起提供服务&#xff0c;就叫集群&#xff0c;而用户所看到的依然是单个的主机&#xff0c;用户并…

DFS算法经典题目: Leetcode 51.N皇后

DFS算法经典题目&#xff1a; Leetcode 51.N皇后 题目详情如下 这道题如果使用暴力解法的话&#xff0c;需要对N个皇后放在每个地方都进行枚举并判断是否可行&#xff0c;时间复杂度非常之高&#xff0c;肯定是过不了的&#xff0c;所以需要使用其他解法。 根据题目可以知道每…

windows 自定义scheme协议。

浏览器打开自定义scheme参考上一篇&#xff1a;Chromium 自定义scheme协议启动过程分析c 1、注册表里面按照如下格式填写自定义scheme协议导入&#xff1a; Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\jdtest] "URL:jdtest Protocol" "URL Proto…

敏捷框架知多少?(上)

前言 在本系列上一篇博文 《敏捷Agile概述&#xff0c;何为敏捷&#xff1f;》 中&#xff0c;我们初步介绍了何为敏捷&#xff0c;敏捷提出的背景和为什么目前得到了广泛的应用。 但敏捷本身&#xff0c;更多只是一种价值观&#xff0c;是一个思想层面的指引。在组织中实际应…

JS | JS之元素偏移量 offset 系列属性详解

目录 一、offset 概述 定位父级 offsetParent 偏移量 offsetWidth offsetHeight offsetLeft offsetTop 计算页面偏移 注意事项 二、offset 与 style 区别 偏移offset 样式style 三、案例 ★ 案例&#xff1a;获取鼠标在盒子内的坐标 ★ 案例&#xff1a;模态框…

工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单(2017-2022年)

我国工信部积极推动制造业的绿色转型&#xff0c;为了表彰在绿色制造领域取得显著成绩的企业和园区&#xff0c;发布了包括绿色工厂、绿色设计产品、绿色供应链企业、绿色园区在内的一系列公示名单。 2017年-2022年工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单…

UDP协议讲解

预备知识&#xff1a; 端口号port&#xff1a; 我们在正常网络通信时&#xff0c;实际上是进程在互相通信。 我们所有的网络通信的行为&#xff0c;本质上都是进程间通信。 对双方而言&#xff0c;1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号 ip地址用来…

Linux部署redis保姆级教程

一、版本说明 Redis版本号&#xff08;本文的版本号是6.2.12&#xff09;的第二位如果是偶数&#xff0c;代表稳定版本&#xff0c;如果是奇数&#xff0c;代表非稳定版本。 所有历史版本下载地址&#xff1a;Index of /releases/ 二、基于压缩包安装&#xff08;推荐&#xff…

【中危】Oracle TNS Listener SID 可以被猜测

一、漏洞详情 Oracle 打补丁后&#xff0c;复测出一处中危漏洞&#xff1a;Oracle TNS Listener SID 可以被猜测。 可以通过暴力猜测的方法探测出Oracle TNS Listener SID&#xff0c;探测出的SID可以用于进一步探测Oracle 数据库的口令。 建议解决办法&#xff1a; 1. 不应该使…

RISC-V笔记——RVWMO基本体

1. 前言 RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;它是Release Consistency的扩展&#xff0c;因此&#xff0c;RVWMO的基本特性类似于RC模型。 2. RC模型 Release consistency(RC)的提出是基于一个观察&#xff1a;将所有同步操作用FENCE围在一…

机器学习:开启智能未来的钥匙

一、机器学习概述 机器学习作为人工智能的核心方法&#xff0c;通过分析数据中的隐藏规律&#xff0c;让计算机从中获取新的经验和知识&#xff0c;不断提升和改善自身性能&#xff0c;从而像人一样根据所学知识做出决策。 机器学习涉及概率论、统计学、微积分、代数学、算法…

Java | Leetcode Java题解之第495题提莫攻击

题目&#xff1a; 题解&#xff1a; class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int ans 0;int expired 0;for (int i 0; i < timeSeries.length; i) {if (timeSeries[i] > expired) {ans duration;} else {ans timeSerie…

go+bootstrap实现简单的注册登录和管理

概述 使用&#xff0c;gomysql实现了用户的登录&#xff0c;注册&#xff0c;和管理的简单功能&#xff0c;不同用户根据不同权限显示不同的内容 实战要求&#xff1a; 1、用户可以注册、登录&#xff1b; 2、登录后可以查看所有的注册的用户&#xff1b; 3、管理员操作对用…

Gin框架操作指南03:HTML渲染

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…