什么是抽象语法树

抽象语法树 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. 从DeepSeek看算法备案&大模型备案

    一.deepseek的备案情况 (一)算法备案情况 在算法备案系统网站上,北京深度求索人工智能基础技术研究有限公司和杭州深度求索人工智能基础技术研究有限公司分别进行了两个算法备案.从公司名称来看,正如 ...

  2. Java8 Lambda Collection 的常见用法

    import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.huto ...

  3. 使用Python计算万有引力势能

    引言 在物理学中,万有引力是描述物体之间相互吸引的基本力之一.牛顿的万有引力定律告诉我们,任何两个物体之间都存在引力,这个引力与它们的质量和它们之间的距离有关.在这个定律中,万有引力势能是一个非常重要 ...

  4. Asp.net mvc基础(十一)数据验证

    1.获取验证失败错误 asp.net mvc会自动根据属性的类型进行基本的校验,但Asp.net mvc并不是在请求验证失败的时候抛异常,而是把决定权交给开发人员,开发人员需要决定如何处理数据校验失败 ...

  5. 基于Zabbix Low-level discovery 方式 网络质量监控配置手册

  6. 最新最完整的iphone开发ios开发证书/发布证书/推送证书/企业证书和描述文件制作方法与教程

    本文介绍最新的最全的如何制作 iOS 证书(开发证书.发布证书.推送证书,企业证书)和iphone配置描述文件,用于iphone和ipad开发构建 IOS App 应用.如果嫌麻烦,可以使用懒人工具a ...

  7. scrcpy - Android手机投屏操作神器

    推荐一个Genymotion推出的投屏工具,跨平台,自定义码率,最重要的是开源,简直良心. Github:https://github.com/Genymobile/scrcpy 下载地址: http ...

  8. Linux系统的一些基本文件和目录管理命令

    pwd:查看当前目录所在位置. ls:查看当前目录下的文件和目录.例如我们查看根目录下的文件和目录: (注:蓝字的是目录,白字的是文件,绿字的是可执行的文件或装有可执行文件的目录,红字是压缩包) 如果 ...

  9. 【HUST】网安|计算机网络实验|实验三 华为ENSP配置

    我没有配置无线AP和AC,使用静态路由. 拓扑图文件链接:Gitee传送门. 在安装了ensp的情况下,解压即可使用. 1. 实验检查要求 2. 实验结果 2.1 我的拓扑图 2.2 我的IP地址划分 ...

  10. Axure在线教育考试原型图在线网课教育交互模板rp源文件

    Axure在线教育考试原型图在线网课教育交互模板rp源文件 Axure在线教育原型图在线网课教育交互模板rp源文件是一款原创的儿童教育类的APP模板,使用axure rp软件制作.app中包含大约40 ...