React Native VS Flutter
框架层面须支持/适配以下功能:
- 蓝牙, 包括搜索、连接蓝牙, 发送蓝牙指令打印
- 串口通信
- 摄像头, 包括拍照和上传本地照片
- 二维码, 最好能支持连续扫描二维码
如插件市场无法满足某一功能的插件, 尚须考虑原生插件开发和接入难度
简表
React Native
特性
开发语言为
JavaScript和TypeScript主要文件类型为
jsx或tsx基于
React前端框架和Expo上层框架, 遵循UI = f(state)范式和函数式编程范式基于
babel构建工具, 可使用VS Code或Web Storm开发开发时支持热更新, 更新效率较高, 启动速度较慢
可借助
Expo Go在真机上调试须使用
React Native暴露出的组件:tsximport {Text, View} from 'react-native';类似
uniapp的text、view等标签, 不同的是uniapp会将html标签转换为uniapp标签, 但RN则不会文档和示例较为欠缺, 须借助搜索引擎查找和解决问题, 中文文档
使用
Javascript Bridge, 导致效率和性能较低, 尽管最新版本0.74在推进bridgeless新架构, 但其性能仍不如FlutterJS生态丰富, 社区有很多npm包可供使用, 但其兼容性需要实践才能确定前端人员上手成本低, 可快速上手
由于
React自身特点, 不熟悉React的人虽然能写出满足需求的代码, 但代码质量和性能可能有问题, 须做相应的约束和培训使用过多第三方包或官方更新可能会导致破坏式更新, 产品稳定性欠缺
可尝试集成 vite 进行开发以提高开发效率
插件市场
功能
打开相机
选择本地图片或拍照
图片相关
选择本地图片或拍照
用于渲染图片的组件
react-native-image-crop-picker
可编辑、压缩图片
图片压缩
扫描二维码
串口通信
蓝牙和打印
获取地理位置
SQLite
网络连接
嵌入 Web 网页
热更新
组件库
通用包
用于发起请求
通用的请求库, 请求缓存, 重新请求, 请求失败重试等
JS接口模拟工具React状态管理工具不可变状态管理
@react-native-async-storage/async-storage
Data storage system for React Native.
Flutter
特性
- 声明式
UI框架, 使用setState更新 (无状态管理插件时) Debug下为JIT (Just in Time)即时编译;Release下为AOT (Ahead of Time)预编译- 开发语言
Dart, 为强类型语言, 声明变量须同时声明其类型, 变量类型不可变, 类型不一致时会报错 - 开发时支持热更新, 热更新效率高
- 底层基于
c++编写的skia图形库, 跨平台兼容性好, 性能较高 (低于原生开发) - 可使用
VS Code或Android Studio开发和调试, 支持有线和无线真机调试, 自带devtools - 布局为类
xml的嵌套写法, 会出现较多成对的(), 且布局和样式位于同一文件 - 文档和示例完善, 第三方包生态较为完善, 中文文档
- 自带众多组件, 覆盖绝大部分场景, 仅须使用少量第三方
UI插件 - 不支持热更新, 社区有
shorebird方案 - 前端人员上手成本较高, 须熟悉
Dart语言和Flutter布局写法、状态更新等 - 破坏性更新较少, 如锁死
SDK版本则可一直开发迭代
插件市场
- pub.dev 官方插件市场
- pub-web.flutter-io.cn 插件市场中文站点
功能
组件库
Flutter自带多种组件, 已基本涵盖常用组件, 且提供Android (material)和iOS (cupertino)两种风格组件, 绝大部分情况下无须第三方组件库- 小型
UI组件
打开相机
选择本地图片或拍照
基于 微信 UI 的 Flutter 图片选择器(同时支持视频和音频)
图片压缩
扫描二维码
串口通信
获取地理位置
SQLite
网络连接
嵌入 Web 网页
热更新
基于性能、安全和跨端实现难度的考虑, Flutter 官方仍未将热更新功能列入规划之中, 但社区已有一些热更新实现:
- shorebird
- Remote Flutter Widgets 基于服务端的远程组件, 组件代码由服务端动态下发