上个世纪90年代,有两个兄弟,他们看到互联网风起云涌,马上就要爆发,决定投身其中,干出一番事业。
他们俩仔细研究了当时互联网的入口,即浏览器,发现了一个重大的问题:
浏览器能做的事情太有限,就是展示文字+图片的网页,最多执行一点儿可怜的JavaScript。
相比于功能强大、界面漂亮,有极强交互的桌面应用程序,这实在是太简陋、太差劲了!
两兄弟想到:能不能把桌面应用程序“搬”到浏览器中呢?
以后大家只要打开浏览器,就可以听音乐、看视频、玩游戏、办公、做图像处理……桌面能做的一切,浏览器都可以干。
具体该怎么实现呢?
插件!!
给浏览器装插件,然后从网络上下载代码来执行。
1
不过,两兄弟走了不同的道路,老大绑定了微软,改名为ActiveX。
老二去了Sun,和Java眉来眼去,改名为Applet。
他们的目的也确实达到了,不信你看看这些应用,哪里像一个网页,完全就是桌面应用(90年代)嘛。
如果这么发展下去,就没有后来的Vue,ReactJS什么事情了。
前端工程师用的编程语言不会是JavaScript,而是C#/VB.NET/Java。
坏就坏在两兄弟有着致命的缺陷。
两兄弟当中,老大ActiveX的能力最强,能访问计算机的所有资源——这是程序员喜欢的能力,却是用户害怕的能力。
想想看,你打开一个包含ActiveX控件的网站,按照IE的提示把ActiveX从网络上下载到浏览器,结果这个ActiveX控件把你硬盘上的文件删除了,吓人不?
更有些流氓ActiveX控件,赖到你浏览器中,怎么赶都赶不走,如3721。
所以,如果是公司自己开发的ActiveX控件,运行在局域网中,这是个不错的选择。
如果一旦进入广阔的、野蛮的互联网,ActiveX就太吓人了。
老二Applet则聪明得多,他宣称自己运行在Java沙箱中,根本没法访问本地计算机的资源。
但是Applet需要Java运行环境(JRE),JRE又大又复杂,如果浏览器没有JRE,需要网络下载,非常缓慢。
Java的GUI界面也非常丑陋,吓跑了无数人。
再加上ActiveX和Applet不是开放标准,没法获得其他大佬的支持,两兄弟慢慢淡出了大家的视野,在浏览器中运行复杂应用的第一次努力失败了。
Web页面继续平淡无奇,运行在浏览器中的依然是HTML+CSS,和一点儿简单的JavaScript。
2
转折点是Google的GMail, Google Maps,大家发现:卧槽,用JavaScript也能做出交互这么良好的应用啊,还用啥Java,用啥VB, 用啥C++啊!
于是,JavaScript火了。
浏览器要执行的JavaScript越来越多,负担越来越重,响应越来越慢。
Google又把两兄弟的理想给捡了起来:Web不仅仅是网页,而是应用。
只不过,此应用再也不是封闭的ActiveX, Applet,而是开放的JavaScript、HTML、CSS。
Google还为这种应用专门打造了一个浏览器Chrome,用V8引擎把JavaScript编译成类似Java的字节码,高效率执行。
JavaScript一路狂飙,jQuery、Angular、React、Vue等框架如雨后春笋冒出。
相应地,Web能做的事情也越来越复杂,很多应用都可以在浏览器中运行了。
3
但是JavaScript毕竟是个动态语言,无论如何优化,面对性能要求很高的应用时,还是力不从心。
例如3D 游戏、CAD、软件模拟/仿真、虚拟和增强现实、计算机视觉、图像/视频编辑以及许多其他需要本机性能的应用,在Web中运行是非常吃力的。
此外,下载、解析和编译非常大的 JavaScript 应用程序的成本可能令人望而却步。
浏览器需要一种能力:
- 执行一种特殊的代码,要能达到接近本机的速度
- 一定得安全,可以在安全沙盒中运行,还有有浏览器的同源策略和权限策略。
- 和浏览器中的其他Web技术(如JavaScript)协作。
这就是浏览器的汇编语言:Web Assembly(WASM)。
不过,这次不再用两兄弟时代的插件了,而是在浏览器中内置了一个虚拟机(VM),既能执行JavaScript,又能执行WASM。
JavaScript负责简单的交互,WASM负责高性能的部分。两者密切配合,完美。
并且,各种编程语言都可以写代码,编译成WASM:
以后你想用某个应用,只需要浏览器中输入网址,立刻开始使用,不用安装。
和别人分享也非常的方便,发个link就行了。
4
不知道ActiveX和Applet两兄弟看到此处会何感想,他们最早提出了在Web中运行桌面应用,绝对是先驱,就是过于超前,成先烈了。
但是Web技术还是沿着他们俩的愿景走了下去,浏览器的能力越来越强,也许真的有一天,所有的应用都被搬到了浏览器中。
那将是一场伟大的变革!