简单介绍下各种 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爱好者,貌似是罗马尼亚人
作者博客:
**
用于混淆和压缩代码,因为一些原因,uglify-js自己内部实现了一套AST规范[1],也正是因为它的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贡献过很多代码
作者博客:
这是第一个用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编程精解》,也有人目前居住在德国柏林。
作者博客:
acorn和Esprima很类似,输出的ast都是符合EsTree规范的,目前webpack的AST解析器用的就是acorn,和Esprima一样,也是也不直接支持JSX
需要提一下的是,acorn的es6语法支持RReverser贡献了大半[2]
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上面捐赠他,捐赠页面链接。
作者博客:
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,这是一家专门给生命科学家提供软件协作的公司。
作者博客:
这是@babel/parser的一个子集,如果你确定的代码不需要兼容IE浏览器,就可以用这个解析器,按照他的介绍,其解析速度目前来说应该是最快的。
2.2 swc (10.1k☆)
创作时间:2017-12-17
作品地址:https://github.com/swc-project/swc
作者:강동윤,他是一个97年的小萌新,目前还在读大二,rust的狂热爱好者,开源了很多rust相关的项目,为此今年8月份Deno官方给了他一份顾问合同。
作者博客:
用的rust编写的js编译器,单核比babel快4倍,4核比babel快70倍,也可以用来打包js、ts代码,并且也拥有 tree shaking功能,它的默认的配置文件spack.config.js和webpack.config.js保持一致,@swc/cli故意与@babel/cli想同,看来野心非常大。
它的目标就是替换babel,目前它已经完成了babel的大部分功能,具体可以看对照表[3]
2.3 esbuild (16.5k☆)
创作时间:2020-1-1
作品地址:https://github.com/evanw/esbuild/
作者:Evan Wallace,一直从事webGL方面的相关的开发,目前就职于Figma
个人博客:
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成员,目前居住于纽约布鲁克林地区
个人博客:
如果你需要重构你的代码,那么这个库将会是你的第一选择,它可以同时使用多种解析器,并且可以自定义传入需要的解析器,是重构利器。
3.2 jscodeshift (5.9k☆)
创作时间:2015-3-22
作品地址:https://github.com/facebook/jscodeshift
作者:Felix Kling。
个人博客:
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,还没有合并
参考文献
对 Electron 感兴趣?请关注我们的开源项目 Electron Playground,带你极速上手 Electron。
我们每周五会精选一些有意思的文章和消息和大家分享,来掘金关注我们的 晓前端周刊。
我们是好未来 · 晓黑板前端技术团队。
我们会经常与大家分享最新最酷的行业技术知识。
欢迎来 知乎、掘金、Segmentfault、CSDN、简书、开源中国、博客园 关注我们。
简单介绍下各种 JavaScript 解析器的更多相关文章
- python模块介绍- HTMLParser 简单的HTML和XHTML解析器
python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...
- JS-YAML -YAML 1.2 JavaScript解析器/编写器
下载 JS-YAML -YAML 1.2 JavaScript解析器/编写器JS-YAML -YAML 1.2 JavaScript解析器/编写器 在线演示 这是YAML的实现,YAML是一种对人友好 ...
- javascript解析器原理
浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作. JavaScript解析器工作步骤 1. “找一些东西”: v ...
- 浏览器中“JavaScript解析器”工作原理
浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作. JavaScript解析器工作步骤: 1.“找一些东西”: v ...
- SSD磁盘,CPU居高不下,高并发的情况下,是不是mysql解析器耗费的cpu资源高?
你看看我做的实验,这个user表是300多W纪录,普通磁盘下,消耗时间最多的是Copy to tmp table 0.81秒,当然在ssd下,这个可以减少很多很多的,第二高就是sending data ...
- springmvc配置式开发下的视图解析器
多个视图解析器优先级:
- 近期用到了Git,就简单介绍下具体用法吧
pull:是下拉代码,相等于将远程的代码下载到你本地,与你本地的代码合并push:是推代码,将你的代码上传到远程的动作完整的流程是: 第一种方法:(简单易懂) 1.git add .(后面有一个点,意 ...
- 简单介绍下怎么在spring中使用RabbitMQ
这篇文章主要介绍了简单了解如何在spring中使用RabbitMQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 常见的消息中间件产品: (1)Ac ...
- cJSON: 一个用c写的一个简单好用的JSON解析器
转自:http://blog.csdn.net/chenzhongjing/article/details/9188347 下载地址: http://sourceforge.net/projects/ ...
随机推荐
- Java基础教程——泛型
泛型 Generics:泛型,愿意指"无商标的". 泛型,可以理解为"宽泛的数据类型",就是将类型由原来的具体的类型泛化. 泛型在建立对象时不指定类中属性的具体 ...
- 为什么90%的大学都要求计算机专业学习C语言?
编程语言是编程的工具,计算机相关专业的学生必须具备足够的编程能力.当然,关于"最好语言"的争论从来没有休止过,这里要强调一下:语言的选择真的没那么重要,学习语言的过程最重要是语言的 ...
- A:与指定数字相同的数的个数
总时间限制: 1000ms 内存限制: 65536kB 描述 输出一个整数序列中与指定数字相同的数的个数. 输入 输入包含三行:第一行为N,表示整数序列的长度(N <= 100):第二行为N ...
- Alpha冲刺-第九次冲刺笔记
Alpha冲刺-冲刺笔记 这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 这个作业要求在哪里 https://edu.cnblogs. ...
- 单体->集群->模块化->分布式微服务
开头语: 每篇一段开头语,在技术的道路中寻找文采的乐趣.(如果随笔中都是大白话勿喷,兄弟姐妹们) 单体项目 单体项目适用于小型开发,或自己来进行小项目的测试和使用. 单体项目的缺憾 多人开发项目所出现 ...
- Django-View中绕过RSCF验证
在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问.那么对于基于类的视图,我们应该怎么办呢? 简单来说可以有两种访问来解决 方法一:在类的 disp ...
- java并发编程实战《五》死锁
一不小心就死锁了,怎么办? 在上一篇文章中,我们用 Account.class 作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,性能太差. 向现 ...
- PyQt(Python+Qt)学习随笔:QTableView的sortingEnabled属性
老猿Python博文目录 老猿Python博客地址 sortingEnabled属性用于控制是企业视图按列排序功能,如果此属性为True,则对tableView视图中的数据启用排序,如果此属性为Fal ...
- sql black list 绕过
Black list is so weak for you,isn't it 姿势: return preg_match("/set|prepare|alter|rename|select| ...
- jquery.sticky 粘性滚动插件使用
一个jQuery插件,使你能够做任何元素在您的网页上总是可见的,可以作为顶部固定导航显示插件. 官网地址:http://stickyjs.com/ github:https://github.com/ ...