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支援。
