本文由DCloud 公司创始人王安原创发布于CSDN,原题《小程序技术演进史》,即时通讯网收录时有改动,感谢原作者。
1、引言
微信的成功,并非特定于某个具体的功能,微信的成功实际上是一大批创新技术和体验的成功合集,这也是它为何如此难此被超越的根本原因。
作为微信这个超级社交应用中最为亮眼的技术之一——微信小程序,俨然已成历移动端小程序的代名词,很多人一提起“小程序”3个字就条件反射式地认为是微信小程序。事实是,小程序技术并非微信独创,它的出现和演进,实际上包含了一大批各类公司、各产品技术先驱们的努力。
实际上,早在微信小程序之前,有力推轻应用的百度,有来自 HTML5 中国产业联盟的 DCloud 所主张的流应用,但最终却都已经淹没在了移动互联网的历史长河之中。唯有微信小程序风生水起,更是带动了巨头们的争相入场。
小程序迎来了专属于中国移动互联网的群雄逐鹿的时代。
本文作者王安即是流应用的创造者,作为移动领域的老兵,他依然在矢志不移地构建移动开发工具框架及生态,从原生应用到 HTML5 再到如今的小程序,他是这段历史的见证者、参与者。
本篇文章,将为你盘点移动端小程序技术的前世今生。通过本文,我们能够鲜活地看到小程序的技术演进历程,以及对于所有开发者来说,终将去往何处。
![](https://upload-images.jianshu.io/upload_images/1500839-8f147e6a9af39012.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/563/format/webp)
(本文同步发布于:http://www.52im.net/thread-2645-1-1.html)
2、关于作者
![](https://upload-images.jianshu.io/upload_images/1500839-71af3c7e320b497c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/180/format/webp)
王安:DCloud 公司创始人,HTML5 中国产业联盟秘书长。2003 年开始从事移动互联网工作,十几年编程和商业经验,连续创业者。曾任北京市学联主席,毕业后创办 DCloud 公司。兴趣爱好:编程、颠覆式创新。
3、相关文章
《最火移动端跨平台方案盘点:React Native、weex、Flutter》
《盘点主流移动端跨平台UI技术:实现原理、技术优劣、横向对比等》
4、中国特色的移动互联网时代
伴随着 QQ 小程序 面向用户开放,这个手机端月活 7 亿的巨无霸正式入场。小程序,终于成为了超级 App 的标配。
盘点下已经支持小程序的超级 App:
微信、企业微信、QQ、支付宝、高德地图、手机淘宝、百度、百度贴吧、百度地图、今日头条、抖音……
这些璀璨耀眼的名字,背后都是巨大的流量。
在这群超级 App 的支持下,中国的移动互联网格局被彻底改变。
这个有中国特色的移动互联网时代,被称为“小程序时代”。
这是继手机支付后,中国的移动互联网领先世界的第二个代表事物。
中国的技术标准、开发者生态,第一次得到大规模的普及应用,而且很明显,小程序在功能和体验上均超过了 HTML5。
中国人能建立开发者生态吗?这个命题曾一度让人怀疑。
小程序完成了这一步突破,这是一场值得歌颂的中国技术生态发展史。
让我们来回顾下这场技术生态革命,是如何开始,又将要去向何方。
5、罗马不是一天建成的,小程序也不是一天发明出来的
HTML5 于 2007 年在 W3C 立项,与 iPhone 发布同年。
乔布斯曾期待 HTML5 能帮助 iPhone 打造起应用生态系统。
但 HTML5 的发展速度并不如预期,它虽然成功地实现了打破 IE+Flash 垄断局面的目标,却没有达到承载优秀的移动互联网体验的地步。
于是在 iPhone 站稳脚跟后,发布了自己的 App Store,开启了移动互联网的原生应用时代。
随后的 Android,本来是基于 Linux 的 OS,与之同期的 MeeGo 等竞争对手采用 C + HTML5 的双模应用生态策略,然而 C 的开发难度太大,HTML5 体验又不行。Android 依靠 Java 技术生态,在竞争中脱颖而出。
于是:在移动互联网初期,应用生态被定了基调 —— 原生开发。
在那个时候,硬件不行,也没有其他办法,原生开发才能在低配硬件上带来商用体验。
但大家都在怀念 HTML,那种无需安装更新、即点即用,直达二级页面的特点,一直让人迷恋。
![](https://upload-images.jianshu.io/upload_images/1500839-067235da890eda0a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/520/format/webp)
国内有一批做浏览器的厂商,尝试去改进 HTML5,他们提出了轻应用的概念。
通过给 WebView 扩展原生能力,补充 JS API,让 HTML5 应用可以实现更多功能。
不过这类业务没有取得成功,HTML5 的问题不止是功能不足,性能体验是它更严重的问题,而体验问题,不是简单地扩展 JS 能力能搞定的。
这类业务发展的顶峰,是微信的 JS SDK。
作为国内事实上最大的手机浏览器,微信为它的浏览器内核扩充了大量 JS API,让开发者可以用 JS 调用微信支付、扫码等众多 HTML5 做不到的功能。
![](https://upload-images.jianshu.io/upload_images/1500839-0210d1e6658a8819.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/943/format/webp)
▲ 微信 JS SDK 说明文档
但微信团队对这套方案的体验仍然不满意,微信钱包栏目里打车、理财等很多应用虽然嵌入了 JS SDK,但每次点击要等半天白屏,让人用着很痛苦,他们在业内开始寻找新的解决方案。
业内早有专业团队看到了相同的问题。
与浏览器不同,Hybrid 应用是另一个细分领域。它们为开发者提供使用 JS 编写跨平台应用的工具,为了让 JS 应用更接近原生应用的功能体验,这个行业的从业者做出了很多尝试。
笔者所在的 DCloud 即是其中之一,我们提出了改进 HTML5 的“性工能”障碍的解决方案 —— 通过工具、引擎优化、开发模式调整,让开发者可以通过 JS 写出更接近原生 App 体验的应用。
多 WebView 模式,原生接管转场动画、下拉刷新、Tab 分页,预载 WebView……各种优化技术不停迭代,终于让 Hybrid 应用取得了性能体验的突破。
Hybrid 应用和普通的轻应用相比,还有一个巨大的差别:一个是 Client/Server,一个是 Browser/Server。简单来说,Hybrid 应用是 JS 编写的需要安装的 App,而轻应用是在线网页。
C/S 的应用在每次页面加载时,仅需要联网获取 JSON 数据;而 B/S 应用除了 JSON 数据外,还需要每次从服务器加载页面 DOM、样式、逻辑代码,所以 B/S 应用的页面加载很慢,体验很差。
可是这样的 C/S 应用虽然体验好,却失去了 HTML5 的动态性,仍然需要安装、更新,无法即点即用、直达二级页面。
那么 C/S 应用的动态性是否可以解决呢?对此,我们提出了流应用概念,把之前 Hybrid 应用里的运行于客户端的 JS 代码,先打包发布到服务器,制定流式加载协议,手机端引擎动态下载这些 JS 代码到本地,并且为了第一次加载速度更快,实现了应用的边下载边运行。
就像流媒体的边下边播一样,应用也可以实现边用边下。
在这套方案的保障下,终于解决了之前的各种难题:让 JS 应用功能体验达到原生,并且可即点即用、可直达二级页面。
如今看来,这已经变成了常识。但在当年,先驱们做了无数艰辛探索。
这套技术,需要让客户端引擎提前预置在手机上,就像流媒体的普及,建立在 Flash 的装机量巨大的基础上,那么普及这个客户端引擎就变得很重要。
2015 年,360 和 DCloud 合作,在 360 手机助手里内嵌了这个客户端引擎,推出了业内第一个商用的小程序,360 称之为 360 微应用。
微应用实现了在 360 手机助手的应用下载页面,同时出现了“秒开”按钮,点击后直接使用。
并且在 360 手机助手的扫码里,应用的分享里,都实现了扫码获得一个应用,点击分享消息获得一个应用。
![](https://upload-images.jianshu.io/upload_images/1500839-b25f0488477b8a0f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/540/format/webp)
▲ 在 360 手机助手 3.4 版本中上线的中国第一个小程序
为了做大生态,DCloud 把这套技术标准,捐献给了 HTML5 中国产业联盟,随后,联盟开始推动更多的超级 App 和手机厂商加入,共同推进动态 App 产业的发展。
然而事情并不顺利,巨头们有自己的利益诉求。虽然有一批厂商同意加入联盟共建生态,但最关键的角色,真正的国民应用“微信”,最终决定自立标准、自研引擎,当然技术原理与流应用是基本一致的。
2016 年 1 月 11 日,微信公开课,张小龙罕见露面,公布了微信应用号的计划,为这个大事件亲自站台。
2016 年 9 月 21 日,微信宣布更名应用号为小程序,面向首批开发者内测。从此,这个词被正式定了下来,“小程序”,成为后续一个时代的代名词。而“流应用”、“微应用”则淹没在历史长河中成为一个令人唏嘘的故事。
2017 年 1 月 9 日,微信公开课,小程序面向用户正式推出。
从此后,阿里巴巴、手机厂商联盟、百度、今日头条,陆续推出了自己的小程序平台,其中也有很多波折与故事,在有偶然、有必然的过程中,形成了今天的局面。
小程序大潮卷入了更多人,并形成了更大的浪潮,最终迎来了不可逆转的小程序时代。
6、生态难,难于上青天
发明能解决功能体验和动态性的技术方案,虽然难,但不是最难的事情。
最难的是开发者生态的建设。
最初 HTML5 中国产业联盟的策略是在 HTML5 上扩展强化,复用现有的 HTML5 生态。
当微信的标准完全自立重建时,业内人士都悬着一颗心。
在全球,基于 Web 的技术生态已经非常成熟,各种开发工具、框架、组件、模板...提升着开发者的效率。
小程序丢弃了国际标准组织 W3C 的 DOM 和 Window 标准,仅仅采用基础 JavaScript。这意味着 HTML5 生态的各种轮子无法复用,要完全重造一个新的小程序开发生态。
当初微信推广 JS SDK 时,是那么地顺其自然,开发者纷纷开始使用,因为对于开发者,只是在他们的 H5 版本上补充一些 API 而已。
而小程序初期,充满了开发者的质疑声:我的业务迭代那么久,让我重新做一个版本,你的生态到底能不能支撑我的投入?
微信用持续而快速的版本升级、高管的站台,告诉大家微信做小程序的决心,并最终通过 2017 年底的跳一跳,引爆了小程序。
从此大家的问题不再是我要不要做小程序了,而转向了:既然要做,怎么才能提升小程序的开发效率、降低开发成本?
任何一种技术,或者开发模式的演进,在不断成熟的过程中,都遵循着类似的成熟规律:
技术标准 -> 基础平台 -> 开发工具 -> 培训市场 -> 框架诞生 -> 周边生态逐步完善 -> 轮子之上的轮子
在 HTML5 生态里,已经发展到最终极的形态,比如 Vue 是一个重要框架,而基于 Vue 的各种丰富的 UI 库、测试框架,则是轮子之上的轮子。
多层轮子代表着生态的繁荣,也意味着开发者的开发效率更高。
可微信的全新标准出现时,它把开发者推回了原始社会,一切都要重来。
这在当时看来,并不是一个必然会成功的事情(其实直到现在,比如图表类轮子,小程序仍然比不过 HTML5)。
时至今日,讨论这个标准的选择对错已经没有意义。当支付宝、百度、今日头条都开始参考这个标准做小程序时,时代已经不可阻挡。
所幸,最终的结果是,中国人做成了。在国际标准之外,在中国,终于建立起了自己的技术生态。
并且这个生态,给用户带来了更好的体验,给开发者带来了更多流量和变现效率的提升,这是一个比 HTML5 更优秀的生态。
7、野蛮的技术生态成长速度
两年时间,中国的小程序开发者如何从原始社会进阶到现代文明?这也是一段有趣的历史。
我们来看看小程序技术生态是如何快速成长,走完上面所说的这套技术成熟路线,也就是从技术标准到轮子之上的轮子的。
在 Web 世界里,已经成熟到了原生 JS 用量很少的时代了,开发人员大量使用 Vue 等框架,并且在 Vue 的基础之上,又有更多轮子。
![](https://upload-images.jianshu.io/upload_images/1500839-d17461fe7d405119.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/688/format/webp)
当中国的开发人员面临重头开始时,他们感受到效率对比的差距,既然时代已不可阻挡,那就拥抱它。勤劳的中国技术人开始蓬勃地建设起了小程序各种周边技术生态。
其中比较重要的是开发框架的迭代,我们看看每个小程序开发框架为什么会诞生、流行和衰落。
最初的微信小程序,一片荒蛮,一份文档 + 一个难用的 IDE,很多效率工具比如 npm、预处理器这些都不支持,而这些已经是大型项目离不开的工具。
于是,第一个标志性的框架出现了 —— WePY。
WePY 紧随微信小程序在 2017 年发布,原本是腾讯其他部门的一个个人工程师的作品。在那个年代,WePY 有效地解决了小程序不支持 npm、预处理器的痛点,被引爆后,腾讯官方才把这个框架收编到官方的 GitHub 下。
![](https://upload-images.jianshu.io/upload_images/1500839-d4f8bc4077fd0e3c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/729/format/webp)
不过 WePY 也面临很多问题,它使用了私有语法,这让它在生态建设上面临很大难度,IDE 着色、语法提示、语法校验、格式化、人员招聘培训等各方面问题制约着它的流行和普及。
面对这些问题,人们开始思考,有什么更好的方式,可以复用现有技术生态来快速完善小程序生态?
这时候下一个重要框架借势诞生,美团前端在 2018 年初开源了 MPVue。
MPVue 采用 Vue 语法来开发小程序,通过对 Vue.js 的底层改造,实现了编译到微信小程序。
MPVue 良好地借助了 Vue 的技术生态,周边工具如 IDE、校验器、格式化等支持直接复用、人员招聘培训等生态建设压力大幅下降,受到了大量开发者的欢迎。
![](https://upload-images.jianshu.io/upload_images/1500839-c3716b336208767f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/717/format/webp)
看着熟悉 Vue 的开发者终于有了趁手的轮子,那熟悉 React 的开发者怎会无动于衷?
京东团队是 React 的重度用户,还自研了 JDreact,于是他们开发了 Taro 框架,一款基于 React 语法编写小程序的框架。
但 Taro 并不是想简单做一个 MPVue 在 React 世界里的翻版,Taro 相比 MPVue,想要解决更多重要问题。
Taro 面世较晚,此时微信、支付宝、百度、头条都已发布或宣传了自己的小程序,开发者面临一个多端开发和适配的问题。
于是 Taro 率先支持多端开发,它甚至还能发布到 H5 和 App。
![](https://upload-images.jianshu.io/upload_images/1500839-7e04008657ea266a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/900/format/webp)
▲ 京东凹凸实验室
当时小程序领域还有一个重要变化,微信开始支持小程序自定义组件。
组件是一个成熟框架不可缺的东西,不管是 Vue 还是 React 都有丰富的组件生态。
在过去,MPVue 时代,是把 Vue 组件也编译成页面模板,这带来一个很大的性能问题,在复杂页面里(比如长列表)使用组件,更新组件状态会导致整个页面的数据全部从 JS 逻辑层向视图层通讯一次,大量数据通讯会非常卡顿。
注意:小程序的逻辑层运行在 V8 或 JSCore 下,和视图层是分离的,通讯阻塞很容易引发性能问题。
于是 Taro 把 React 组件编译为新出的微信小程序自定义组件,这种组件在数据更新时,只会更新组件内部的数据,而不是整个页面更新数据,从而大幅减少了数据通信量。
这一轮的后浪推前浪很猛,Taro 在性能和多端支持上,都超越了 MPVue。
看着 React 阵营取得如此成绩,Vue 阵营自然会继续追击。
我们基于 Vue 开发了 uni-app,它实现了自定义组件编译模式,并在算法上做了很多优化。另外,之前 MPVue 对 Vue 的语法支持度不太完善,比如过滤器等不支持,在 uni-app 中我们进行了解决。
同样,uni-app 也看到了前浪的其他问题:Taro 虽然迈出了多端的第一步,但多端支持能力比较弱,每个平台仍然各自开发大量代码。核心原因,是Taro 在 H5 端和 App 端,并不是一个完整的小程序技术架构,无法保持最大程度的统一。
于是 uni-app 在 App 端,使用了一个技术架构相同的小程序引擎,本身就可以直接运行小程序应用,这个引擎搭配小程序代码打包为 App,开发者一行代码不用改,可以同时发布小程序和 App。
当然,其 App 引擎从 Hybrid 应用起家,它提供的 API 要比小程序多很多,因为 App 的需求会比小程序丰富,它还支持把 WebView 渲染引擎替换为 Weex 渲染引擎。
之后 uni-app 又发布了 H5 版的小程序引擎,原理与小程序的 PC 模拟器相同,实现了良好的跨 H5 版的发布。于是 uni-app 比较完美地实现了开发一次,7 个平台发布。
第一层轮子就这样迅速发展了起来,Web 世界里最成熟的 Vue、React 技术生态被导入了小程序开发生态中。然后轮子之上的轮子开始如火如荼的建设。
以 UI 库为例,之前的 UI 库,有 Vue 库、React 库,有 PC 库、H5 库和小程序库,种类繁多,甚至说混乱。
比如在 Vue 阵营中,Vant 和 iView 这两个 UI 库,都是同时维护两个版本,它们即有 H5 版,又有小程序版。
不止框架作者麻烦,开发者想在多端使用这些 UI 库时,会发现在不同端还需要引入不同的 UI 库,写法都不一样,这让开发者很崩溃。
既然已经可以多端开发应用,于是在多端开发的领域里,开始出现轮子之上的轮子,多端 UI 库。
首先是 Taro 推出了 Taro UI,实现了 H5 和小程序 UI 库的统一,不过可惜 Taro UI 不支持 App 端。
然后 uni-app 推出了 uni UI,这个 UI 库同时支持多家小程序、H5、App。
由于 uni-app 和 MPVue 同属 Vue 阵营,它们的组件是互通的。于是这两家联合举办了一场插件大赛,建立了插件市场。
在中国的前端开发者领域,有很多和国外不一样的地方:一个是国内有小程序,第二个是国内 Vue 的开发者体量远超过 React 和 Angular。这里面很大的原因,是 Vue.js 的作者尤雨溪,是中国人。
![](https://upload-images.jianshu.io/upload_images/1500839-e2915a11ca5d0829.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
▲ Vue 和 React 百度指数对比
在庞大的 Vue 用户体量支持下,uni-app 和 MPVue 的周边生态迅速发展起来,开发工具、周边轮子、教育培训等生态快速完善。目前在 Vue 阵营下,开发者在 Web 生态下所需的轮子,在多端开发下基本也都有了。
短短两年时间,小程序开发生态里几拨迭代,轮子之上的轮子不断涌现,快速进入了成熟期。
8、本文小结
产业还在继续发展,每当底层有重大技术变更时,上层框架世界就会发生新机会。
当年 HTML5 标准不统一,浏览器兼容性问题严重,诞生了 jQurey 的机会。而在移动互联网下半场,浏览器兼容已经不再是核心问题,jQurey 的地位被更适合移动互联网的 Vue 替代。
我们不知道未来还会有什么新的框架出世,但我们知道方向:
对于开发者而言,总是会向着更高的开发效率、更高的性能、更高的投入产出比前进。
对于开发商,目前的小程序,虽然发展了 2 年,但流量增长空间仍然巨大,微信之外,很多超级 App 的势能将逐渐释放,整个小程序产业的日活总量有数亿的提升空间。
如果开发商能追上这拨红利,就能获得更多增长。而多端框架的出现,可以帮助开发商更好的把握这拨红利。
中国的技术发展,此刻正在经历一个分水岭,从全面的技术进口,到开始建设自己的标准和开发者生态。迟早,会开始向外输出,引领世界的进步。
不管中美是否开打贸易战,这一转变都是必须做的事情。
中国的移动支付、小程序、5G,很多领域已经走在了全球前面。中国人发明的 Vue 已经在影响全球。
虽然还有很多困难仍需克服,但我们每个开发者,都是新时代的见证者,更是新生态的建设者!
附录:更多移动端开发精华文章
《全面了解移动端DNS域名劫持等杂症:技术原理、问题根源、解决方案等》
《美图App的移动端DNS优化实践:HTTPS请求耗时减小近半》
《金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)》
《金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)》
《腾讯技术分享:社交网络图片的带宽压缩技术演进之路》
《通俗易懂:基于集群的移动端IM接入层负载均衡方案分享》
《QQ音乐团队分享:Android中的图片压缩技术详解(上篇)》
《QQ音乐团队分享:Android中的图片压缩技术详解(下篇)》
《腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率》
《腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇)》
《腾讯原创分享(三):如何大幅压缩移动网络下APP的流量消耗(下篇)》
《基于社交网络的Yelp是如何实现海量用户图片的无损压缩的?》
《腾讯技术分享:腾讯是如何大幅降低带宽和网络流量的(图片压缩篇)》
《腾讯技术分享:腾讯是如何大幅降低带宽和网络流量的(音视频技术篇)》
《最火移动端跨平台方案盘点:React Native、weex、Flutter》
《盘点主流移动端跨平台UI技术:实现原理、技术优劣、横向对比等》
《小程序技术始于微信?来看看移动端小程序技术的前世今生!》
《iPhone X 的 UI界面适配官方指南!》
《[url=http://www.52im.net/thread-1843-1-1.html]新浪微博技术分享:微博短视频服务的优化实践之路》
《全面掌握移动端主流图片格式的特点、性能、调优等》
《迈向高阶:优秀Android程序员必知必会的网络基础》
《HTTPS时代已来,打算更新你的HTTP服务了吗?》
《移动端APP的日志上报机制的优化实践》
《移动端网络优化之HTTP请求的DNS优化》
《伪即时通讯:分享滴滴出行iOS客户端的演进过程》
《Android版微信从300KB到30MB的技术演进(PPT讲稿) [附件下载]》
《微信团队原创分享:Android版微信从300KB到30MB的技术演进》
《Android程序员的痛你永远不懂(一):Bitmap到底占用多大内存?》
《Android程序员的痛你永远不懂(二):如何减少Bitmap内存占用?》
《Android反编译利器APKDB:没有美工的日子里继续坚强的撸》
《微信团队原创分享:Android内存泄漏监控和优化技巧总结》
《全面总结iOS版微信升级iOS9遇到的各种“坑”》
《微信团队原创资源混淆工具:让你的APK立减1M》
《微信团队原创Android资源混淆工具:AndResGuard [有源码]》
《Android版微信安装包“减肥”实战记录》
《iOS版微信安装包“减肥”实战记录》
《移动端IM实践:iOS版微信界面卡顿监测方案》
《iOS端移动网络调优的8条建议》
《微信“红包照片”背后的技术难题》
《移动端IM实践:iOS版微信小视频功能技术方案实录》
《移动端IM实践:Android版微信如何大幅提升交互性能(一)》
《移动端IM实践:Android版微信如何大幅提升交互性能(二)》
《移动端IM实践:iOS版微信的多设备字体适配方案探讨》
《爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结》
>> 更多同类文章 ……
(本文同步发布于:http://www.52im.net/thread-2645-1-1.html)