老生常谈的技术选型 react native vs flutter ? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
murmur
V2EX    程序员

老生常谈的技术选型 react native vs flutter ?

  •  
  •   murmur 2023-07-08 21:17:42 +08:00 6742 次点击
    这是一个创建于 893 天前的主题,其中的信息可能已经有所发展或是发生改变。

    总体需求

    1 、办公类应用,企业证书,不需要上市场

    2 、有集成 fragment 或者 ios 原生组件的需求(第三方提供的 sdk 和界面)

    3 、webview 是核心,因为大多数业务是 cordova 迁移过来的,这部分大概有 100 多个页面,所以重写的大概 20-30 个页面左右

    4 、重构只是因为 ios 相机启动 wkwebview 白屏太烦了,核心业务准备重写,这部分还得能转成 h5 复用

    5 、安卓、ios 开发都是其他开发兼职

    选 flutter 的理由

    1 、社区热度更高,有很多国内厂商甚至提供官方插件

    2 、界面一致性更好处理

    3 、google 背书不容易倒

    4 、dart 虚拟机编译的东西比 js bundle 不容易反解

    选 react native 的理由

    1 、jsx 的语法太舒服了

    2 、因为 rn 渲染的都是 native ,所以无论集成 fragment 还是 view 都是手到擒来的事情

    3 、rn 的 webview 似乎比 flutter 强一些

    4 、rn 的 web 比 flutter 好点

    不选 flutter 的理由

    1 、语法太 tm 畜生了

    2 、官方似乎只提供了集成 view 的说明

    不选 rn 的理由

    1 、直到新架构还是实验期,正式上的只有新的 js 编译器

    2 、插件不支持热加载(热加载插件是实验特性)

    3 、如果不优化的话包大的可怕( debug ~50m ,几乎没写什么东西,就路由和一些图标)

    大家给点意见?

    第 1 条附言    2023-07-10 11:25:23 +08:00
    ios 的相机是不折不扣的 3aaaaa 应用,我拿 instruments 看进程列表,拍照的一瞬间会增加 1gb 的内存占用,然后这部分内存被回收
    34 条回复    2023-09-13 20:50:36 +08:00
    shaojian0702
        1
    shaojian0702  
       2023-07-08 21:26:01 +08:00 via Android   1
    语法太畜生了,笑死我了
    flyqie
        2
    flyqie  
       2023-07-08 21:30:16 +08:00
    dart 的语法。。个人确实不太能接受。

    基本是看一次劝退一次。。。
    0o0O0o0O0o
        3
    0o0O0o0O0o  
       2023-07-08 21:30:34 +08:00 via iPhone
    同求建议:
    - 三个桌面平台两个移动平台和 WEB 都想要
    - 需要上架,apple store 、google play 、ms store
    - 无所谓语言,但希望尽可能真的一套代码跨平台
    - 尽量能别和原生打交道
    - 希望社区火热,不需要自己踩坑
    adjusted
        4
    adjusted  
       2023-07-08 21:37:46 +08:00
    你这个项目我会选择 react native 。其实 ios 应用排行榜上很多应用都有 react native, 还有 expo 支持,而且我感觉 meta 内部用 react native 应该比谷歌内部用 flutter 多,目前来看 flutter 完全靠谷歌风险反而大很多。而且你这个项目本来就是 web ,开发上手 react native 也比 flutter 容易多了。
    flyqie
        5
    flyqie  
       2023-07-08 21:40:23 +08:00
    @adjusted #4

    go 跟 flutter ,虽然不是同一类。

    但感觉 google 给 go 的资源。。似乎还行?
        6
    musi  
       2023-07-08 21:44:20 +08:00 via iPhone
    dart 这语法,搞个复杂点的布局,嵌套看得我不知道哪是哪
    flyqie
        7
    flyqie  
       2023-07-08 21:54:03 +08:00
    @flyqie #5

    又了解了一下。。感觉。。似乎也不太行。。
    dcsuibian
        8
    dcsuibian  
       2023-07-08 21:56:15 +08:00
    我不是这方面的专家,但我还是想要发表一下我的观点,在我仔细看过你的问题经过长时间的思考后,我其实也不知道要怎么回答,正如我一开始说的,我不是这方面的专家。
    dcsuibian
        9
    dcsuibian  
       2023-07-08 22:02:11 +08:00
    @dcsuibian 开玩笑的,只能说看团队吧。
    如果对 Javascript 本身已经比较熟悉了,那么选 react native 。
    Flutter 的优点主要体现在其 UI 一致性和性能上。
    debuggerx
        10
    debuggerx  
       2023-07-08 23:42:02 +08:00 via Android
    虽然总体来说我是 flutter 派,但是你这个情况,明显还是原生开发最适合吧,核心 webview 又有接原生页面的需求,不管是 rn 还是 flutter 都是脱裤子放屁吧
    debuggerx
        11
    debuggerx  
       2023-07-08 23:49:02 +08:00 via Android   1
    另外 dart 语法其实非常均衡且常规,语言本身没什么好黑的,觉得语法丑的那是因为没有理解 flutter 的设计思想,以及还没领悟到 UI 的本质其实就是嵌套,嵌套的描述性代码才是最符合直觉和原始意义的,觉得嵌套深就找不到北的,一是不够熟悉,二是不会善用 inspector……
    owen800q
        12
    owen800q  
       2023-07-08 23:58:20 +08:00
    react native webview + H5 , 不二之,按你在上面的,我想不到一理由要把部分面重
    camera 相的直接在 RN ,把照片/qr code 之的果 H5 不就好了,只要保把 camera 和 webview 包在同一件,完全不有白屏,只能 RN 的那解似的
        13
    murmur  
    OP
       2023-07-09 09:03:10 +08:00
    @owen800q 以前是 cordova 的框架,只有一个 wkwebview ,如果调用 ios 拍照,杀的是 wkwebview 的一个进程,然后就会导致整个应用白屏卡死

    这个是无解的,微信公众号更严重,毕竟 3A 大作,小程序据说重写了相机稍微好一点,但是还是概率白屏

    唯一的方法就是不要用 h5 写核心业务,做 webview 自恢复问题太多了,尤其是涉及一堆页面的数据保存,体感也不好
    murmur
    murmur
        14
    murmur  
    OP
       2023-07-09 09:06:47 +08:00
    @debuggerx 不是接近原生页面的需求,是迫于 ios 下白屏被迫重写一些核心业务代码,不涉及拍照的还是用 h5 做,我们的分析是那个页面用了高德地图,新的高德地图是 webgl 渲染,超级吃资源,再调个相机分分钟杀进程

    jsx 也是嵌套,好处是几乎所有的样式都可以在 style 里完成,你不需要管原组件提供了什么参数

    dart 那种一堆 children 嵌套起来真的是丑陋,他 children 也是要闭合的啊,代码长度比 jsx 小了么,甚至嵌套地狱下 IDE 被迫提供了看闭合的括号是哪个的功能
    kuituosi
        15
    kuituosi  
       2023-07-09 11:19:53 +08:00 via Android
    技术上其实没有什么可以比较的,各自生态都能进化。说生态危险的就是搞笑,苹果再牛逼也不敢得罪大量 flutter 用户,要封杀早就动手了。国内应用选 flitter ,国外应用选 rn 。原因是国内应用生态对 rn 支持非常弱,你随便集成第三方的 rn 可能无法提供,但是 flutter 通常都会有。国外恰恰相反,rn 非常流行,提供的第一选项支持是 rn
    owen800q
        16
    owen800q  
       2023-07-09 11:50:20 +08:00
    @murmur 那只要把原生相的功能用 RN 重就好,UI 相的沿用原的 H5 就好了,只要把 webview 同原生件 包在同一件就好,完全不有白屏
    murmur
        17
    murmur  
    OP
       2023-07-09 12:11:17 +08:00
    @owen800q

    微信 chooseimage 白屏

    用这些关键字搜能搜出非常多的结果

    微信不会不知道给 webview 包壳就可以把,而且 wkwebview 是多进程,他怎么知道自己被包在哪里该不该 crash

    唯一能做的就是业务部分和主界面独立开,这样白屏了做恢复的时候只要恢复业务就可以,不至于主程序也跟着白
    runze
        18
    runze  
       2023-07-09 12:21:33 +08:00   3
    @debuggerx #11
    “另外 dart 语法其实非常均衡且常规,语言本身没什么好黑的,觉得语法丑的那是因为没有理解 flutter 的设计思想,以及还没领悟到 UI 的本质其实就是嵌套,嵌套的描述性代码才是最符合直觉和原始意义的,觉得嵌套深就找不到北的,一是不够熟悉,二是不会善用 inspector……”

    这种话可以套给任何东西:

    另外 go 语法其实非常均衡且常规,语言本身没什么好黑的,觉得语法丑的那是因为没有理解 go 的设计思想,以及还没领悟到 错误 的本质其实就是 if ,重复的 if err != nil 代码才是最符合直觉和原始意义的,觉得 if 多就找不到北的,一是不够熟悉,二是不会善用 debugger……

    另外 XXX 语法其实非常均衡且常规,语言本身没什么好黑的,觉得语法丑的那是因为没有理解 XXX 的设计思想,以及还没领悟到 AAA 的本质其实就是 BBB ,CCC 才是最符合直觉和原始意义的,觉得 DDD 就找不到北的,一是不够熟悉,二是不会善用 EEE……
    cnhongwei
        19
    cnhongwei  
      &nsp;2023-07-09 15:24:36 +08:00
    RN 吧,对 flutter 还有一个不爽的地方就是 json 的处理。
    mynameislihua
        20
    mynameislihua  
       2023-07-09 18:24:07 +08:00
    @cnhongwei JSON 处理确实恶心,为什么不能像 java 一样,加个注解什么的自动就生成代码
    moonrailgun
        21
    moonrailgun  
       2023-07-10 00:47:11 +08:00
    如果主要是 webview 的话,我的建议是 rn 。因为我调研下来 flutter 的 webview 不如 rn 的 webview 。(甚至本来还考虑过 uniapp 的 w2a 方案不过正如 op 所说太畜生了)

    这是我的项目可供参考, 一些与 webview 通信与相互调用的实践: https://github.com/msgbyte/tailchat/tree/master/client/mobile
    xulihang
        22
    xulihang  
       2023-07-10 09:49:18 +08:00
    @murmur 拍照用 cordova 的插件也会有杀 wkwebview 的问题吗
    murmur
        23
    murmur  
    OP
       2023-07-10 09:59:13 +08:00
    @xulihang 有啊。cordova 的插件调用的就是官方相机,有考虑过重写一个简陋的相机专门拍照,但是既然微信小程序都没能解决,那除了受影响的功能拿出 webview 也没什么好办法
    n3r0
        24
    n3r0  
       2023-07-10 10:13:19 +08:00
    需要 h5 复用和 webview 核心,以及集成原生 view 。你这需求用跨平台真是一点好处没捞到呀……还是用原生吧,部分抽出来改写一下。

    另外 2023 年了还有人嫌 flutter 的 UI 写法嵌套丑陋,合着拆分是一点都不愿意做呀,写业务逻辑也不至于一个方法从头到尾吧。要是真有那么恶心就不会发展的这么快了。相比于之前安卓写 XML ,几个群里普遍都觉得是好几倍的效率提升,同样 compose 这些新的声明式 UI 框架也是类似的写法,基本就是未来的趋势了。

    虽然 flt 问题也不少,说说多窗口字体渲染编辑器输入法候选框 json 解析大家都认同,老看这些吐槽不到点子上的也是很槽心了。。
    murmur
        25
    murmur  
    OP
       2023-07-10 10:15:28 +08:00
    @n3r0 这是被迫的,我查了那么多资料,能解决 wkwebview 白屏的问题就只有不用 webview ,连微信和微信小程序都搞不定这个问题

    我们的问题比微信小程序还严重点,微信小程序拍照一般就是传个发票发个商品,我们有的页面要求拍照几十张,就算缩图内存占用也很恐怖
    murmur
        26
    murmur  
    OP
       2023-07-10 10:17:20 +08:00
    @n3r0 业务部分代码用原生写太恐怖了,那种复杂的表格和表单用原生渲染,想想都头大,但是因为这部分业务还得能跑在微信(部分页面),所以还是得找个跨平台非 h5 框架
    tool2d
        27
    tool2d  
       2023-07-10 10:18:10 +08:00
    flutter 写新项目可以,可老项目那么多页面和代码需要推翻重写,工作量巨大,同事未必愿意。
    n3r0
        28
    n3r0  
       2023-07-10 10:21:05 +08:00
    @murmur 那就只能原生了。。几十张图稍微处理不好就 OOM 了,RN 不知道,flutter 这个场景感觉还比较薄弱,基本没啥自带优化的,缓存啥的都得自己做。
    androidzai
        29
    androidzai  
       2023-07-10 12:07:38 +08:00
    webview 是核心推荐 RN 。一来 webview 支持好,二来技术栈也比较相似。
    npe
        30
    npe  
       2023-07-10 15:34:30 +08:00
    ReactNative
    成熟度来说会好些,这方面招人成本也低一些。
    yemoluo
        31
    yemoluo  
       2023-07-10 16:02:39 +08:00
    我,我会写 Flutter 插件,但是我不会写 RN 插件,也是无语了
    murmur
        32
    murmur  
    OP
       2023-07-10 16:04:38 +08:00
    @GTim 我以前维护过 cordova 的插件,贼简单,rn 的插件我也看不懂,除了一大堆 c 、c++的代码外,还有巨复杂的 gradle 指令
    murmur
        33
    murmur  
    OP
       2023-07-11 16:45:37 +08:00
    @androidzai 放弃 rn 了,体验太差了,那个 metor 编译器动不动就闪退,开了调试模式之后直接 app 都起不来了,也不知道哪个插件出了兼容问题,直接是 so 报错都不知道哪里改

    说是 react 结果一堆 js 库兼容问题
    simpleH
        34
    simpleH  
       2023-09-13 20:50:36 +08:00
    留个脚印,在接触 flutter ,"语法太 tm 畜生了"
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4976 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 09:31 PVG 17:31 LAX 01:31 JFK 04:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86