作者:桑田
各种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、简书、开源中国、博客园 关注咱们。