React Native 是否是一次倒行逆施?

2022-06-21 12:30:17 +08:00
 dcsuibian

我认为,Web 技术能实现出色的跨平台能力,本质上是因为浏览器提供了一个画板,而我们用 HTML 、CSS 、JS 在上面画出一个个像素,形成组件。也就是自绘

而 RN 则反过来,编译成原生组件,虽然性能提高了,但跨平台特性就又被削弱了,造成了不一致性。

这不由得让我想到了 Java 的 AWT 和 Swing ,前者就是因为要转成原生组件,所以只能使用系统组件的交集,而且不一致性严重,而后者则走了自绘的道路,性能略低,但不一致性增加。(不讨论 Java 的 GUI ,主要是看理念)

所以当我看到 RN 的做法,我一直觉得这是在开倒车。相反来说,我觉得 Flutter 的理念可能更正确点。

补充:

6534 次点击
所在节点    程序员
36 条回复
Biwood
2022-06-21 12:52:18 +08:00
可以把 RN 看作是移动端的 electron ,都是为了实现“用 Web 技术写原生应用”这件事情而已,这不叫倒行逆施,相反是一种探索和进步,如果技术上拥有可行性,为什么不做呢。至于你要不要用,取决于你的业务场景,以及你在开发成本等方面的考量。
Buges
2022-06-21 12:54:22 +08:00
你有一个误解认为 web stack 只有 web render (浏览器)这一项。确实浏览器这个 render 提供了非常棒的、多平台一致的绘图环境,也是 web stack 成熟普及的根本原因,但 web stack 远远不止这些,它是 gui 领域最先进的事实标准。如何管理状态,如何交互,如何组织样式,以及各种设计模式( MVVM 、f(state)=ui ),各种已有的生态(库和开发者)等等,这些才是 react native 这样的库把 web port 回原生平台的价值所在。
meteor957
2022-06-21 13:06:19 +08:00
react-native-skia 可以看看
ysc3839
2022-06-21 13:21:03 +08:00
个人觉得本质还是自绘与原生之争。
选自绘更多是为了不受限于原生,更加自由,但往往会让程序体积增大很多。
选原生是为了有统一的体验,尤其是在苹果这种管控力强的平台上,开发者往往更喜欢把界面弄得和系统一样,也能减小程序体积。
还有一种介于两者之间的,自绘+系统主题,比如 Qt ,但因为是模仿出来的,可能某些细节会不一致,系统更新后也可能出现问题,体积占用减不下来,又会受到系统主题的限制,不能自由设计。
dcsuibian
2022-06-21 13:25:40 +08:00
@Biwood React Native 有 React Native for Windows + macOS ,那个比较相近吧。
我关注的点不是”做一个独立的客户端“这方面,而是要做跨平台应用“怎么显示组件”这个问题。
dcsuibian
2022-06-21 13:36:58 +08:00
@meteor957
@ysc3839
是的,我最关心的本质问题还就是自绘和“原生”的问题。 (“原生”打引号,因为是跨平台语言编译出的原生组件)
我承认在当前的环境下,RN 确实是有用武之地的,也确实有不少应用。但未来发展困难,因为对于原生组件,说白了,管不了。
darkengine
2022-06-21 13:44:19 +08:00
要知道 RN 是 React Native ,所以它的理念跟 React 是一致的。React 做了什么,简单的说是把 jsx“翻译”成了浏览器认识的 dom 。这个理念本身走的就不是“自绘”的路子,直接在 Canvas 上画控件才是 (Flutter for web)。而 RN ,则是把 jsx“翻译”成了 iOS/Android 平台的原生控件。按照这个思路,并不能说 RN 是“倒行逆施”。
Lxxyx
2022-06-21 13:48:35 +08:00
都这么多年了也就不存在倒行逆施了吧。React Native 对于社区而言,就是在当时的情况下难得能用而且好用的跨端方案。
wangtian2020
2022-06-21 13:53:41 +08:00
能用 html+css 写界面的,都将被用 css 重写
https://github.com/mikke89/RmlUi:HTML/CSS 写 C++应用
HiCode
2022-06-21 13:59:33 +08:00
要考虑项目开始时的硬件情况吧。

React Native 是 2015 年左右开始搞的,Flutter 是 2017 年左右,其实可以看看那两年手机性能是否发生了翻天覆地的变化。

务实的项目立项是受外部条件影响的,是基于现有条件去选择合适方案,而不是天马行空想干嘛就干嘛。
Alexrx
2022-06-21 17:31:29 +08:00
RN 当年这种写法其实也还可以,现在来看就不怎么样了。跨平台 UI 还是得用 web 相关的技术才能持续发展下去,移动端的 electron 一直也没出现 可能就 flutter 最接近了
daokedao
2022-06-21 17:37:09 +08:00
@tion126x Ionic 算移动端的 electron 吗
ysc3839
2022-06-21 17:50:04 +08:00
另外还想说,某个平台上如果原生的界面框架越简陋越难用,更多人会选择自绘。Windows 只有一个很简陋的界面框架,于是在很多年前绝大多数应用都开始使用自绘了。Linux GUI 我不太了解,但是 Qt 毫无疑问是自绘的,GTK 如何我就不知道了。macOS 的界面框架很完善,选择自绘的应用也少。
Pastsong
2022-06-21 17:54:36 +08:00
DOM 也不算是自绘吧,本质也还是浏览器提供给你 API 操作它的 UI 库
Buges
2022-06-21 17:54:40 +08:00
@ysc3839 自绘也是相对而言,GTK/Qt 对 Linux 来说就是原生,和 DE 集成的很好。再不然就只能用裸 X/wayland API 了。
kop1989smurf
2022-06-21 18:07:53 +08:00
首先,对于跨平台这个需求而言,“自绘”和“原生”,其实都是一个相对概念而不是绝对概念。
比如 flutter 鼓吹自己比 webview 性能强,又比纯原生有更强的统一性,就是因为他是“原生自定义控件”,他是原生环境,但又是自绘控件。

换句话说,一次开发( 2022 年的视角看,一般都是 js ),多平台使用,有三个大途径:

1 、webView 套壳。(语法转换量最低,一致性最可控,但性能最差)
2 、在多个平台开发一套自定义控件,并翻译调用。(达到了性能和一致性的平衡)
3 、单纯的把一个开发语言翻译为多平台的开发语言。(最大化了性能,但失去了部分一致性)
libook
2022-06-21 18:21:56 +08:00
有需求就有市场,市场选择就是车前进的方向。

试想这样一个场景:
一个团队用 React 做了一个网站;
后来发现移动端的流量更高,于是就适配了移动设备;
然后发现基于应用商店的运营策略可以带来更多流量,于是想做 APP ,所以用 WebView 做了个 APP 壳,然后内嵌自己的网站;
后来用户反馈在一些复杂页面很卡(当时手机机能还没现在这么强),同时产品经理希望增加一些现有 Web API 不支持的功能。

作为 CTO ,有如下选择:
1. 保留现有 Web 开发人力开发 Web 端以外,额外招聘同等产能的 Android 和 iOS 开发人员,以原生方案重写,开发人员预算增加 1-2 倍;
2. 让所有前端开发人员去学 Dart 和 Flutter ,招聘具备 Flutter 开发经验的人员补足离职空缺的岗位,原有代码推翻重写,缺轮子找替代品或自己造,不过 APP 性能可以改善不少;
3. 试一下 RN ,原有代码可以得到最大限度复用,开发人员只需要了解一下 RN 的使用方法,还能改善 APP 性能。

当然,最终什么方案适合,得经过深入调研和试验才能得出结论,比如也有可能 RN 与原有架构设计方面不兼容,那就可以考虑是不是还要继续走这条路。
chenyg32
2022-06-21 19:41:07 +08:00
没有最好的技术方案,只有适合自己的技术方案。

Flutter 一致性比 RN 做得更好,但是其包体积和动态化都不如 RN 。

可以试想下一个看重包体积,对动态化有需求的公司会选择哪个呢?
secondwtq
2022-06-21 21:02:33 +08:00
假设楼主说的是“正确”的,Flutter 可出来的比 React Native 晚,因此只有“Flutter 相比 React Native 更‘进步’”,没有“React Native 开倒车”的说法
secondwtq
2022-06-21 21:06:16 +08:00
@ysc3839 你可以认为 Android 和 ChromeOS 也是在 Linux 上“自绘”的 :)

@Buges 裸 Wayland API:指直接传一坨像素点 buffer 过去(

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/861083

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX