Cloudflare、Mozilla 和 Facebook 开发 BinaryAST 以加速 JavaScript 加载

来自 Cloudflare、Mozilla、Facebook 和 Bloomberg 的工程师 提供 新格式 二进制AST 在浏览器中打开网站时加快 JavaScript 代码的交付和处理速度。 BinaryAST 将解析阶段移至服务器端并提供已经生成的抽象语法树(AST)。 收到 BinaryAST 后,浏览器可以立即进入编译阶段,绕过解析 JavaScript 源代码。

用于测试 准备好的 根据 MIT 许可证提供的参考实现。 Node.js 组件用于解析,优化和 AST 生成的代码是用 Rust 编写的。 浏览器端支持
BinaryAST 已经可用 每晚构建 火狐。 BinaryAST 中的编码器既可用于最终站点工具级别,也可用于在代理或内容交付网络一侧打包外部站点的脚本。 目前,工作组的BinaryAST标准化进程已经开始 ECMA TC39,之后该格式将能够与现有的内容压缩方法共存,例如 gzip 和 brotli。

Cloudflare、Mozilla 和 Facebook 开发 BinaryAST 以加速 JavaScript 加载

Cloudflare、Mozilla 和 Facebook 开发 BinaryAST 以加速 JavaScript 加载

处理 JavaScript 时,大量时间花费在代码的加载和解析阶段。 考虑到许多流行网站上下载的 JavaScript 量接近 10 MB(例如,LinkedIn - 7.2 MB、Facebook - 7.1 MB、Gmail - 3.9 MB),JavaScript 的初始处理会带来明显的延迟。 浏览器端的解析阶段也会变慢,因为在代码加载时无法完全动态构建 AST(浏览器必须等待代码块完成加载,例如函数结束,才能获取解析当前元素时缺少的信息)。

他们试图通过以最小化和压缩的形式分发代码以及缓存浏览器生成的字节码来部分解决该问题。 在现代网站上,代码经常更新,因此缓存只能部分解决问题。 WebAssembly 可能是一种解决方案,但它需要显式输入代码,并且不太适合加速现有 JavaScript 代码的处理。

另一种选择是提供现成的编译字节码而不是 JavaScript 脚本,但浏览器引擎开发人员反对这种做法,因为第三方字节码难以验证,其直接处理会导致 Web 分层,产生额外的安全风险,并且开发需要通用字节码格式。

BinaryAST 允许您适应当前的代码开发和交付模型,而无需创建新的字节码或更改 JavaScript 语言。 BinaryAST 格式的数据大小与压缩后的 JavaScript 代码相当,并且通过消除源文本解析阶段,处理速度显着提高。 此外,该格式允许在加载 BinaryAST 时编译为字节码,而无需等待所有数据完成。 此外,在服务器端解析允许您从返回的 BinaryAST 表示中排除未使用的函数和不必要的代码,这在浏览器端解析时会浪费时间解析和传输不必要的流量。

BinaryAST 的一个功能还在于能够恢复与原始版本不完全相同的可读 JavaScript,但在语义上是等效的,并且包含相同名称的变量和函数(BinaryAST 保存名称,但不保存有关位置的信息)代码、格式和注释)。 硬币的另一面是新的攻击向量的出现,但根据开发人员的说法,它们比使用替代方案(例如字节码分发)时要小得多且更可控。

对 facebook.com 代码的测试表明,解析 JavaScript 会消耗 10-15% 的 CPU 资源,并且解析比生成字节码和 JIT 初始代码生成花费更多时间。 在SpiderMonkey引擎中,完全构建一个AST的时间需要500-800毫秒,而BinaryAST的使用使这个数字减少了70-90%。
总体而言,对于大多数 Web Fireworks,使用 BinaryAST 时,在不进行优化的模式下,JavaScript 解析时间减少了 3-10%,在启用忽略未使用函数模式时,JavaScript 解析时间减少了 90-97%。
运行 1.2 MB JavaScript 测试集时,使用 BinaryAST 可以将桌面系统 (Intel i338) 上的启动时间从 314 毫秒加快到 7 毫秒,在移动设备 (HTC One M2019) 上从 1455 毫秒加快到 8 毫秒。

来源: opennet.ru

添加评论