关于ast:AST真香
豆皮粉儿们,又见面了,明天这一期,由字节跳动数据平台的太郎酱,带大家走进AST的世界。 作者:太郎酱什么是AST形象语法树(Abstract Syntax Tree, AST),是源代码的形象语法结构的树状示意,与之对应的是具体语法树;之所以是形象的,是因为形象语法树并不会示意出实在语法中呈现的每一个细节,而且是文法无关、不依赖于语言的细节;能够把AST设想成一套标准化的编程语言接口定义,只不过这一套标准,是针对编程语言自身的,小到变量申明,大到简单模块,都能够用这一套标准形容,有趣味的同学能够深刻理解AST的概念和原理,本文的重点聚焦在JavaScript AST的利用。 为什么要谈AST对于前端同学来说,日常开发中,和AST无关的场景无处不在;比方:webpack、babel、各种lint、prettier、codemod 等,都是基于AST解决的;把握了AST,相当于把握了控制代码的代码能力,能够帮忙咱们拓宽思路和视线,不论是写框架,还是写工具和逻辑,AST都会成为你的得力助手。 AST解析流程先举荐一个AST在线转换网站: astexplorer.net , 珍藏它,很重要;除了js,还有很多其余语言的AST库;不必做任何配置,就能够作为一个playground; 在解说case之前,先理解下解析流程,分为三步: source code --> ast (源代码解析为ast)traverse ast (遍历ast,拜访树中的各个节点,对节点做各种操作)ast --> code (把ast转换为源码,打完出工)源码解析成为AST的引擎有很多,转换进去的AST大同小异; Use Cases从一个变量申明说起,如下: const dpf = 'DouPiFan';把代码复制到astexplorer中,失去如下后果(后果已简化),这张图解释了从源码到AST的过程; 抉择不同的第三方库来生成AST,后果会有所差别,这里以babel/parse为例;前端同学对babel再相熟不过了,通过它的解决,能够在浏览器中反对ES2015+的代码,这仅仅是babel的其中一个利用场景,官网对本人的定位是:Babel is a javascript compiler。 回到 babel-parser,它应用 Babylon 作为解析引擎,它是AST 到 AST 的操作,babel在Babylon的根底上,封装了解析(babel-parser)和生成(babel-generator)这两步,因为每次操作都会做这两步;对于利用而言,操作的重点就是AST节点的遍历和更新了; 第一个babel插件咱们以一个最简略的babel插件为例,来理解它的处理过程; 当咱们开发babel-plugin的时候,咱们只须要在 visitor 中形容如何进行AST的转换即可。把它退出你的babel插件列表,就能够工作了,咱们的第一个babel插件开发实现; babel-plugin-import是如何实现的?应用过antd的同学,都晓得 babel-plugin-import插件,它是用来做antd组件的按需加载,配置之后的成果如下: import { Button } from 'antd' ↓ ↓ ↓ ↓ ↓ ↓import Button from 'antd/lib/button'本文旨在抛砖引玉,对于插件的实现细节以及各种边界条件,可参考插件源码;以AST的思维来思考,实现步骤如下: 查找代码中的 import 语句,且必须是 import { xxx } from 'antd'把步骤一找到的节点,转换为 import Button from 'antd/lib/button'实现步骤 ...