分类 生活 下的文章

中年男人和大型SUV的关系,说白了就是”责任感”遇上了”安全感”,再加点”面子工程”。 前两天和几个哥们儿聚会,5个人开了4台SUV,清一色都是中大型,我开玩笑说:”咱们这是SUV车主联谊会啊?”结果大家都笑了,然后开始认真讨论起这8台”让中年男人无法拒绝”的大家伙。


!

图片

心理分析:为什么偏偏是大型SUV?


说实话,中年男人选车和年轻时候完全是两个逻辑。20多岁图帅气,30多岁看实用,40岁以后?安全、面子、责任感,一个都不能少。


前阵子我哥们换车,老婆怀二胎,原来那台轿车瞬间不够用了。试驾完一圈下来,直接锁定大型SUV:”坐得高看得远,撞了也不吃亏,后排空间大,丈母娘来了也不挤。”这话虽然粗糙,但道理很实在。


第一梯队:德系三剑客的”中年危机解药”


奔驰GLS、宝马X7、奥迪Q7,这三台车几乎承包了所有中年成功男士的”梦想清单”。开着这些车去接娃,家长群里的地位瞬间不一样,连老师都会多看你两眼。


特别是奔驰GLS,那个气场真不是盖的。朋友说:”开这车去4S店保养,技师的态度都比开轿车时候好三分。”虽然听着像玩笑,但现实就是这么魔幻。


!

图片

第二梯队:美系硬汉的”真男人情结”


凯迪拉克凯雷德、林肯领航员,这俩货就是为了满足中年男人心里那点”硬汉情节”而生的。6.2L V8、空气悬挂、一脚油门下去轰鸣声能让隔壁小区都听见,这就是纯爷们儿该开的车。


我一个做工程的朋友,开着凯雷德去工地,工人们都说:”老板这车真霸气!”面子这东西,有时候比配置表更重要。


第三梯队:日系可靠的”省心之选”


雷克萨斯LX、丰田陆地巡洋舰、英菲尼迪QX80,日系大型SUV的逻辑很简单:买得起,养得起,开不坏。 中年人最怕的就是车子三天两头进修理厂,耽误接娃送娃,老婆埋怨,领导白眼。


特别是陆巡,虽然油耗感人,但那个可靠性是真没话说。有朋友开了8年,除了正常保养,啥毛病没出过,这在中年男人心里就是”定心丸”。


!

图片

新势力搅局:理想L9的”奶爸专属”


要说最近两年最火的大型SUV,理想L9绝对算一个。六座布局、冰箱彩电大沙发,简直就是为中年奶爸量身定制的移动客厅。


试驾过的朋友都说:”这车开起来像在家里一样舒服,娃在后排看动画片,老婆可以化妆,我负责开车就行。”虽然没有传统豪车的那种”贵气”,但实用性和科技感确实拉满了。


最可惜的停产车:三菱帕杰罗V97


说到停产可惜,三菱帕杰罗V97绝对是中年男人心中的”白月光”。非承载式车身、超选四驱、3.8L V6,这些配置放在现在,简直就是”绝版收藏品”。


!

图片

我有个朋友至今还开着一台2019年的V97,每次聚会都有人问他卖不卖。他总是摇头:”这车停产了,卖了就再也买不到了。”这种情怀,只有真正懂车的中年男人才能理解。


现实考量:面子与里子的平衡


当然,中年男人选车也不全是情怀和面子,更多时候是现实需求的妥协。 空间要大、安全性要高、维修要方便、保值率要好,这些都是硬指标。


有朋友开玩笑说:”年轻时候想要跑车,中年以后只想要’跑得了车’。”这话虽然自嘲,但确实说出了很多人的心声。


用车场景:从诗和远方到柴米油盐


大型SUV对中年男人来说,更像是生活的”万能工具”。平时接送娃上学,周末全家自驾游,过年回老家拉行李,偶尔还得客串一下”搬家车”。


!

图片

朋友圈里经常看到哥们儿发照片:后备箱塞满了年货,车顶绑着行李箱,一家老小挤在车里笑得特别开心。这种时候,什么品牌、什么配置都不重要了,重要的是这台车能承载起一家人的幸福。


结语:选择背后的人生哲学


所以说,中年男人爱大型SUV,本质上是在为自己的人生阶段选择一个合适的”伙伴”。它不仅仅是代步工具,更是责任感、安全感、成就感的综合体现。


你家里有没有这样一台”大家伙”?或者正在纠结要不要入手?评论区聊聊,说不定下次聚会就能组个”SUV天团”了!


Go-Micro、Go-Zero 和 GoFrame 是 Go 语言生态中三个主流的微服务开发框架,它们各自针对不同的场景和需求设计,具有不同的优缺点。以下是对它们的详细对比分析:

1. Go-Micro

定位:老牌通用微服务框架,提供服务发现、RPC、事件总线等基础组件。

优点

  • 组件化设计:提供服务发现、负载均衡、编码解码、请求重试等微服务核心组件,支持插件化扩展(如 Consul、Etcd 等注册中心)。

  • 多协议支持:原生支持 HTTP、gRPC、MQTT 等多种通信协议,灵活适配不同场景。

  • 社区成熟:作为早期微服务框架,社区资源丰富,文档完善,适合快速上手。

  • 云原生友好:支持 Kubernetes、Docker 等容器化部署,与云原生生态兼容。

缺点

  • 学习曲线陡峭:组件较多,初学者需要理解服务发现、编解码等概念,上手难度较高。

  • 配置复杂:需要手动配置多个组件,如注册中心、传输协议等,对新手不友好。

  • 性能一般:相比专注性能优化的框架(如 Go-Zero),RPC 调用延迟略高。

适用场景

  • 跨语言微服务架构(支持多种协议)。

  • 需要灵活扩展组件的场景。

  • 对服务治理有较高要求的企业级应用。

2. Go-Zero

定位:高性能微服务框架,专注于 API 网关和 RPC 服务。

优点

  • 极致性能:基于 fasthttp(比 net/http 快 3 倍以上),适合高并发场景,官方宣称 QPS 比同类框架高 50%。

  • 代码生成工具:提供 goctl 工具自动生成 API 和 RPC 代码,减少重复工作。

  • 集成熔断限流:内置断路器、限流、负载均衡等中间件,提升系统稳定性。

  • 简化开发:通过模板和代码生成,降低微服务开发门槛,适合快速迭代。

缺点

  • 生态较封闭:依赖官方工具链(如 goctl),自定义扩展需了解框架内部实现。

  • 文档不够完善:相比 Go-Micro 和 GoFrame,文档细节和示例较少。

  • 组件扩展性弱:部分组件(如注册中心)仅支持有限选项(如 Etcd),插件化能力不足。

适用场景

  • 高并发、低延迟的互联网应用(如电商、社交)。

  • 需要快速迭代的项目(代码生成工具提升效率)。

  • 对性能敏感的后端服务(如网关、API 服务)。

3. GoFrame

定位:全功能 Web 开发框架,提供完整的工具链。

优点

  • 一站式解决方案:内置 ORM、缓存、日志、配置、CLI 等模块,无需额外依赖。

  • 文档详尽:官方文档覆盖全面,示例丰富,适合新手快速上手。

  • 统一风格:所有组件遵循一致的设计风格,降低学习成本。

  • 企业级支持:提供事务管理、分布式锁、限流等企业级功能。

缺点

  • 框架较重:集成组件较多,适合单体应用或全栈开发,微服务场景可能冗余。

  • 性能略低:相比 Go-Zero,基于标准库实现,性能不是首要优化目标。

  • 社区活跃度低:相比 Go-Micro 和 Gin,社区规模较小,第三方插件较少。

适用场景

  • 单体应用或全栈开发(无需频繁切换工具)。

  • 对开发效率要求高的项目(一站式解决方案)。

  • 企业内部系统(需要事务、权限等功能)。

对比总结

维度Go-MicroGo-ZeroGoFrame
性能中等极高(基于 fasthttp)中等(基于标准库)
学习成本高(组件多)中(依赖代码生成)低(一站式设计)
生态成熟度高(早期框架)中(快速发展)中(国内用户较多)
扩展性强(插件化设计)中(官方组件为主)中(内置组件较多)
适用场景跨语言、复杂微服务架构高并发、快速迭代项目单体应用、全栈开发

如何选择?

  • 优先选 Go-Micro:如果需要跨语言调用、灵活的组件扩展,或已有成熟的微服务生态。

  • 优先选 Go-Zero:如果项目对性能要求极高,且团队接受代码生成工具(如 goctl)。

  • 优先选 GoFrame:如果需要一站式解决方案,或开发单体应用、企业内部系统。


建议根据项目需求、团队技术栈和性能要求综合评估,也可以组合使用(如用 Go-Zero 开发高性能服务,用 GoFrame 开发管理后台)。


本文由GSYTech 恋猫de小郭分享,原题“2025 跨平台框架更新和发布对比,这是你没看过的全新版本”,下文有修订和重新排版。

1、前言

2025 年可以说又是一个跨平台的元年,其中不妨有鸿蒙Next平台刺激的原因,也有大厂技术积累“达到瓶颈”的可能,又或者“开猿截流、降本增笑”的趋势的影响,2025 年上半年确实让跨平台框架又成为最活跃的时刻。

例如:

  • 1)Flutter Platform 和 UI 线程合并和Android Impeller 稳定;

  • 2)React Native 优化 Skia 和发布全新 WebGPU 支持;

  • 3)Compose Multiplatform iOS 稳定版发布,客户端全平台稳定;

  • 4)腾讯 Kotlin 跨平台框架 Kuikly 正式开源;

  • 5)字节跨平台框架 Lynx 正式开源;

  • 6)uni-app x 跨平台框架正式支持鸿蒙;

  • ····

本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。

2、系列文章

本文是系列文章中的第 14篇,本系列总目录如下:

IM跨平台技术学习(一):快速了解新一代跨平台桌面技术——Electron

IM跨平台技术学习(二):Electron初体验(快速开始、跨进程通信、打包、踩坑等)

IM跨平台技术学习(三):vivo的Electron技术栈选型、全方位实践总结

IM跨平台技术学习(四):蘑菇街基于Electron开发IM客户端的技术实践

IM跨平台技术学习(五):融云基于Electron的IM跨平台SDK改造实践总结

IM跨平台技术学习(六):网易云信基于Electron的IM消息全文检索技术实践

IM跨平台技术学习(七):得物基于Electron开发客服IM桌面端的技术实践

IM跨平台技术学习(八):新QQ桌面版为何选择Electron作为跨端框架

IM跨平台技术学习(九):全面解密新QQ桌面版的Electron内存占用优化

IM跨平台技术学习(十):快速选型跨平台框架Electron、Flutter、Tauri、React Native等

IM跨平台技术学习(十一):环信基于Electron打包WebIM桌面端的技术实践

IM跨平台技术学习(十二):万字长文详解QQ Linux端实时音视频背后的跨平台实践

IM跨平台技术学习(十三):从理论到实践,详细对比Electron和Tauri的优劣

IM跨平台技术学习(十四):鸿蒙NEXT时代你所不知道的全平台跨端框架》(☜ 本文)

3、Flutter

首先 Flutter 大家应该已经很熟悉了,作为在「自绘领域」坚持了这么多年的跨平台框架,相信也不需要再过多的介绍,因为是「自绘」和 「AOT 模式」,让 Flutter 在「平台统一性」和「性能」上都有不错的表现。开发过程过程中的 hotload 的支持程度也很不错。

而自 2025 以来的一些更新也给 Flutter 带来了新的可能,比如 Flutter Platform 和 UI 线程合并 ,简单来说就是以前 Dart main Thread 和 Platform UI Thread 是分别跑在独立线程,它们的就交互和数据都需要经过 Channel 。

而合并之后:Dart main 和 Platform UI 在 Engine 启动完成后会合并到一个线程,此时 Dart 和平台原生语言就支持通过同步的方式去进行调用,也为 Dart 和 Kotlin/Java,Swift/OC 直接同步互操作在 Framework 提供了进一步基础支持。

当然也带来一些新的问题,具体可见线程合并的相关文章。

另外在当下:其实 Flutter 的核心竞争力是 Impeller,因为跨平台框架不是系统“亲儿子”,又是自绘方案,那么在性能优化上,特别 iOS 平台,就不得不提到着色器预热或者提前编译。

传统 Skia 需要把「绘制命令」编译成可在 GPU 执行代码的过程,一般叫做着色器编译, Skia 需要「动态编译」着色器,但是 Skia 的着色器「生成/编译」与「帧工作」是按顺序处理,如果这时候着色器编译速度不够快,就可能会出现掉帧(Jank)的情况,这个我们也常叫做「着色器卡顿」。

而 Impeller 正是这个背景的产物,简单说,App 所需的所有着色器都在 Flutter 引擎构建时进行离线编译,而不是在应用运行时编译。

这其实才是目前是 Flutter 的核心竞争力,不同于 Skia 需要考虑多场景和平台通用性,需要支持各种灵活的额着色器场景,Impeller 专注于 Flutter ,所以它可以提供更好的专注支持和问题修复。

当然 Skia 也是 Google 项目,对于着色器场景也有 Graphite 后端在推进支持,它也在内部也是基于 Impeller 为原型去做的改进,所以未来 Skia 也可以支持部分场景的提前编译。

而在鸿蒙平台:华为针对 Flutter 在鸿蒙的适配,在华为官方过去的分享里,也支持了《Flutter引擎Impeller鸿蒙化》。

甚至,Flutter 在类游戏场景支持也挺不错,如果配合 rive 的状态机和自适应,甚至可以开发出很多出乎意料的效果,而官方也有 Flutter 的游戏 SDK 或者 Flame 第三方游戏包支持(如下图所示)。

最后,那么 Flutter 的局限性是什么呢?其实也挺多的,例如:

  • 1)文字排版能力不如原生;

  • 2)PC平台推进交给了 Canonical 团队负责,虽然有多窗口雏形,但是推进慢;

  • 3)不支持官方热更新,shorebird 国内稳定性一般;

  • 4)内存占用基本最高;

  • 5)Web 只支持 wasm 路线;

  • 6)鸿蒙版本落后主版本太多;

  • 7)不支持小程序,虽然有第三方实现,但是力度不大;

  • 8)····。

所以,Flutter 适合你的场景吗?

4、React Native

如果你很久没了解过 RN ,那么 2025 年的 RN 会超乎你的想象,可以说 Skia 和 WebGPU 给了它更多的可能。

动图封面

RN 的核心之一就是对齐 Web 开发体验,其中最重要的就是 0.76 之后 New Architecture 成了默认框架,例如 Fabric, TurboModules, JSI 等能力解决了各种历史遗留的性能瓶颈。

比如:

  • 1)JSI 让 RN 可以切换 JS 引擎,比如 Chakra、v8、Hermes,同时允许 JS 和 Native 线程之间的同步相互执行;

  • 2)全新的 Fabric 取代了原本的 UI Manager,支持 React 的并发渲染能力,特别是现在的新架构支持 React 18 及更高版本中提供的并发渲染功能,对齐 React 最新版本,比如 Suspense & Transitions;

  • 3)Hermes JS 引擎预编译的优化字节码,优化 GC 实现等

  • 4)TurboModules 按需加载插件

  • 5)····

另外现在新版 RN 也支持热重载,同时可以更快对齐新 React 特性,例如 React 19 的 Actions、改进的异步处理等 。

而另一个支持就是 RN 在 Skia 和 WebGPU 的探索和支持,使用 Skia 和 WebGPU 不是说 RN 想要变成自绘,而是在比如「动画」和「图像处理」等场景增加了强力补充。

还有是 React Native 开始引入 WebGPU 支持,其效果将确保与 Web 端的 WebGPU API 完全一致,允许开发者直接复制代码示例的同时,实现与 Web Canvas API 对称的 RN Canvas API。

最后,WebGPU 的引入还可以让 React Native 开发者能够利用 ThreeJS 生态,直接引入已有的 3D 库,这让 React Native 的能力进一步对齐了 Web。

最后,RN 也是有华为推进的鸿蒙适配,会采用 XComponent 对接到 ArkUI 的后端接口进行渲染,详细可见《鸿蒙版 React Native 正式开源》。

而在 PC 领域 RN 也有一定支持,比如微软提供的 windows 和 macOS 支持,社区提供的 web 和 Linux 支持,只是占有并不高,一般忽略。

而在小程序领域,有京东的 Taro 这样的大厂开源支持,整体在平台兼容上还算不错。

当然,RN 最大的优势还在于成熟的 code-push 热更新支持。

那么使用 RN 有什么局限性呢?

最直观的肯定是平台 UI 的一致性和样式约束,这个是 OEM 框架的场景局限,而对于其他的,目前存在:

1)第三方库在新旧框架支持上的风险

2)RN 版本升级风险,这个相信大家深有体会

3)平台 API 兼容复杂度较高

4)0.77 之后才支持 Google Play 的 16 KB 要求

5)可用性集中在 Android 和 iOS ,鸿蒙适配和维度成本更高

6)小程序能力支持和客户端存在一定割裂

7)····

事实上, RN 是 Cordova 之后我接触的第一个真正意义上的跨平台框架,从我知道它到现在应该有十年了,那么你会因为它的新架构和 WebGPU 能力而选择 RN 么?

5、Compose Multiplatform

Compose Multiplatform(CMP) 近期的热度应该来自 Compose Multiplatform iOS 稳定版发布 ,作为第二个使用 Skia 的自绘框架,除了 Web 还在推进之外, CMP 基本完成了它的跨平台稳定之路。

Compose Multiplatform(CMP) 是 UI,Kotlin Multiplatform (KMP) 是语言基础。

CMP 使用 Skia 绘制 UI ,甚至在 Android 上它和传统 View 体系的 UI 也不在一个渲染树,并且 CMP 通过 Skiko (Skia for Kotlin) 这套 Kotlin 绑定库,进而抹平了不同架构(Kotlin Native,Kotlin JVM ,Kotlin JS,Kotlin wasm)调用 skia 的差异。

所以 CMP 的优势也来自于此,它可以通过 skia 做到不同平台的 UI 一致性,并且在 Android 依赖于系统 skia ,所以它的 apk 体积也相对较小,而在 PC 平台得益于 JVM 的成熟度,CMP 目前也做到了一定的可用程度。

其中和 Android JVM 模式不同的是,Kotlin 在 iOS 平台使用的是 Kotlin/Native,Kotlin/Native 是 KMP 在 iOS 支持的关键能力,它负责将 Kotlin 代码直接编译为目标平台的机器码或 LLVM 中间表示 (IR),最终为 iOS 生成一个标准 .framework,这也是为什么 Compose iOS 能实现接近原生的性能。

实现鸿蒙支持目前主流方式也是 Kotlin/Native ,不得不说 Kotlin 最强大的核心价值不是它的语法糖,而是它的编译器,当然也有使用 Kotlin/JS 适配鸿蒙的方案。

所以 CMP 最大的优势其实是 Kotlin,Kotlin 的编译器很强大,支持各种编译过程和产物,可以让 KMP 能够灵活适配到各种平台,并且 Kotlin 语法的优势也让使用它的开发者忠诚度很高。

不过遗憾的是,目前 CMP 鸿蒙平台的适配上都不是 Jetbrains 提供的方案,华为暂时也没有 CMP 的适配计划,目前已知的 CMP/KMP 适配基本是大厂自己倒腾的方案,有基于 KN 的 llvm 方案,也有基于 Kotlin/JS 的低成本方案,只是大家的路线也各不相同。在小程序领域同样如此。

另外现在 CMP 开发模式下的 hot reload 已经可以使用,不过暂时只支持 desktop,原理大概是只支持 jvm 模式。

而在社区上,klibs.io 的发布也补全了 Compose Multiplatform 在跨平台最后一步。

这也是 Compose iOS 能正式发布的另外一个原因:

那么聊到这里,CMP 面临的局限性也很明显:

  • 1)鸿蒙适配成本略高,没有官方支持,低成本可能会选择 Kotlin/JS,为了性能的高成本可能会考虑 KN,但是 KN 在 iOS 和鸿蒙的 llvm 版本同步适配也是一个需要衡量的成本;

  • 2)小程序领域需要第三方支持;

  • 3)iOS 平台可能面临的着色器等问题暂无方案,也许未来等待 Skia 的 Graphite 后端;

  • 4)在 Android JVM 模式和 iOS 的 KN 模式下,第三方包适配的难度略高;

  • 5)hotload 暂时只支持 PC;

  • 6)桌面内存占用问题;

  • 7)没有官方热更新条件;

  • 8)kjs、kn、kjvm、jwasm 之间的第三方包兼容问题;

  • 9)····

相信 2025 年开始,CMP 会是 Android 原生开发者在跨平台的首选之一,毕竟 Kotlin 生态不需要额外学习 Dart 或者 JS 体系,那么你会选择 CMP 吗?

6、Kuikly

Kuikly 其实也算是 KMP 体系的跨平台框架,只是腾讯在做它的时候还没 CMP ,所以一开始 Kuikly 是通过 KMM 进行实现,而后在 UI 层通过自己的方案完成跨平台。

这其实就是 Kuikly 和 CMP 最大的不同,底层都是 KMP 方案,但是在绘制上 Kuikly 采用的是类 RN 的方式,目前 Kuikly 主要是在 KMP 的基础上实现的自研 DSL 来构建 UI ,比如 iOS 平台的 UI 能力就是 UIkit,而大家更熟悉的 Compose 支持,

目前还处于开发过程中:

SwiftUI 和 Compose 无法直接和 Kuikly 一起使用,但是 Kuikly 可以在 DSL 语法和 UI 组件属性对齐两者的写法,变成一个类 Compose 和 SwiftUI 的 UI 框架,也就是 Compose DSL 大概就是让 Kuikly 更像 Compose ,而不是直接适配 Compose。

那么,Kuikly 和 RN 之间又什么区别?

  • 1)Kuikly 支持 Kotlin/JS 和 Kotlin/Native 两种模式,也就是它可以支持性能很高的 Native 模式;

  • 2)Kuikly 实现了自己的一套「薄原生层」,Kuikly 使用“非常薄”的原生层,该原生层只暴露最基本和无逻辑的 UI 组件(原子组件),也就是 Kuikly 在 UI 上只用了最基本的原生层 UI ,真正的 UI 逻辑主要在共享的 Kotlin 代码来实现:

通过将 UI 逻辑抽象到共享的 Kotlin 层,减少平台特定 UI 差异或行为差异的可能性,「薄原生层」充当一致的渲染目标,确保 Kotlin 定义的 UI 元素在所有平台上都以类似的方式显示。

也就是说,Kuikly 虽然会依赖原生平台的控件,但是大部分控件的实现都已经被「提升」到 Kuikly 自己的 Kotlin 共享层,目前 Kuikly 实现了 60% UI 组件的纯 Kotlin 组合封装实现,不需要 Native 提供原子控件。

另外 Kuikly 表示后续会支持全平台小程序,这也是优势之一。

最后,Kuikly 还在动态化热更新场景, 可以和自己腾讯的热更新管理平台无缝集成,这也是优势之一。

那么 Kuikly 存在什么局限性?

首先就是动态化场景只支持 Kotlin/JS,而可动态化类型部分:

  • 1)不可直接依赖平台能力;

  • 2)不可使用多线程和协程;

  • 3)不可依赖内置部分。

其他的还有:

  • 1)UI 不是 CMP ,使用的是类 RN 方式,所谓需要稍微额外理解成本;

  • 2)不支持 PC 平台;

  • 3)基于原生 OEM,虽然有原子控件,但是还是存在部分不一致情况;

  • 4)在原有 App 集成 Kuikly ,只能把它简单当作如系统 webview 的概念来使用。

另外,腾讯还有另外一个基于 CMP 切适配鸿蒙的跨平台框架,只是何时开源还尚不明确。

那么,你会为了小程序和鸿蒙NEXT而选择 Kuikly 吗?

7、Lynx

如果说 Kuikly 是一个面向客户端的全平台框架,那么 Lynx 就是一个完全面向 Web 前端的跨平台全家桶。

目前 Lynx 开源的首个支持框架就是基于 React 的 ReactLynx,当然官方也表示Lynx 并不局限于 React,所以不排除后续还有 VueLynx 等其他框架支持,而 Lynx 作为核心引擎支持,其实并不绑定任何特定前端框架,只是当前你能用的暂时只有 ReactLynx。

而在实现上,源代码中的标签,会在运行时被 Lynx 引擎解析,翻译成用于渲染的 Element,嵌套的 Element 会组成的一棵树,从而构建出UI界面。

所以从这里看,初步开源的 Lynx 是一个类 RN 框架,不过从官方的介绍“选择在移动和桌面端达到像素级一致的自渲染” ,可以看出来宣传中可以切换到自渲染,虽然暂时还没看到。

而对于 Lynx 主要的技术特点在于:

1)「双线程架构」,思路类似 react-native-reanimated ,JavaScript 代码会在「主线程」和「后台线程」两个线程上同时运行,并且两个线程使用了不同的 JavaScript 引擎作为其运行时:

2)另外特点就是 PrimJS,一个基于 QuickJS 深度定制和优化的 JavaScript 引擎,主要有模板解释器(利用栈缓存和寄存器优化)、与 Lynx 对象模型高效集成的对象模型(减少数据通信开销)、垃圾回收机制(非 QuickJS 的引用计数 RC,以提升性能和内存分析能力)、完整实现了 Chrome DevTools Protocol (CDP) 以支持 Chrome 调试器等;

3)“Embedder API” 支持直接与原生 API 交互 ,提供多平台支持。

所以从 Lynx 的宏观目标来看,它即支持类 RN 实现,又有自绘计划,同时除了 React 模式,后期还适配 Vue、Svelte 等框架,可以说是完全针对 Web 开发而存在的跨平台架构。

另外支持平台也足够,Android、iOS、鸿蒙、Web、PC、小程序都在支持列表里。

最后,Lynx 对“即时首帧渲染 (IFR)”和“丝滑流畅”交互体验有先天优势,开发双线程模型及主线程脚本 (MTS) 让 Lynx 的启动和第一帧渲染速度还挺不错。

比如:

  • 1)Lynx 主线程负责处理直接处理屏幕像素渲染的任务,包括:执行主线程脚本、处理布局和渲染图形等等,比如负责渲染初始界面和应用后续的 UI 更新,让用户能尽快看到第一屏内容;

  • 2)Lynx 的后台线程会运行完整的 React 运行时,处理的任务不直接影响屏幕像素的显示,包括在后台运行的脚本和任务(生命周期和其他副作用),它们与主线程分开运行,这样可以让主线程专注于处理用户交互和渲染,从而提升整体性能。

而在多平台上,Lynx 是自主开发的渲染后端支持 Windows、tvOS、MacOS 和 HarmonyOS ,但是不确实是否支持 Linux。

那 Lynx 有什么局限性?

首先:肯定是它非常年轻,虽然它的饼很大,但是对应社区、生态系统、第三方库等都还需要时间成长。

所以官方也建议 Lynx 最初可能更适合作为模块嵌入到现有的原生应用中,用于构建特定视图或功能,而非从零开始构建一个完整的独立应用。

其次:就是对 Web 前端开发友好,对客户端而言学习成本较高,并且按照目前的开源情况,除了 Android、iOS 和 Web 的类 RN 实现外,其他平台的支持和自绘能力尚不明确:

最后:Lynx 的开发环境最好选 macOS,关于 Windows 和 Linux 平台目前工具链兼容性还需要打磨。

总结下来,Lynx 应该会是前端开发的菜,那你觉得 Lynx 是你的选择么?

8、uni-app x

说到 uni-app 大家第一印象肯定还是小程序,而虽然 uni-app 也可以打包客户端 app,甚至有基于 weex 的 nvue 支持,但是其效果只能说是“一言难尽”,而这里要聊的 uni-app x ,其实就是 DCloud 在跨平台这两年的新尝试。

具体来说:就是 uni-app 不再是运行在 jscore 的跨平台框架,它是“基于 Web 技术栈开发,运行时编译为原生代码”的模式,相信这种模式大家应该也不陌生了,简单说就是js(uts) 代码在打包时会直接编译成原生代码。

甚至极端一点说:uni-app x 可以不需要单独写插件去调用平台 API,你可以直接在 uts 代码里引用平台原生 API ,因为你的代码本质上也是会被编译成原生代码,所以 uts ≈ native code ,只是使用时需要配置上对应的条件编译(如 APP-ANDROID、APP-IOS)支持。

import Context from"android.content.Context";
import BatteryManager from"android.os.BatteryManager";

import { GetBatteryInfo, GetBatteryInfoOptions, GetBatteryInfoSuccess, GetBatteryInfoResult, GetBatteryInfoSync } from'../interface.uts'
import IntentFilter from'android.content.IntentFilter';
import Intent from'android.content.Intent';

import { GetBatteryInfoFailImpl } from'../unierror';

/**
* 获取电量
*/
exportconst getBatteryInfo : GetBatteryInfo = function (options : GetBatteryInfoOptions) {
const context = UTSAndroid.getAppContext();
if (context != null) {
const manager = context.getSystemService(
Context.BATTERY_SERVICE
) as BatteryManager;
const level = manager.getIntProperty(
BatteryManager.BATTERY_PROPERTY_CAPACITY
);

let ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
let batteryStatus = context.registerReceiver(null, ifilter);
let status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
let isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;

const res : GetBatteryInfoSuccess = {
errMsg: 'getBatteryInfo:ok',
level,
isCharging: isCharging
}
options.success?.(res)
options.complete?.(res)
} else {
let res = new GetBatteryInfoFailImpl(1001);
options.fail?.(res)
options.complete?.(res)
}
}

比如上方代码:通过 import BatteryManager from "android.os.BatteryManager"可以直接导入使用 Android 的 BatteryManager对象。

可以看到,在 uni-app x 你是可以“代码混写”的,所以与传统的 uni-app 不同,uni-app 依赖于定制 TypeScript 的 uts 和 uvue 编译器。

具体是:

1)uts 和 ts 有相同的语法规范,并支持绝大部分 ES6 API ,在编译时会把内置的如Array、Date、JSON、Map、Math、String等内置对象转为 Kotlin、Swift、ArkTS 的对象等,所以也不需要有 uts 之类的虚拟机,另外 uts 编译器在处理特定平台时,还会调用相应平台的原生编译器,例如 Kotlin 编译器和 Swift 编译器。

2)uvue 编译器基于 Vite 构建,并对它进行了扩展,大部分特性(如条件编译)和配置项(如环境变量)与 uni-app 的 Vue3 编译器保持一致,并且支持 less、sass、ccss 等 CSS 预处理器,例如 uvue 的核心会将开发者使用 Vue 语法和 CSS 编写的页面,编译并渲染为 ArkUI。

而在 UI 上,目前除了编译为 ArkUI 之外,Android 和 iOS 其实都是编译成原生体系,目前看在 Android 应该是编译为传统 View 体系而不是 Compose ,而在 iOS 应该也是 UIKit ,按照官方的说法,就是性能和原生相当。

所以从这点看,uni-app x 是一个类 RN 的编译时框架,所以,它的局限性问题也很明显,因为它的优势在于编译器转译得到原生性能,但是它的劣势也是在于转译。

具体是:

  • 1)不同平台翻译成本较高,并不支持完整的语言,阉割是必须的,API 必然需要为了转译器而做删减,翻译后的细节对齐于优化会是最大的挑战;

  • 2)iOS 平台还有一些骚操作,保留了可选 js 老模式和新 swift 模式,核心是因为插件生态,官方表示 js 模式可以大幅降低插件生态的建设难度, 插件作者只需要特殊适配 Android 版本,在iOS和Web端仍使用 ts/js 库,可以快速把 uni-app/web 的生态迁移到 uni-app x;

  • 3)生态支持割裂,uni-app 和 uni-app x 插件并不通用;

  • 4)不支持 PC;

  • 5)HBuilderX IDE;

  • 6)·····

那么,你觉得 uni-app x 会是你跨平台选择之一么?(详见《uni-app x的鸿蒙NEXT开发指南》)

9、本文小结

最后,我们简单做个总结:


什么,你居然看完了?事实上我写完都懒得查错别字了,因为真的太长了。

10、参考资料

[1] 快速了解新一代跨平台桌面技术——Electron

[2] Electron初体验(快速开始、跨进程通信、打包、踩坑等)

[3] vivo的Electron技术栈选型、全方位实践总结

[4] 蘑菇街基于Electron开发IM客户端的技术实践

[5] 融云基于Electron的IM跨平台SDK改造实践总结

[6] 网易云信基于Electron的IM消息全文检索技术实践

[7] 得物基于Electron开发客服IM桌面端的技术实践

[8] 新QQ桌面版为何选择Electron作为跨端框架

[9] 全面解密新QQ桌面版的Electron内存优化实践

[10] 快速对比跨平台框架Electron、Flutter、Tauri、React Native等

[11] 环信基于Electron打包WebIM桌面端的技术实践

[12] 万字长文详解QQ Linux端实时音视频背后的跨平台实践

[13] 从理论到实践,详细对比Electron和Tauri的优劣

技术交流:

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM

- 开源IM框架源码:github.com/JackJiang201备用地址点此) (本文已同步发布于:http://www.52im.net/thread-4843-1-1.html)


过去的20-30年,经济发展,物价飞涨,人们生活水平明显提高。手里捂着的哪些东西变值钱了呢,感觉最深的无非房子、股票这些,如果重生到1995年,你会买哪些东西作为长期投资?

首先是房地产,1995年时,北京的房价差不多3、4千一平米,2022年达到了10万一平米,涨幅25倍;如果是四合院,那涨幅能有上百倍。但是投资房地产,需要大量现金,很多人达不到门槛,总不能只投资一个厕所吧。虽然总共只需要50-100万的资金,但是那时的工资都还不到每月1000元。

1995年北京房价

门槛低的投资物品,有古董,珠宝,奢侈品,白酒等等,我们简单看一下他们的涨幅:

古董除非捡漏入手,如果以市场价交易,20多年涨幅约20倍,前提是不要打眼,买到能升值的;珠宝里面拿翡翠钻石为例,只有高端翡翠才有投资价值,极品翡翠20多年的涨幅大概是50-100倍,但是极品翡翠讲究缘分,不是想买就有得买的,而且圈子不大,个人交易或者拍卖都很麻烦;钻石的涨幅只有几倍,可以忽略。

琳琅满目的投资物品

奢侈品和邮票,不是一个长期稳定的投资品,邮票除了个别像81年猴票那样的奇葩,涨幅10万倍,其余大概是几倍到10倍,而且邮票收藏圈子更小,价格并不是一直稳步增长,到一定时间就停止甚至回落,并且很难出手套现。

80庚申年猴票

奢侈品更适合短期投资,而且需要相当的专业知识,根据市场不断更新轮换,像劳力士绿水鬼、迪通拿这些热度很高的涨幅小几倍,也不适合长期捂在手里等升值,最近不就大跌了么。

劳力士绿水鬼

再来说说白酒,1995年飞天茅台260一瓶,一个月工资能买2-3瓶;现在3000一瓶,一个月工资也差不多能买2-3瓶,很友好。

贵州茅台

有没有涨幅特别高的投资品呢?有!1990年海南黄花梨2000元一吨,现在900万一吨,涨价4500倍!这是由于其稀缺性和它的实用价值,加上一部分炒作的成分。回顾下来确实是一个值得投资的东西,但红木中也就唯它独尊,其它品种就差远了。

海南黄花梨海南黄花梨

最后说说股票,20-30年上市到现在暴涨的股票:恒瑞医药涨价200倍以上,贵州茅台200倍,伊利股份300倍以上,山西汾酒超过400倍,云南白药近500倍,泸州老窖超800倍,福耀玻璃1700倍,格力电器2400倍,万科涨了2900倍。股票投资门槛低,资金灵活,以价值投资的角度,选择前景好的公司长期持有,不在意短时的起起落落,或多或少,总有丰厚的回报。

最后讲个笑话,1995年一个人斥巨资屯了一批BP机,结果发现不断降价,他就不断补货降低成本,有人收购也不肯卖,10年后退市了;2005年有人大学填报了BP机维修专业,结果还没毕业就失业了。炒股的朋友手里有一直下跌需要不断补仓的股票,前景不看好的就果断割肉了吧;炒ST股的,如果没有对标的的深度研究和自信判断,还是不要去碰运气了,不然就像别人说的,在连续剧里活不过第2集。

年代久远的BP机