跨平台是桌面开发永恒的命题。从早期的 Java "Write Once, Run Anywhere",到移动时代的 React Native、Flutter、小程序,再到 PWA 的渐进式 Web 理念,跨平台方案层出不穷,但"一次编写,到处运行"的理想至今未能完美实现。
许式伟对跨平台开发有一个核心判断:Web 开发是桌面开发的未来。但这个判断不是基于技术优劣,而是基于商业和生态演进的必然——正如 DOS 取代 Unix、Windows 取代 OS/2,胜出的往往不是技术最优的方案,而是生态最繁荣的方案。
本节将系统梳理跨平台技术方案的分类与权衡,并给出架构层面的选择建议。
跨平台的本质是在不同操作系统之上建立一层抽象。根据抽象层次的不同,跨平台方案可以分为三类:
要点解读:跨平台的核心是在不同操作系统之上建立一层抽象,依抽象层次高低可分为应用框架层、Web 层与底层库三层,抽象越靠近系统则越贴近原生、性能越高,但跨平台能力也越弱。
| 流派 | 代表方案 | 抽象层次 | 跨平台范围 | 性能 | 生态 |
|---|---|---|---|---|---|
| Web 方案 | PWA、H5 | 最高(浏览器级别) | 全平台 | 中等 | 最大 |
| 小程序方案 | 微信/支付宝/快应用 | 较高(类Web定制框架) | 各小程序平台 | 中等 | 国内大 |
| 应用框架方案 | React Native / Flutter / Qt | 中等(UI框架级别) | 移动端/桌面端 | 较高 | 中等 |
| 底层库方案 | C/C++ 跨平台库 | 最低(系统调用封装) | 全平台 | 最高 | 最小 |
在第22讲中,我们讨论了 MVC/MVP/MVVM 的演进。在 Web 环境下,这一演进有了新的形态——MVMP(Model-ViewModel-Presenter)。
MVMP 的关键洞察:
要点解读:跨平台方案各自在性能与生态之间权衡——Native 性能最优但生态封闭,Flutter 用自绘引擎逼近原生性能,React Native 依托 JS 生态,Web 方案生态最大而性能中等。
要点解读:选型决策树以"覆盖范围—性能—离线—团队技术栈—目标平台"层层展开,最终在 Native、Flutter、React Native、PWA、小程序与 C/C++ 底层库之间做出取舍。
要点解读:跨平台收益随时间边际递减,代价却随抽象层增多而累积——平台特性难用尽、性能损失、抽象泄漏、框架停更与多层调试都是长期成本。
这不是技术判断,而是商业与生态的判断。理由如下:
Trade-off:Web 方案在性能和平台特性利用上不如 Native,但在开发效率、分发效率和人才供给上具有压倒性优势。对于大多数应用场景,这个 Trade-off 是有利的。
从第22讲的架构分析可知,Model 层是最底层、最稳定、最与平台无关的层。因此:
技术选型的第一考量不是"哪个框架更优雅",而是:
| 约束维度 | 关键问题 |
|---|---|
| 目标用户 | 用户在哪个平台上?国内还是国际? |
| 团队能力 | 团队擅长什么技术栈?学习成本可接受吗? |
| 性能需求 | 是否有音视频/游戏/大型计算等高性能场景? |
| 商业模式 | 是否依赖平台生态(支付、账号、分发)? |
| 长期维护 | 框架的可持续性如何?厂商是否可能停更? |
国内小程序市场已分裂为微信、支付宝、快应用、头条等多个平台,标准不统一。应对策略:
WebAssembly(WASM)有望打破浏览器的语言限制,使得 C/C++/Rust 等语言编写的核心逻辑可以直接在浏览器中运行。这意味着:
七牛的产品覆盖服务端 SDK、客户端 SDK 和 Web 控制台。其跨平台策略是:
某电商公司为了"统一技术栈",将成熟的 iOS/Android 原生应用用 Flutter 重写。结果:
教训:跨平台的价值在于新项目的效率提升,而非已有项目的重写。已有的 Native 应用应逐步引入跨平台组件,而非推倒重来。
Taro 是京东凹凸实验室推出的多端统一开发框架,支持微信/支付宝/百度/头条等小程序和 H5。其核心思路是:
这种方案有效缓解了小程序碎片化问题,但仍有边界——某些平台特有 API 无法完全抽象。
某团队为了让 Web 应用"看起来像 Native",用 CSS 模拟了 iOS 原生控件的样式。结果:
教训:Web 应用应该拥抱 Web 的交互范式,而非模拟 Native。用户并不关心应用是 Web 还是 Native——他们关心的是体验是否流畅、功能是否完整。
交叉引用:本章的 MVMP 模式是第23讲中浏览器架构颠覆的直接延伸,选型建议的架构基础来自第22讲的 MVC 分层分析。Web 开发趋势的进一步讨论见第25讲。