Cloudflare支持JavaScript新格式BinaryAST,加速加载网页应用程序

Cloudflare在其云计算无服务器Cloudflare Workers上支持最新的JavaScript格式BinaryAST,以大幅缩短网页应用程序代码解析的时间。BinaryAST目前仍未为完全稳定,几个月前的Firefox Nightly版本加入支持,而现在Cloudflare则在Worker中的JavaScript引擎支持BinaryAST。

由于现在网页应用程序功能越来越丰富,也就需要靠更多的JavaScript程序代码堆栈,网页观测服务HTTPArchive显示,平均网页会加载350KB的JavaScript,甚至有10%的页面使用超过1MB,更复杂的应用程序,甚至还会使用容量大上许多的JavaScript。而在设备上加载JavaScript的速度主要受两个因素影响,网络下载速度以及JavaScript程序代码解析与编译的时间,但由于网络速度越来越快,后者逐渐成为影响效率的主要因素。

当JavaScript第一次加载到设备中的时候,在执行之前,JavaScript程序代码需要经过解析,以确保程序代码语法正确,再将其编译为字节码,Cloudflare表示,影响这个过程的速度,取决于设备CPU与内存的性能,以1MB的JavaScript文件来说,现代设备可能在100毫秒就能解析完成,但在老旧设备像是Moto G4,却需要1秒钟。

为此,Cloudflare、Mozilla、脸书以及彭博工程师共同合作,开发了新的线上格式BinaryAST,目的是要加快解析速度,又能同时完整的保有JavaScript原始语义,其使用了高效的二元码表示法以及数据结构,并通过存储和提供额外的信息,预先给给解析器指示,完成快速解析JavaScript的目的。

过去传统浏览器会将JavaScript解析为抽象语法树(Abstract Syntax Trees,AST),作为程序代码执行步骤描述,接着再将其编译成机器代码或是由客户端JIT编译器执行,而新的BinaryAST格式允许部分文件解析,浏览器得以优先解析需要启动的程序代码,而这个动作将为解析器省下不少工作量。

现代浏览器常用延迟解析(Lazy Parsing)技术,以预先准备、跳过或是延迟解析程序代码内函数,以减去步骤降低解析时间,但延迟解析存在一些预先准备的成本,像是需要手动标记函数,且在错误标记函数的状况,反而会增加执行成本等状况,但在BinaryAST中,浏览器可以使用经过分析和验证的JavaScript,以无成本的方式执行延迟解析。

另外,Cloudflare指出,由于ES6+有一些模糊的语法,在程序代码完全解析之前,函数都会处于模糊的状态,而要解决这个问题,浏览器通常必须要进行回溯,但这样又会造成指数等级的性能下降,或是通过中介节点类型的解法,以维持线性性能,却会大大增加实例困难度,但在BinaryAST中则不存在这个问题,因为BinaryAST在解析完成之前就会优先披露节点类型。

目前BinaryAST雏形由Cloudflare与Mozilla实例,先通过解析器将JavaScript程序代码转成AST,并使用编码器标记注释以产生最终BinaryAST文件。Cloudflare使用的方案由解析器与编码器两部分组成,JavaScript实例的解析器,负责产生初始的AST文件,而编码器是以Rust撰写,负责获取AST文件,注释需要的相关消息。

所有的Cloudflare网站都支持BinaryAST,用户可以使用工具预先进行JavaScript程序代码标码,然后在Cloudflare使用BinaryAST Worker,当浏览器发出特殊请求时,BinaryAST Worker就能送出相关BinaryAST文件给客户端,但客户端目前仍只能使用Firefox Nightly版本,并需要先在about:config中激活BinaryAST支持。