在互联网的鸿蒙时代,JavaScript的运行效率是非常低下的,只能用来做一些很简单的交互计算工作。在那个时候,如果有人想要把应用搬到网页上去,首选还是链接到本地程序执行。初代浏览器厂商显然也意识到了这一情况,微软提出了ActiveX框架,而其他家使用的则是网景提出的NPAPI框架,可以让本地程序与浏览器进行互操作。这一机制,被后世称为插件,流行的插件生态,有Adobe的Flash、Sun的Java applet和微软的Silverlight等。
相对于只能使用操作系统提供的原生API开发本地程序,插件技术的发展算是一个进步,实现了跨平台和跨浏览器的开发能力。但同时,插件机制作为一个商业上的妥协,也存在严重的安全隐患。由于插件厂商良莠不齐,通常不能很快地修复安全漏洞,且不同于可以随时联网更新的浏览器,插件生态的更新依赖于操作系统,即使发布了新的版本,也难以快速惠及用户。
2005年起,Google开始大面积使用AJAX技术,推动了网络应用的普及。到2008年,为了确保自己的网络应用能够在PC上顺畅运行,索性推出了载有全新V8引擎的Chromium浏览器。由于V8的速度很快,各大浏览器厂商纷纷效仿,改善的用户体验使得网络应用进一步繁荣起来。
而另一面,苹果公司2007年推出的iPhone及其Safari浏览器不支持任何插件,甚至第一代也不支持任何非预装的本地软件,彻底断掉了插件生态的活路。2010年,乔帮主更是发布了那篇著名的檄文《Thoughts on Flash》,将还在开发中的HTML5生态列为Flash的替代者。软件界一呼百应,开始了转向HTML5的盛大长征。
然而,插件生态培养起来的数百万程序员,并不会一夜之间掌握前端的开发语言。为了承接这十余年累积的海量遗产,浏览器界也是各尽所能。Google提出了NaCl计划,意在以更安全的沙盒环境运行NPAPI代码。而Mozilla则推出了asm.js,可以将原生代码编译为JavaScript代码。Mozilla的方案显然更为优雅,毫无悬念地,一俟Firefox验证其概念可行之后,微软、Google们毫不犹豫地放弃了自己的方案转为支持asm.js,四大浏览器厂商通力合作,将其标准化为WebAssembly。
与asm.js不同,WebAssembly并非是JavaScript的子集,而是一门全新的提供了JavaScript接口的汇编语言。同其它汇编语言一样,很少有人会直接写作汇编代码,而是将其作为高级语言的编译对象。Mozilla开源的编程语言Rust自带的编译器rustc便提供这种能力,而C等其他语言的开发者则可使用同样基于LLVM的工具集Emscripten做到这一点。由于浏览器的广泛支持,WebAssembly业已成为用高级语言开发网络应用的事实标准。尽管,那一批程序员逐渐老去,新一代程序员更熟悉的,已经是纯JS生态下的Angular、React和Vue了。