今天很多人已经把这些词当成了默认现实:
React NativeFlutterElectronPWA- 小程序
Tauri
好像只要产品一上多端,团队就一定会认真讨论一次:
能不能少写几份代码?
可很少有人会先问一句:
为什么“一套代码到处跑”这件事,明明这么多年从来没真正圆满过,却还是会每隔几年就以一套新名字重新复活一次?
为什么每一代跨端方案刚出来时,都像在宣布旧世界终于要结束了:
- 有的说统一运行时
- 有的说统一 Web 技术栈
- 有的说统一 UI 心智
- 有的说统一团队组织
可走到最后,它们又几乎都会退回一种更克制、也更现实的说法:
逻辑尽量共享,体验按需原生,差异别再假装不存在。
为什么跨端这件事,表面上看像技术选型, 底下却总能一路连到:
- 平台控制权
- 分发入口
- 审核与支付
- 性能预算
- 团队组织
- 工程复杂度
这套 《跨端江湖》,想讲的就是这些事。
它不是跨端框架教程。
也不是“十分钟看懂 React Native / Flutter / Electron 区别”的速食横评。
它更像一部长剧。
而且是一种特别典型的现代软件长剧:
一开始像统一开发的梦想,中间像运行时和宿主的战争,后来像平台入口之争,到今天又越来越像一场围绕复杂度应该压给谁的长期协商。
你可以先把这套系列记成六幕:
2000s前后,Flash让很多人第一次相信:第三方运行时也许真能把多端统一掉。2009年后,PhoneGap、Cordova、Hybrid把“网页做 App”变成了工业化路线,但也把WebView、桥接和体验摩擦全暴露了出来。2015年,React Native明确告诉行业:别再幻想“写一次到处跑”,更现实的路是先承认宿主差异。- 同一时期,
PWA试图把应用入口从商店拉回 Web,可一旦它太像 App,就会碰到平台边界。 Electron让桌面跨端变成企业现实,也顺手把另一个真相讲得特别直白:很多时候,公司买的不是最省资源的程序,而是最省组织摩擦的程序。- 走到今天,跨端越来越不像“统一一切”的革命,更像“哪些层值得统一、哪些层必须暴露差异”的长期妥协。
这六幕一连起来,你就会发现,这套系列真正想讲的,不是哪家框架后来更火。
而是另一件更大的事:
跨端史不是“一套代码到处跑”的胜利史,而是一代代方案围绕原生能力、平台入口、运行时成本和组织摩擦,不断重新分配复杂度的历史。
这套系列讲什么
我想讲的,不只是:
FlashCordovaReact NativePWAElectron
分别是什么。
更想讲的是底下那几场反复重演的冲突:
- 为什么企业总想用抽象层买效率
- 为什么平台总会用现实边界收回抽象层
- 为什么每一代跨端方案都会先承诺统一,最后又退回分层共享
- 为什么跨端性能从来不只是跑分,而更像“这层抽象还能不能被允许存在”的审判标准
- 为什么很多跨端路线最后不是死在技术不能用,而是死在平台利益、生态维护和组织成本一起变重
- 为什么今天更成熟的跨端,反而更少说“统一一切”
换句话说,这是一套关于 跨端复杂度分配史、平台边界史、运行时权力史,以及企业如何反复为统一开发付费 的系列文章。
这套系列真正要追的,不是框架名单,是复杂度到底该压给谁
如果你退一步看,会发现跨端这些年的很多争论,表面上主角不同,底下其实一直在争几件更硬的事。
01|企业到底愿意花多少钱,来少养几套团队
跨端最底下的一层,从来不是技术浪漫主义。
它首先是经济问题。
因为只要一个团队同时面对这些压力:
- 人力成本太高
- 交付窗口太短
- 多端协作太慢
- 产品一致性要求越来越强
- 招聘市场决定某种技术栈更好扩团队
它就迟早会再次认真问一句:
能不能别为同一套业务逻辑养两三套完全独立的人马?
所以跨端之所以反复出现,不是因为行业爱幻想。
而是因为企业真的会一遍遍想买这份效率。
02|平台差异为什么永远不只是 UI 差异
很多人刚接触跨端时,会天然把多端理解成“多几个皮肤、多几套控件风格”。
可事情根本没这么简单。
不同平台底下真正不一样的,是这些东西:
- 输入模型
- 生命周期
- 宿主能力
- 分发制度
- 审核规则
- 支付边界
- 安全模型
- 平台自己的利益诉求
也就是说,跨端最大的困难从来不只是按钮长得不同。
而是:
不同端其实不是多套外观,而是多套制度。
这也是为什么“一套代码到处跑”总会在现实里被拉回一句更残酷的话:
你到底想统一什么?
03|每一代跨端方案,真正做的不是消灭复杂度,而是转移复杂度
这条线特别关键。
因为如果不看懂这一层,你就很容易把跨端史误会成:
- 老方案失败
- 新方案更先进
- 再下一个方案更接近终局
可真正发生的事更像是:
上一代方案把旧问题吞掉了, 然后又把新问题堆到别的层。
比如:
Flash把浏览器差异吞掉,却把平台控制权问题做大Hybrid把开发门槛压低,却把体验账单交给WebViewReact Native把WebView问题挪走,却把压力转移到桥接、生态和组织协同Electron把桌面开发统一了,却把包体、内存和运行时税摆到了明面上
所以这套系列会反复追问:
同一份复杂度,最后到底被压给了用户设备、开发者、框架作者、平台方,还是公司组织?
04|性能为什么在跨端世界里总像“合法性审判”
很多技术文章谈跨端性能,最容易停在:
- 启动时间
- 动画帧率
- 内存占用
- 包体大小
这些当然重要。
可如果只停在这里,跨端史就会被写浅。
因为在跨端世界里,性能经常不只是产品指标。
它更像一套特别现实的审判标准:
- 这层抽象会不会拖垮体验
- 它有没有资格插在平台和开发者之间
- 平台能不能借“安全与性能”之名把它挡在门外
这也是为什么很多跨端路线的真正命运, 往往不是写在技术白皮书里, 而是写在:
- 电池
- 卡顿
- 审核
- 入口
- 分发
这些东西上。
05|为什么跨端不会有真正终局
很多行业路线最终都会收束成一种大家默认接受的现实。
可跨端大概率不会。
因为跨端要真正终局,至少得同时满足三件事:
- 主要平台能力几乎等价
- 主要平台利益基本一致
- 某种抽象方式既能统一开发,又几乎不制造新的性能与组织成本
这三件事几乎不可能同时成立。
尤其第二件事最难。
平台从来不是纯技术对象。
平台还有:
- 分发利益
- 支付利益
- 安全叙事
- 入口控制
- 与开发者的关系
所以跨端更可能迎来的,不是“终于统一”。
而是:
阶段性稳定。
也就是:
- 业务逻辑层越来越统一
- 设计系统层部分统一
- 渲染层继续分化
- 宿主能力层继续保留差异
- 分发与支付层继续强烈受平台控制
为什么今天的开发者还得关心这些旧账
因为你今天面对的,其实已经不只是一个框架选型表。
你面对的是一整套由跨端历史塑造出来的现实:
- 为什么越来越多团队讨论的不是“要不要跨端”,而是“跨到哪一层”
- 为什么大家一边嫌 Electron 重,一边又不断继续用
- 为什么 React Native 和 Flutter 明明都叫跨端,底下却像两种完全不同的哲学
- 为什么 PWA 永远像差一点,却又永远不会彻底死掉
- 为什么很多现代跨端讨论,最后会滑向平台控制权、支付和分发入口
如果不看这些过程,你就很容易把今天的跨端误会成一组工具对比。
它不是。
它更像一场长期协商:
- 企业想统一
- 平台想控制
- 用户想流畅
- 工程想可维护
而每一代跨端框架, 都只是这四股力量在某个时间点谈出来的一份暂时协议。
看懂这点,你回头再看今天的跨端世界,就会更明白:
跨端最值得写的,不是哪种方案终于赢了,而是为什么这个行业会一遍遍重新发明“统一开发”的承诺,又一遍遍被性能、宿主能力和平台控制权逼回更现实的妥协。
推荐阅读顺序
01|跨端江湖(一):苹果杀死的到底是 Flash,还是开发者绕开平台的权利
先看这篇。它会把跨端这条线从一开始就立成“平台和中间层的战争”,而不是单纯技术兴衰。
02|跨端江湖(二):为什么“网页做 App”最痛的时候,不在 JavaScript,而在 WebView
这一篇最适合把很多人对 Hybrid 的模糊印象,重新落回真实的运行时代价和宿主碎片化。
03|跨端江湖(三):React Native 最重要的历史,不是多像原生,而是它主动放弃了“写一次到处跑”
看懂这篇,你会明白现代跨端为什么越来越像“承认差异”,而不是“消灭差异”。
04|跨端江湖(四):PWA 最尴尬的地方,不是做不到像 App,而是一旦太像 App 就会碰到 App Store
这篇会把开放 Web 路线和平台入口权的冲突讲透。
05|跨端江湖(五):Electron 为什么明知很重,还是成了桌面跨端的现实答案
这篇最能把“企业买的不是最省资源的程序,而是最省组织摩擦的程序”这层逻辑立住。
06|跨端江湖(六):跨端为什么不会终结,只会继续回到选择性妥协
收束篇。最后会回到一个更现实的问题上:跨端真正稳定下来的,到底不是统一代码,而是统一什么层值得共享。
如果你只想先读三篇
可以先看这三篇:
- 第二篇:看
Hybrid为什么把“统一开发”变成了运行时债务 - 第三篇:看
React Native为什么代表跨端承诺的收缩 - 第五篇:看
Electron为什么说明组织效率有时比资源效率更值钱
这三篇最能把整套系列的脾气读出来。
为什么想写这套
因为今天很多人谈跨端,谈得都太像消费指南了。
大家会问:
Flutter还是React NativePWA还值不值得做Electron会不会太重- 要不要上
Tauri
这些问题当然都重要。
可如果只停在这里,你就会把跨端误会成一套不断更新的框架排行榜。
而我更想写的,是这些问题底下那条真正更长的历史:
- 为什么企业总是忍不住想重新买一次统一开发
- 为什么平台总会在关键时刻提醒你它才是宿主
- 为什么抽象层每次看起来都像在解放开发者,最后却常常又变成新的负担
- 为什么“统一”这个词在软件世界里,往往不是终局,而是一种阶段性议价结果
如果把 框架江湖 写的是谁来定义浏览器端应用结构,
把 前端工程化江湖 写的是谁来接住 Web 应用化之后爆炸出来的交付复杂度,
那 跨端江湖 要写的,就是:
当企业、平台、用户体验和工程复杂度都不肯退的时候,大家到底怎样围着“统一开发”这件事,一轮轮重新谈条件。
先记住:跨端真正稳定下来的,不会是“一套代码到处跑”,而是“共享能共享的,暴露必须暴露的”
如果你平时把跨端理解成效率工具,这套系列也许会让你第一次认真意识到:效率从来不是白来的。
如果你平时把跨端理解成技术折衷,这套系列也许会让你更明白:
很多折衷并不是技术做不好,而是平台、分发、性能和组织这几笔账,本来就不可能同时算得特别漂亮。
所以看这套《跨端江湖》,最好别总盯着“下一代框架是谁”。
那只是牌桌上的名字在换。
真正一直没换的,是那道老题:
企业想少养几套人,平台不想让出解释权,用户不肯为抽象层税无限买单,工程团队又总想把重复劳动压下去。
谁也不肯退,跨端就不会停。
所以它从来不只是框架更替史。
它更像软件世界里一场反复换人、但从不散场的长期谈判。
关键人物速览
- Steve Jobs:理解平台为什么会排斥第三方跨平台层,绕不开他。
- Kevin Lynch:理解 Adobe 当年怎样把跨平台自由写成自己的正当性,绕不开他。
- Tom Occhino / Sophie Alpert:理解 React Native 为什么主动缩窄承诺,绕不开他们。
- Gabriel Peal / Airbnb 移动团队:理解跨端如何从技术问题外溢成组织问题,绕不开这条线。
- Slack 工程团队:理解 Electron 为什么不是“无知地重”,而是“有意识地权衡”,他们的材料非常关键。
参考与延伸阅读
Thoughts on Flash
https://web.archive.org/web/20100502021750/http://www.apple.com:80/hotnews/thoughts-on-flash/Introducing React Native
https://legacy.reactjs.org/blog/2015/03/26/introducing-react-native.htmlUpdate on apps distributed in the European Union
https://developer.apple.com/support/dma-and-apps-in-the-eu/Reducing Slack’s memory footprint
https://slack.engineering/reducing-slacks-memory-footprint/Performance | Electron
https://electronjs.org/docs/latest/tutorial/performance