什么是抽象语法树

抽象语法树 Abstract Syntax Tree 简称AST,是源代码语法结构的一种抽象表示。

比如 const a = 123; ,用ast可以表示为

ast json表示为

{
"type": "Program",
"start": 0,
"end": 14,
"body": [
{
"type": "VariableDeclaration",
"start": 0,
"end": 14,
"declarations": [
{
"type": "VariableDeclarator",
"start": 6,
"end": 13,
"id": {
"type": "Identifier",
"start": 6,
"end": 7,
"name": "a"
},
"init": {
"type": "Literal",
"start": 10,
"end": 13,
"value": 123,
"raw": "123"
}
}
],
"kind": "const"
}
],
"sourceType": "module"
}

你也可以在ast explorer上试试!

在代码语法的检查、代码风格的检查、格式化、高亮、错误提示、自动补全、实现一套代码适配多端运行等等,即优化变更代码,改变代码结构使达到想要的结构都需要用到ast。

webpack、Lint等这些工具的原理都是通过 js解析器(Js Parser) 把源代码转化为一颗抽象语法树(AST),通过操纵这颗树,我们可以精准的定位到声明语句、赋值语句、运算语句等等,实现对代码的分析、优化、变更等操作。

另外Ast是有规范的,不可能随心所欲的去写,这是里规范: estree

js解析器

想想看 如果你想将源码转为ast,你不会每次都跑去ast explorer上,获取吧。

所以就有专门的工具来获取ast,这就是js解析器。

Js解析器的作用,把Js源码转化为抽象语法树。

Js解析器并不一定都是js写的,有可能是c或者python,如:Js解析器.exe、Js解析器.py

常见的JS解析器有哪些?

acorn、babel/parser、uglify-js、 Esprima、espree等等。这里有更详细的介绍

浏览器中执行js

除了webpack、esLint等这些工具会用到ast外,浏览器引擎(如v8)执行到js的时候 也需要ast

  • 当浏览器引擎拿到 js源码时,会将其转为 ast 树
  • 将构建完毕的 ast 树转为字节码(注意浏览器只会将当前调用栈的代码转为字节码)
  • 字节码转为机器码执行

参考 这里

自己利用ast优化代码

为了兼容低版本浏览器 我们也通常会使用 babel 打包编译我们的代码将 ES6 语法降低版本,

比如箭头函数变成普通函数、将 const、let 声明改成 var 等等,

它们也都是通过 AST 来完成的,只不过实现的过程比较复杂和精致。

不过也都是这三板斧:

import { parse } from "@babel/parser";
import generate from "@babel/generator";
import traverse from "@babel/traverse"; // 将源代码转为ast
const ast = parse("const a = 123;"); // 修改ast
traverse.default(ast, {
VariableDeclaration(path) {
if (path.node.kind === "const") {
path.node.kind = "var";
}
},
}); // 将修改后的ast转换回代码
const output = generate.default(ast);
console.log(output.code); // var a = 123;

前端ast的更多相关文章

  1. 03.从0实现一个JVM语言系列之语法分析器-Parser-03月01日更新

    从0实现JVM语言之语法分析器-Parser 相较于之前有较大更新, 老朋友们可以复盘或者针对bug留言, 我会看到之后答复您! 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个 ...

  2. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  3. AST抽象语法树

    抽象语法树简介 (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语法树并 ...

  4. “Clang” CFE Internals Manual---中文版---"Clang"C语言前端内部手册

    原文地址:http://clang.llvm.org/docs/InternalsManual.html 译者:史宁宁(snsn1984) "Clang"C语言前端内部手册 简介 ...

  5. webpack引入handlebars报错'You must pass a string or Handlebars AST to Handlebars.compile'

    背景: webpack作为一个部分替代打包工具和模块化工具的优秀选择出现,作为尝试,也为了构建自己习惯的前端开发方式,我尝试了将webpack和自己常用handlebars模板引擎结合.整体项目背景为 ...

  6. Clang之语法抽象语法树AST

    语法分析器的任务是确定某个单词流是否能够与源语言的语法适配,即设定一个称之为上下文无关语言(context-free language)的语言集合,语法分析器建立一颗与(词法分析出的)输入单词流对应的 ...

  7. 再谈前端HTML模板技术

    在web2.0之前,写jsp的时候虽然有es和JSTL,但是还是坚持jsp.后面在外包公司为了快速交货,还是用了php Smart技术. web2.0后,前端模板技术风行. 代表有如下三大类: Str ...

  8. [AST实战]从零开始写一个wepy转VUE的工具

    为什么需要 wepy 转 VUE "转转二手"是我司用 wepy 开发的功能与 APP 相似度非常高的小程序,实现了大量的功能性页面,而新业务 H5 项目在开发过程中有时也经常需要 ...

  9. JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  10. 前端混淆--JavaScript Obfuscator

    引言: 前端代码是直接暴漏在浏览器中的,很多web攻击都是通过直接debug业务逻辑找到漏洞进行攻击,另外还有些喜欢“不劳而获”的分子暴力盗取他人网页简单修改后用来获利,总体上来说就是前端的逻辑太容易 ...

随机推荐

  1. DevOps工程师

    DevOps工程师 1. DevOps工程师的任务是什么? 设计.构建.测试和部署可伸缩的分布式系统,实现从开发到部署的自动化 管理代码库(如Git.SVN.BitBucket等),包括代码合并与集成 ...

  2. 使用 AutoGen Studio 打造你的私有团队

    AI Agent 无疑是今年最火爆的概念,从科技巨头的战略布局到创业公司的创新产品,AI 智能体正在重塑我们与机器交互的方式.无论是自动化任务.个性化服务,还是复杂问题的协同解决,AI Agent 都 ...

  3. RocketMQ学习与总结

    一.基本介绍 1.应用场景 消息队列是一种先进先出的数据结构,常见的应用场景: 应用解耦:系统的耦合性越高,容错性就越低 实例:用户创建订单后,耦合调用库存系统.物流系统.支付系统,任何一个子系统出了 ...

  4. JWT Token解析

    参照:c#中token的使用方法实例_C#教程_脚本之家 (jb51.net) (7条消息) JWT 算法_み旋律的博客-CSDN博客_jwt算法

  5. Fortify工具安装以及使用

    ​工具简介: Fortify是一款强大的静态代码扫描分析工具,其发现代码漏洞缺陷的能力十分强悍,主要是将代码经过编译,依托于其强大的内置规则库来发现漏洞的.Fortify 是一个静态的.白盒的软件源代 ...

  6. windows 配置jdk8环境变量

    JAVA_HOME: E:\Android\Java\jdk1.8.0_131 PATH: %JAVA_HOME\%bin 也可以只配置PATH就可以,如 E:\Android\Java\jdk1.8 ...

  7. JAVA 24 环境安装与配置

    JAVA 24 环境安装与配置 一.Java Downloads Java 下载(Windows x64) https://www.oracle.com/java/technologies/downl ...

  8. TVM中的Compute操作

    定义 TVM从Halide继承了计算与调度分离的思想,并在其内部重用了部分Halide的调度原语,也引入了一些新的调度原语,用于优化GPU和专用加速器性能. 先举个例子吧: import tvm fr ...

  9. 网络编程:阻塞I/O和线程模型

    线程 进程模型在处理用户请求的过程中,进程切换上下文的代价比较高,而,一种轻量级的模型可以处理多用户连接请求,那就是线程模型. 线程(thread)是运行在进程中的一个"逻辑流", ...

  10. AI+自动化测试系统方案:网络设备与网络应用智能测试

    一.系统目标 通过AI与自动化测试工具的结合,实现网络设备和应用的 全生命周期测试,覆盖 流量分析.配置验证.故障排查.预警告警 四大核心场景,提升网络运维效率与可靠性. 二.技术架构设计 1. 整体 ...