公司准备重构 App,请问一下现在最流行的架构是什么?

2022-02-11 12:20:50 +08:00
 silencelixing

如题,重构 App 可选的方案太多了,不知道如何下手。 Jetpack MVVM ? Compose ? Kotlin flow ? 准备选一个当前最流行的架构,大佬们有没有模板项目推荐的?

19539 次点击
所在节点    Android
67 条回复
silencelixing
2022-02-11 15:29:47 +08:00
@KuroNekoFan #16 遇到的问题刚刚贴在附言里了
silencelixing
2022-02-11 15:32:08 +08:00
@ren2881971 #7 哈哈没有追求新技术,只是需要一个主流的技术方案,稳定没 Bug 能上手就行
silencelixing
2022-02-11 15:34:25 +08:00
@imtianx #13 其实界面没有很炫酷,就是 native 相关的功能太多,上 flutter 我觉得应该和 RN 没有很大区别,那样就没有重构的必要了
Helsing
2022-02-11 15:35:54 +08:00
MVVM + Clean
silencelixing
2022-02-11 15:38:18 +08:00
@Chism #8 uniapp 之前有写过,性能还不如 RN ,更像是一个 webview 的操作体验,这次其实跨平台的技术方案都不考虑了。
fyooo
2022-02-11 16:18:53 +08:00
谢谢楼主分享,附录的都是干货啊,哈哈,外网介绍 RN 的文章都是千篇一律的夸,很少遇到这么高密度的实战经验干货
KuroNekoFan
2022-02-11 16:24:13 +08:00
附录很赞😄
iovekkk
2022-02-11 16:28:01 +08:00
去年花了老大力气把组里的几个项目都从 mvp 转成了 mvvm
看来今年又得转 mvi
loginbygoogle
2022-02-11 16:33:03 +08:00
原生开发直接 Jectpack Compose/SwiftUI
aabbcc112233
2022-02-11 16:35:02 +08:00
一年多没写安卓, 已经不懂什么 mvi jetpack compose 了......真的学不完, 还是写 flutter 舒服
loginbygoogle
2022-02-11 16:38:23 +08:00
现在 Flutter 在 Android 端的性能已经可以媲美原生了,但在 iOS 上还需要继续优化
imtianx
2022-02-11 16:46:24 +08:00
@silencelixing 那还是老老实实用原生写,现在原生写着也很舒服
z1113456051
2022-02-11 17:03:54 +08:00
根据我的经验,没事别乱动,不动就不会有问题。
ykrank
2022-02-11 17:05:04 +08:00
重 native 特化逻辑的 app ,一开始选择跨端方案就是个错误。跨端的目的都是抹平各端,意味着是一个各端交集,注定只能自己实现各端的特化特性。主要适合重 UI 和业务逻辑的 app
whyrookie
2022-02-11 17:10:10 +08:00
这个附录确实很赞
iweus
2022-02-11 17:10:29 +08:00
公司项目还是原生开发吧,MVC 能满足大部分需求,别整那些虚的,维护起来还麻烦,稳定为主
SmiteChow
2022-02-11 17:13:13 +08:00
这怕是重写不是重构
xieren58
2022-02-11 17:25:27 +08:00
Jectpack Compose
CommandZi
2022-02-11 17:30:09 +08:00
求不要用 Flutter 祸害 iOS 的体验。
闲鱼、懂车帝在 iOS 端都是屎一般的体验。
Bijiabo
2022-02-11 18:10:14 +08:00
我现在依然使用 RN 方案来做公司主要业务开发,也服务过一些中小客户(项目金额大概 10-100W 之间)。针对楼主附言提到的问题,我认为大部分都是不是 RN 自身的问题,是团队的开发方式需要优化,不应该把锅甩给框架。

我一条条列一下我的观点:

1. 百度移动统计每次都需要手动埋点,无法实现自动埋点
自己的 RN 业务一般要自行封装导航路由和公共组件,完全可以实现自动埋点,梳理一下内部规范即可。我们现在用 AppCenter 来做的,相比原生差不了多少。


2. 很多三方的 SDK 都只有原生端接入,没有 RN 接入方式,需要自己封装一层 native 接口供 JS 调用
分开说:
- Native Module 一般工作量不大,主要接口调用,一次性工作。
- Native UI Component 相对复杂一些,最好 Native UI 封装完再套一层 React Native Component 封装,但对于整体工作量来说,比两端纯 Native 开发还是会小不少的(大部分场景)


3. 很多参数,例如:设置页面参数,通道参数,都是写在 RN 层,与原生层交互需要多一层逻辑
多的这层逻辑指的是 Native Module 封装,实际会影响性能和体验么?这样业务层 Android 、iOS 只写一遍岂不是更好?

4. RN 写的界面,没办法实现复杂的手势操作逻辑,例如:坐标定位不方便,无法解决兼容性问题。还有
手势传递、冲突等一系列问题也没有很好的解決方案。
这确实是个问题,对于高要求的复杂手势和动画来说有一些实现难度,可能封装 Native UI 会更好。对于一般手势交互效果,基本 react-native-gesture-handler + animated2 都能应对。


5. RN 本身也是一个框架,存在很多 Bug ,用原生写则不会有这些 Bug 。每次升级 RN 的版本都会是一个
大动作,不敢轻易升级,因为每次升级都会出现新问题,现在 RN 仍然有几百个 Bug 没有解决。
0.60+ 之后比较稳定了,目前没有遇到特别卡壳的问题


6. 一些界面没办法用 RN 实现,或者说在 RN 上找不到实现方案,例如 Android 的悬浮窗,ios 的画中画
功能。
这部分通过封装 Native Module 模块来解决就可以,一般都是特殊场景,特殊处理

7. RN 的性能、体积问题。性能问题:FlastList 列表渲染在有大量数据刷新,或者有复杂的列表功能时,
渲染卡顿,发热,用原生的 RecycleView 则不会有这些问题。RN 的 apk 包会比原生的大。RN 多了一
层 JS 与 Native 之间的一层 Bridge ,这层桥接也会影响性能。
我们有在业务场景中遇到过列表显示大量监控数据时的卡顿问题,换原生 TableView/RecycleView 也卡,主要还是数据处理上下功夫,通过优化渲染逻辑的方式可以解决。对于 RN 多的 Bridge ,新的版本有 JSI ,性能提升还是很显著的。


8. 三方支持库不如原生的多,#且基本上不怎么维护了,质量参差不齐,不少需求都需要自己造轮子
我认为原生库的封装成本不高,我们之前的业务就是从原生切到 RN 的,总体开发成本下降非常多,周期和质量都有显著提升。

9. 国际化问题:如果一些界面是原生写的,这些界面也需要国际化文本,那么文案要么在 native 做一套单
独的,这样就需要维护 json 和 xml 两套文本了,要么就需要从 RN 层传到 native 来显示。
这个可以同一套...写个脚本 XML 转 JSON ?

10. 测试同时没办法写自动化测试,因为 RN 界面的元素、控件,全部没有 ID ,无法定位。
我们有些 RN 业务界面室友做自动化测试覆盖的,可以使用 Detox 。对于 ID ,我想你说的是 testID ,在 0.5x 的版本中确实有一定问题,对于现在 0.60+ 来说,可以直接添加 testID 属性,文档地址: https://reactnative.dev/docs/view#testid

11. 和 native 强相关的功能,基本起不到什么作用:例如 IM 、OTA 升级,各种 so 库、蓝牙、SPP 通信。
没做过 IM 的业务,我知道极光有 RN IM SDK 。对于 OTA 升级、蓝牙通信,使用 RN 开发应用在业界是非常普遍的,比如小米的米家、涂鸦智能的涂鸦 app ,他们做物联网业务的必备功能。我这里自己接了几个出海项目,也有包涵这些特性,出货都没什么问题。RN 解决的是跨端界面的交互开发,就算用其他跨端方案,也是需要 Native 接口的封装。

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

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

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

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

© 2021 V2EX