在很久以前,高级编程语言还没出来的时候,硬件和软件其实是深度绑定,定制开发的。
随着高级编程语言的出现,以及操作系统的市场收敛,才有了跨平台开发这个概念的出现。
再往后,就是 Google 的 Chrome 推出,占领了 Web 技术的话语权,Web、Chrome、Google 三者共同发展了二十年左右,慢慢的,Web 成了高性价比跨平台开发技术的重要选择之一。
直到移动端的出现,除了 Safari(Webkit)这种与原生视图进行了深度绑定,Android 上的 Webview 技术仍然基于独立的绘制引擎,过深的技术路径,也导致了 Webview 技术在 Android 设备上的性能并不够好。当然 IOS 也没好到哪去,但至少它的技术路径使得它更容易做一些优化。再叠加安全防护的问题,导致一些高性能需求的软件,更不可能在 Mobile-Web 上落地,因此移动端上,更多是回归了原生开发或者混合开发(Native 为基础,部分场景使用 Web 或者 Web-Like 的混合开发)。
这里有必要要谈一下 WASM: 即便现在 WASM 的出现,它也只是画了一个大饼给开发者,但本质上,它们的性能并没有全面超越 js,因为它本质上只是给静态语言提供了一个编译目标,相比编译成 js,编译器的输出与 wasm 的指令更加贴近。但相比直接在 js 上开发,js 的性能和 wasm 的性能并没有太多差距,即便是一些算法相关的层面也是如此。目前 WASM 相关的大量提案还在逐步跟进,但是进展相对缓慢,但本质上它的意义只是能让其它编程语言不需要生产 js,而是直接编译成 wasm,从而进行 Web 开发。因此 WASM 并不是完全取代 JS,只能说给 Web 生态提供了更多的可能。
但在画了饼中,WASM 加入了一些更接近硬件的指令集,所以它的未来,至少在一些并行计算方面是可以超越 JS 的,当然这部分的工作更可能会被 WebGPU 给取代。
不过,WASM 有一个 JS 无法取代的优势,就是关于多线程的提案,它会比 WebWorker 更加的底层,具有更多的优化潜力。并且目前多核设备已经是标配,所以未来 WASM 可能真的会依靠多线程技术,取代 JS 开发的一些场景(在开发成本基本不变的基础上,提升应用性能)。
因为 Mobile-Web 客观的阻碍,所以跨平台开发,更多的变成了 Android+IOS+Desktop 这样的概念。
不过,在 Web 技术的发展的过程中,给开发者带来了一系列的开发工具套件,这些工具使得 Web 开发的体验远超任何其它编程语言的体验。这也就导致了即便 Web 性能上限不佳或者说难以优化,但是它的开发成本极低,迭代速度极快,仍然成立很多产品的选择方向,或者是魔改的方向,当然,也可能是“发展”的方向。
国内厂商大多选择“魔改”,其实“魔改”和“发展”,其实就在于它的开放程度与簇拥程度。你只要足够的开放,并且吸纳社区的建议,那么就是“发展”,否则通常会被人们嘲弄成“KPI 项目”。因此哪怕国内其实有很多厂商在做类似的发展,哪怕也开源了,但是没有和全球开发者接轨,没有听取他们的意见,仍然以自家开发者和产品需求为基础去推进项目,那么难免不被嘲讽。
这里举一些正向的发展例子,比如:react-native、ark-ui。
先说 react-native,它算是在 Web 的生态和标准上发展起来的,首先它由 react 的声明式的开发所孵化,引入了 jsx 语法,颠覆了过往布局文件和控制代码拆分开的模式。这也启发了一个全新的 UI 开发纪元,可以看到后来的 flutter、compose、swiftui、ark-ui 都是类似的开发方案。它的工作原理非常的聪明,是一种生成器的运作模式,以至于它的渲染性能可以优化得非常彻底。虽然它在 Web 上性能并不怎么样,这是因为 Web-DOM 所提供的接口是命令式的接口,但是在原生平台上,绘制本身就是一个只需不断的循环程序,加持上编程语言的优化,它的性能潜力非常巨大的,因此各家操作系统厂商都选择这个长远的方案。
现在 react-native 发展到了一定的程度,开始了 react-strict-dom 的发展,可以说它在做一种 mini-web 的标准:提取了 Web 的主要技术标准,做为一个现代 UI 开发的最小标准,将它移至到 Android/IOS 平台上。这样引擎标准将会更加干净通用,从而为跨平台提供了更多的可能性,未来新的原生平台,只需要根据这个小标准集合进行适配即可。这点本质上也是在解决我前文提到的 Mobile-Web 的痛点:过剩的技术路径,导致难以优化。现在有了 react-strict-dom,似乎这样的 Web 又可以作为一个跨平台标准了。
说完 react-native,再说 dart+flutter,它和 Web 平台有很深的渊源。首先是 dart 语言一开始是要更 typescript 做竞争的,所以本身它和 js 语言就非常的相似,再者是它的定位实在根 ts 太像了,引入了类型安全。不同的是,dart 有自己的 runtime,当初 chrome 甚至尝试直接集成了 dart-runtime,同时 v8 共存,想解决 js 的语言问题导致的性能瓶颈,且不说是否存在垄断的嫌疑,至少 WASM 是一个更加开放且更具长远未来的选择,因为大家知道,性能问题并不能通过某一个编程语言来解决,像 WASM 这种提供底层指令集,是一种更加彻底的解决方案。
为此,dart 被 chrome 抛弃后,这个项目几乎就快要结束了,这时候 flutter 这个项目拯救了它,因为恰好 flutter 需要一个跨平台的编程语言,索性把 dart 语言团队拉进来,一同发展 flutter。一开始 flutter 的底层是 skia,所以 flutter+dart,你可以类比成 html-canvas+js,只不过 flutter+dart 的技术路径更加清澈,所以当然不会有 html-canvas+js 的障碍,性能问题直接上 C++来解决。并且因为它开箱即用的 Weight 组件,以及和 js 相似的语法,使得大家对它的接受度出奇的高。几年下来,逐渐就发展成了一个跨平台开发的强力工具。现在它在 Web 上的渲染性能越来越好,当然这也是依赖 WASM 的发展,是的 dart 语言能编译成 wasm 而不是 js,从而获得更高的性能。渲染层面也从原来的 skia 发展成了现在的 impeller(目前支持 Android/iOS/Desktop,未来也会加入对 WebGPU 的支持)。
再有就是 ark-ui,它进一步糅合了 dart、swiftui、kotlin,直接在 ts 语法上进一步改造。它直接把 ts 当 dart 用,用自己的方舟引擎替代 dart-runtime。同时它的 API 设计,也是大量参考了 Web-API 的安全考虑。