1个不稳定版本
使用旧的Rust 2015
0.2.1 | 2018年11月22日 |
---|
#595 in 压缩
在binjs_es6中使用
280KB
5.5K SLoC
关于JavaScript二进制AST
随着网站变得更加复杂,JavaScript源代码的数量也在不断增加。虽然依赖大型JavaScript代码库不会阻止网站工作,但它会导致网站启动缓慢——通常难以接受地慢。这是因为两个瓶颈:解析和编译JavaScript的字节码。不幸的是,浏览器在这两个操作上已经接近了效率的顶峰。
我们(Mozilla、Bloomberg、Facebook、CloudFlare)目前正在开发一个针对JavaScript的领域特定编码,称为"BinAST"("JavaScript二进制AST"的缩写)。JavaScript二进制AST旨在打破这个瓶颈。当前的先进原型已经显示出所有最常用框架的JS 解析性能提升了30%-50%,只需改变格式即可,我们相信我们可以进一步提高这个改进。这种编码可以作为webdev工具链的一部分构建,或由代理或CDN注入,从而无需更改原始网站即可自动提高最终用户的性能。
这种编码目前正在JavaScript TC39标准化过程中[3]。它可以与现有的压缩技术(gzip、brotli等)一起使用
测试它
- 安装依赖项(您需要
npm
,rustup
)
npm install
rustup install nightly
rustup default nightly
- 拉取代码。
git clone https://github.com/binast/binjs-ref
- 压缩/解压缩。
cargo run --bin binjs_encode -- --help
cargo run --bin binjs_decode -- --help
注意 JS解析器可能会在非常大的JS源代码文件上卡住。如果是这样,您需要设置环境变量NODE_MAX_OLD_SPACE_SIZE=xxxx
。这将指示基于Node的解析器分配更多内存。默认值是2048(Mb)。这相当于传递--max_old_space_size
到Node进程。
- 转储树结构。
cargo run --bin binjs_dump -- --help
注意 binjs_dump
仅支持multipart
格式。
与JavaScript源代码的兼容性
保留
- 良好结构的程序语义;
- 变量和函数名称。
未保留
- 语法错误的实际语义;
- 源代码位置;
- 格式化(包括空格和分号);
- 注释(包括源映射)。
预期收益
二进制AST格式设计得比JS源更快解析,这得益于无需回溯的语法、不需要多次intern的字符串等。
二进制AST格式设计得使虚拟机能够在接收到文件的前几个字节后立即开始解析文件(流式解析),并在之后不久开始编译为字节码(流式字节码编译)。
此外,解析JS源指定了特定的编码,这意味着在解析之前(或最好是在解析过程中)需要转码许多编码,这会减慢解析速度。由于BinAST是二进制格式,因此不需要任何形式的转码。
最后,大多数现代JavaScript虚拟机支持一种形式的懒解析,它通过减少内存分配进行更快的解析。BinAST格式设计得可以更有效地进行懒解析,如果需要,允许解析器通过单个操作跳过(函数)。
规范
依赖关系
~11MB
~339K SLoC