乐趣区

关于html:简单介绍下各种-JavaScript-解析器

作者:桑田

各种 js 解析器是前端工程化的基石,能够说如果没有它,很多工程化都无奈失常执行,咱们每天用到的 babel、webpack、eslint、TypeScript 背地都须要一套对应的 js 解析器,明天咱们来看看,目前市场上有哪些罕用的解析器,他们各自又领有什么个性尼?

前言

在说 js 解析器前,咱们须要先理解下 ESTree 这个我的项目,这个我的项目的初衷通过社区的力量,保障和 es 标准的一致性,通过自定义的语法结构来表述 JavaScript 的 AST,起初随着知名度越来越高,多位出名工程师的参加,使得变成了事实意义上的标准,目前这个库是 Mozilla 和社区一起保护的。

如果没有 AST 标准,那么也就意味着根本无法造出对应的解析器,而如果 AST 标准不对立,一些相应的工具库就不能很好的互通有无,比方 webpack 就无奈失常的应用 babel 相干插件。

正是因为 EsTree 的定义的标准,所以当初所有的 js 解析器或者编译器,基本上都绕不开它,如果你有志于本人写一个 js 解析器,那它的文档你肯定须要读一遍。

一。出名的 JS 解析器

1.1 uglify-js (11.2k☆)

创作工夫:2010-8-1
作品地址:https://github.com/mishoo/UglifyJS
作者介绍:Mihai Bazon,Lisp 程序员,Emacs 爱好者,貌似是罗马尼亚人
作者博客:

  • https://github.com/mishoo
  • http://lisperator.net/

**
用于混同和压缩代码,因为一些起因,uglify-js 本人[外部实现了一套 AST 标准[1]](http://lisperator.net/blog/ug…,也正是因为它的 AST 是借鉴的,不是规范的 ESTree,es6 当前新语法的 AST,都不反对,所以没有方法压缩最新的 es6 的代码,如果须要压缩,能够用相似 babel 这样的工具先转换成 ES5。

uglify-js 曾经进行到 3 版本了,前两个版本都是 Mihai Bazon 保护,但当初最新的 3 版本是 alexlamsluglify-js 曾经进行到 3 版本了,前两个版本都是

uglify-js 能够通过 –acorn 或者 –spidermonkey 指定对应的 parsing

1.2 Esprima (6k☆)

创作工夫:2011-11-20
作品地址:https://github.com/jquery/esprima
作者介绍:ariya 印尼人,在德国取得博士学位,目前住在硅谷山景城,创立了世界上第一个真正的无头 Web 浏览器 PhantomJS。也为 WebKit, KDE, 和 Qt 奉献过很多代码
作者博客:

  • https://ariya.io/about
  • https://github.com/ariya

这是 第一个用 JavaScript 编写的合乎 EsTree 标准的 JavaScript 的解析器,后续多个编译器都是受它的影响,集体感觉它的呈现具备历史意义。

1.3 acorn (6.8k☆)

创作工夫:2012-9-23
作品地址:https://github.com/acornjs/acorn
作者介绍:Marijn Haverbeke,同时也是富文本编辑器 prosemirror(4.8k)、浏览器代码编辑器 CodeMirror(21.7k)的作者,另外他还出版了一本书《Eloquent JavaScript》,并且这本书在网上也有 https://eloquentjavascript.net/,目前国内也翻译了这本书,不过只有第二版《JavaScript 编程精解》,也有人目前寓居在德国柏林。
作者博客:

  • https://marijnhaverbeke.nl/
  • https://github.com/marijnh

acorn 和 Esprima 很相似,输入的 ast 都是合乎 EsTree 标准的,目前 webpack 的 AST 解析器用的就是 acorn,和 Esprima 一样,也是也不间接反对 JSX

须要提一下的是,[acorn 的 es6 语法反对 RReverser 奉献了大半[2]](https://rreverser.com/added-e…

1.4 @babel/parser(babylon)

创作工夫:2012-9-23
作品地址:https://github.com/babel/babel/tree/master/packages/babel-parser

babel 官网的解析器,最后 fork 于 acorn,起初齐全走向了本人的路线,从 babylon 改名之后,其构建的插件体系十分弱小。

1.5 espree (1.3k☆)

创作工夫:2014-11-30
作品地址:https://github.com/eslint/espree
作者:Nicholas C. Zakas,多本 js 书籍,其中《红宝书 第三版》最为出名,eslint 也是他创立的,在 2016 年被查出莱姆病,目前曾经很长时间没有工作了,如果有趣味的话,能够去 github 下面捐献他,捐献页面链接。
作者博客:

  • https://github.com/nzakas
  • https://humanwhocodes.com/

eslint、prettier 的默认解析器,最后 fork 于 Esprima 的一个分支(v1.2.2),起初因为 ES6 的疾速倒退,但 Esprima 短时间内又不反对,前面就基于 acorn 开发了。

1.5 TypeScript

创作工夫:2014-7-6
作品地址:https://github.com/microsoft/TypeScript/tree/master/src/compiler
作者:这个是 microsoft 的 Anders Hejlsberg 领导创立的,他也是是 C#、Delphi、Turbo Pascal 的作者

当初很多大型项目,首选就是 TypeScript,它的解析器是就在我的项目内 src/compiler/parser.ts,TypeScript 和其余我的项目有一个最大的不同,就在于

以上的库,实质上都是基于 js 来写的,还有一些库,还有一些非凡的 js 解析器,如果有须要也能够理解下

二。其余有意思的解析器

2.1 sucrase (2.9k☆)

创作工夫:2017-9-24
作品地址:https://github.com/alangpierce/sucrase
作者:Alan Pierce,就任于 benchling,这是一家专门给生命科学家提供软件合作的公司。
作者博客:

  • https://github.com/alangpierce

这是 @babel/parser 的一个子集,如果你确定的代码不须要兼容 IE 浏览器,就能够用这个解析器,依照他的介绍,其解析速度目前来说应该是最快的。

2.2 swc (10.1k☆)

创作工夫:2017-12-17
作品地址:https://github.com/swc-project/swc
作者:강동윤,他是一个 97 年的小萌新,目前还在读大二,rust 的狂热爱好者,开源了很多 rust 相干的我的项目,为此往年 8 月份 Deno 官网给了他一份参谋合同。
作者博客:

  • https://github.com/kdy1
  • https://kdy1.github.io/

用的 rust 编写的 js 编译器,单核比 babel 快 4 倍,4 核比 babel 快 70 倍,也能够用来打包 js、ts 代码,并且也领有 tree shaking 性能,它的默认的配置文件 spack.config.js 和 webpack.config.js 保持一致,@swc/cli 成心与 @babel/cli 想同,看来野心十分大。

它的指标就是替换 babel,目前它曾经实现了 babel 的大部分性能,[具体能够看对照表[3]](https://swc.rs/docs/compariso…

2.3 esbuild (16.5k☆)

创作工夫:2020-1-1
作品地址:https://github.com/evanw/esbuild/
作者:Evan Wallace,始终从事 webGL 方面的相干的开发,目前就任于 Figma
集体博客:

  • https://github.com/evanw
  • http://madebyevan.com/

esbuild 是用 go 编写的下一代 web 打包工具,它领有目前最快的打包记录和压缩记录,snowpack 和 vite 的也是应用它来做打包工具,为了谋求卓越的性能,目前没有将 AST 进行裸露,也无奈批改 AST,无奈用作解析对应的 JavaScript。

目前它的 star 在所有我的项目中增长最为迅速。

三。其余一些驰名的工具库

3.1 recast (3.4k☆)

创作工夫:2012-9-16
作品地址:https://github.com/benjamn/recast
作者:Ben Newman,recast 作者,TC39 成员,目前寓居于纽约布鲁克林地区
集体博客:

  • https://github.com/benjamn
  • https://www.quora.com/profile/Ben-Newman

如果你须要重构你的代码,那么这个库将会是你的第一抉择,它能够同时应用多种解析器,并且能够自定义传入须要的解析器,是重构利器。

3.2 jscodeshift (5.9k☆)

创作工夫:2015-3-22
作品地址:https://github.com/facebook/jscodeshift
作者:Felix Kling。
集体博客:

  • https://github.com/fkling
  • https://felix-kling.de/

jscodeshift 底层依赖于 recast,在其根底上封装了遍历、操作 AST 的办法,使得更加便,如果你须要间接操作 AST 来构建新的性能,我感觉这个是最合适的抉择。

目前来说 fkling 曾经来到了 Facebook,目前这个库的次要维护者曾经不是他了

3.2 ASTExplorer (3.6k☆)

创作工夫:2014-6-29
作品地址:https://github.com/fkling/astexplorer
作者:Felix Kling

如果你须要对代码进行重构或者进行 AST 的剖析,那么 https://astexplorer.net/ 这个网站应该能够很好的帮忙你,它是一个可视化的 AST 浏览工具,十分棒。

目前还不反对 SWC,然而曾经有人提了对应的 pr,还没有合并

参考文献

  • 1. uglify-js 为什么用 SpiderMonkey AST
  • 2. RReverser 为 acorn 奉献了大部分 es6 标准实现
  • 3. swc 实现的 babel 性能对照图

对 Electron 感兴趣?请关注咱们的开源我的项目 Electron Playground,带你极速上手 Electron。

咱们每周五会精选一些有意思的文章和音讯和大家分享,来掘金关注咱们的 晓前端周刊。


咱们是好将来 · 晓黑板前端技术团队。
咱们会常常与大家分享最新最酷的行业技术常识。
欢送来 知乎、掘金、Segmentfault、CSDN、简书、开源中国、博客园 关注咱们。

退出移动版