写在前面2018 年,Airbnb 放弃了继续使用 React Native,个中原因主要有两方面:
- 技术:成熟度、配套设施/类库建设成本、首屏性能硬伤等没能很好地解决
- 团队组织:工程师要求高、跨技术栈/跨团队调试/测试等也产生了新的问题
一.技术困境一言以蔽之,触碰到能力边界之前,跨端方案里的一切都是美好的
以 React Native 为例:
文章插图
Bridge 层通过消息通信将 JAVAScript 世界与 Native 世界联系起来P.S.图有些旧,但不影响理解原理,更新的 React Native 架构图见 React Native 架构演进
Shadow Tree 用来定义 UI 效果及交互功能,Native Modules 提供 Native 功能(比如蓝牙),二者之间通过 JSON 消息相互通信
在这样的技术架构中,写的和实际执行的都是 JavaScript,调用由 Native 提供的视图渲染能力及平台特定能力,Facebook 称之为Scripting native 方案,姑且叫做容器化 Native 跨端方案:
将 Native App 改造成标准化的容器,进而允许一套代码跨多端标准容器运行,如 React Native/Weex、Flutter(摘自移动端跨平台技术之下的变与不变)
容器能力在很大程度上决定着开发效率,在容器提供了一致的标准支持范围内,能够愉快地一人搞定多端 。
然而,一旦触及能力边界,就会面临高成本的多层联合开发(Native 层、JavaScript 引擎层、特定业务领域层、业务层……),人效上并没有优势 。另一方面,如何保持多端一致性,也是个极其复杂并且充满技术挑战的问题
此外,相关的配套能力也直接关系到开发效率:
- 调试:跨技术栈调试一直是难题,问题排查成本越来越高
- 性能:跨线程、跨页面耗时分析困难、性能工具链缺失
- 工程链路:由于技术方案的特殊性,需要量身定制许多配套设施(包括但不限于 IDE、调试、性能、CI/CD、监控),才能将各个环节的成本降下来
- 抹不平的多端差异
- 掀不开的 JavaScript 引擎盖
- 跟不上的配套能力
引入 JavaScript 引擎虽然获得了动态执行代码的能力,但也带来了技术上的不确定性,几乎无法跟踪解决 JavaScript 引擎内部的崩溃或异常行为
通用的基础设施大多无法直接用于跨端场景,边边角角的配套能力都需要花力气建设,而为了满足业务快速生长,总是优先建设核心关键能力,配套支持通常是滞后的,同样影响着效率
Flutter 能带来一些不同吗?
文章插图
事实上,Flutter(目前看起来)同样面临这些技术困境,技术实现的变化并未彻底改变局面
据 2020 Q1 调查结果,Flutter 开发者认为最重要的 6 个问题是:
- 调试错误和崩溃
- 测试确保 App 能够跨多平台运行
- 选用状态管理方案
- 理解和处理布局问题(如文本溢出)
- 根据设计稿创建 UI
- 排查特定平台问题
- 排查特定平台问题
- 内存问题的诊断和修复
- CPU 使用率问题的诊断和修复
- 接入现有的 Native API
- UI 卡顿问题的诊断和修复
- 开发特定平台的 Flutter 插件
二.团队组织困境与单端开发模式相比,跨端方案的协作成本更高,体现在:
- 跨团队
- 链路长
- 容器团队压力大
- 职责边界不清晰
长链路意味着技术细节散落在多层,各自只拥有一小部分知识:
表层业务逻辑-----------------------------特定业务领域框架-----------------------------通用前端框架/类库-----------------------------JavaScript引擎(扩展)-----------------------------Native Module | 特定业务领域能力-----------------------------Native通用框架-----------------------------Native View-----------------------------平台操作系统
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Antrea 0.9.0 发布,Kubernetes 网络解决方案
- 网上热传的MCN到底是什么?让我们一起来了解一下!
- 如何判断你的电脑或手机是否被人监听
- 程序员该如何写一份漂亮的简历,引人注目?
- 揭开显卡的神秘面纱
- MPLS VPN跨域方案,你知多少?
- 五虎上将是哪五个排名
- 武松主张招安吗 梁山好汉被招安后武松的经历和结局
- 手把手带你nginx搭建基于rtmp或者http的flv、mp4流媒体服务器
- 洛神是什么神仙 洛神叫什么