JS 语法树

最后更新于:2022-04-02 03:27:46

[TOC] > [参考](https://mp.weixin.qq.com/s?__biz=MzI1NTcxOTQ1Nw==&mid=2247489675&idx=1&sn=1aca9a4c43076b76eb22caff8c9a0361&utm_source=tuicool&utm_medium=referral) > [在线语法分析网站](https://astexplorer.net/) > ## 概述 ![UTOOLS1594259668994.png](http://yanxuan.nosdn.127.net/fbce05d0cc7c254cabfea04f12a25342.png) ## AST 能做什么 * 语法检查、代码风格检查、格式化代码、语法高亮、错误提示、自动补全等 * 代码混淆压缩 * 优化变更代码,改变代码结构等 ## 实例 ### babel 插件 - 箭头函数转普通函数 方式一: 使用@babel/preset-env ``` const babel = require('@babel/core') const code = `const fn = (a, b) => a + b` // babel 有 transform 方法会帮我们自动遍历,使用相应的预设或者插件转换相应的代码 const r = babel.transform(code, { presets: ['@babel/preset-env'], }) console.log(r.code) // 打印结果如下 // "use strict"; // var fn = function fn() { return a + b; }; ``` 方式二: 只是转换箭头函数 ``` const babel = require('@babel/core') const code = `const fn = (a, b) => a + b` // babel 有 transform 方法会帮我们自动遍历,使用相应的预设或者插件转换相应的代码 const r = babel.transform(code, { plugins: ['@babel/plugin-transform-arrow-functions'], }) console.log(r.code) // 打印结果如下 // const fn = function () { return a + b; }; ``` ## 编写自己的插件 ### 通过AST 分析,比较两个语法的差别 > [在线语法分析网站](https://astexplorer.net/) 把箭头函数解析成普通函数 ### AST 转换 就是把`ArrowFunctionExpression`,转为`FunctionExpression` ``` t.functionExpression(id, params, body, generator, async) id: Identifier (default: null) id 可传递 null params: Array (required) 函数参数,可以把之前的参数拿过来 body: BlockStatement (required) 函数体,接受一个 BlockStatement 我们需要生成一个 generator: boolean (default: false) 是否为 generator 函数,当然不是了 async: boolean (default: false) 是否为 async 函数,肯定不是了 t.blockStatement(body, directives) ```
';