简单明了的JS抽象语法树

本文我们主要和大家分享简单明了的js抽象语法树,我们首先会介绍什么是抽象语法树,希望能帮助到大家。

babel是现在几乎每个项目中必备的一个东西,但是其工作原理避不开对js的解析在生成的过程,babel有引擎babylon,早期fork了项目acron,了解这个之前我们先来看看这种引擎解析出来是什么东西。不光是babel还有webpack等都是通过javascript parser将代码转化成抽象语法树,这棵树定义了代码本身,通过操作这颗树,可以精准的定位到赋值语句、声明语句和运算语句

什么是抽象语法树

我们可以来看一个简单的例子:

var a = 1;var b = a + 1;

登录后复制

我们通过这个网站,他是一个esprima引擎的网站,十分好用.画成流程图如下:

简单明了的JS抽象语法树

而他的json对象格式是这样的:

{    "type": "Program",    "body": [        {            "type": "VariableDeclaration",            "declarations": [                {                    "type": "VariableDeclarator",                    "id": {                        "type": "Identifier",                        "name": "a"                    },                    "init": {                        "type": "Literal",                        "value": 1,                        "raw": "1"                    }                }            ],            "kind": "var"        },        {            "type": "VariableDeclaration",            "declarations": [                {                    "type": "VariableDeclarator",                    "id": {                        "type": "Identifier",                        "name": "b"                    },                    "init": {                        "type": "BinaryExpression",                        "operator": "+",                        "left": {                            "type": "Identifier",                            "name": "a"                        },                        "right": {                            "type": "Literal",                            "value": 1,                            "raw": "1"                        }                    }                }            ],            "kind": "var"        }    ],    "sourceType": "script"}

登录后复制

众多的引擎

chrome有v8,firefix有spidermonkey.还有一些常用的引擎有:

esprima

acron

Traceur

UglifyJS2

shift

下面是一些引擎的速度对比,以及用不同的框架,引擎们的加载速度:

简单明了的JS抽象语法树

简单明了的JS抽象语法树

简单明了的JS抽象语法树

我个人认为,封装的越完美的,其实解析的时间更长,引擎之间也是acron这个速度比较优秀,babel引擎前身就是fork这个项目的。

AST的三板斧

通过esprima生成AST

通过estraverse遍历和更新AST

通过escodegen将AST重新生成源码

我们可以来做一个简单的例子:

1.先新建一个test的工程目录
2.在test工程下安装esprima、estraverse、escodegen的npm模块

npm i esprima estraverse escodegen --save

登录后复制

3.在目录下面新建一个test.js文件,载入以下代码:

const esprima = require('esprima');let code = 'const a = 1';const ast = esprima.parseScript(code);console.log(ast);

登录后复制

你将会看到输出结果:

Script {  type: 'Program',  body:   [ VariableDeclaration {       type: 'VariableDeclaration',       declarations: [Array],       kind: 'const' } ],  sourceType: 'script' }

登录后复制

4.再在test文件中,载入以下代码:

const estraverse = require('estraverse');estraverse.traverse(ast, {    enter: function (node) {        node.kind = "var";    }});console.log(ast);

登录后复制

输出的结果:

Script {  type: 'Program',  body:   [ VariableDeclaration {       type: 'VariableDeclaration',       declarations: [Array],       kind: 'var' } ],  sourceType: 'script' }

登录后复制

5.最后在test文件中,加入以下代码:

const escodegen = require("escodegen");const transformCode = escodegen.generate(ast)console.log(transformCode);

登录后复制

输出的结果:

var a = 1;

登录后复制

通过这三板斧:我们将const a = 1转化成了var a = 1

有没有babel的感觉0.0

推荐网站

esprima源码
acron源码
speed comparison
AST explorer
esprima可视化
在线可视化AST

总结

抽象树在前端用的很多很多,现在流行的工具,不管是webpack还是babel都会通过那个三板斧的流程,这里我只是大致介绍一下,过段时间,会出一篇抽象树的语法,有兴趣的也可以把esprima的源码看一下,为什么是esprima呢,因为esprima的资料比较多,而acron比较轻量级。有兴趣的可以关注一下我的[github](),记得点个star,就当是对笔者的支持,谢谢。

相关推荐:

总结js语法中常见的10点提升编码效率的方法

javascript编程必备_JS语法字典_基础知识

AngularJS语法详解_AngularJS

以上就是简单明了的JS抽象语法树的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2788392.html

(0)
上一篇 2025年3月8日 18:25:50
下一篇 2025年3月8日 18:25:59

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 什么是Javascript语言的多态

    java语言是一门静态类型的语言,由于在代码编译时要进行严格的类型检查,所以不能给变量赋予不同类型的值,这种类型检查就会使代码变得僵硬,但是java也可以通过继承得到多态的效果(实现继承和接口继承) 可以向上转型来实现多态。 多态的实际含义…

    2025年3月8日
    100
  • javascript实现网页兼容各种浏览器详解

    本文主要介绍javascript 开发之网页兼容各种浏览器的相关资料,这里提供了几种方法帮助大家掌握这样的功能,需要的朋友可以参考下,希望能帮助到大家。 前言: 关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下…

    编程技术 2025年3月8日
    200
  • node.js之断言assert的使用示例分享

    断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 使用断言可以创建…

    编程技术 2025年3月8日
    200
  • JavaScript判断输入是否为数字类型

    本文主要介绍javascript判断输入是否为数字类型的方法总结的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下,希望能帮助到大家。 JavaScript判断输入是否为数字类型的方法总结 前言 很多时候需要判断一个输入是否位数字,…

    编程技术 2025年3月8日
    200
  • Nodejs调用WebService的详解

    本文主要介绍nodejs调用webservice的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 这两天一直在试着编写纯静态页面的js去调用由Java编写的WebService,一直…

    2025年3月8日
    200
  • JavaScript中重名的函数与对象实例详解

    本文主要给大家介绍了关于javascript中重名的函数与对象的相关内容,分享出来供大家参考学习,希望能帮助到大家。 JavaScript 允许重复声明变量,后声明的覆盖之前的。 var a = 1;var a = ‘x’;console.…

    编程技术 2025年3月8日
    200
  • ionic3和Angular4实现接口请求及本地json文件读取实例

    本文主要介绍ionic3+angular4实现接口请求及本地json文件读取示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 一 准备工作 首先,ionic3+Angular4的开发环境你得有,这里就不赘述。环境准…

    2025年3月8日
    200
  • Scala是如何解析Json字符串的

    本文主要介绍scala解析json字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家学习理解这部分内容,需要的朋友可以参考下,希望能帮助到大家。 Scala解析Json字符串的实例详解 1. 添加相应依赖        Json解…

    编程技术 2025年3月8日
    200
  • import与export在node.js中的使用方法

    import与export是es6中模块化的导入与导出,node.js现阶段不支持,需要通过babel进行编译,使其变成node.js的模块化代码。(关于node.js模块,可参考其他node.js模块化的文章)本文主要介绍import与e…

    2025年3月8日
    200
  • AngularJS仿微信图片手势缩放代码

    图片可以放大缩小这种功能很常见,本文主要介绍了angularjs 仿微信图片手势缩放的实例的相关资料,希望大家通过本文实现这样的功能,需要的朋友可以参考下,希望能帮助到大家。 AngularJS 仿微信图片手势缩放的实例 前言: 最近,公司…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论