什么是Babel?javascript
咱们须要知道3个Babel处理流程中的重要工具;html
babel在处理一个节点时,是以访问者的形式获取节点的信息,并进行相关的操做,这种操做是经过visitor对象实现的。
复制代码
visitor: {
Program: {
enter(path, state) {
console.log('start processing this module...');
},
exit(path, state) {
console.log('end processing this module!');
}
},
ImportDeclaration:{
enter(path, state) {
console.log('start processing ImportDeclaration...');
// do something
},
exit(path, state) {
console.log('end processing ImportDeclaration!');
// do something
}
}
}
复制代码
什么是AST?java
Javascript 语法的AST(抽象语法树)node
esprima、estraverse 和 escodegen 模块是操做 AST 的三个重要模块,也是实现 babel 的核心依赖。git
例如:语法转换插件须要借助 babel-core 和 babel-types 两个模块,就是依赖 esprima、estraverse 和 escodegengithub
每个含有type属性的对象,咱们称之为节点,修改是指获取对应的类型并修改改节点的属性便可;npm
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "answer"
},
"init": {
"type": "BinaryExpression",
"operator": "*",
"left": {
"type": "Literal",
"value": 6,
"raw": "6"
},
"right": {
"type": "Literal",
"value": 7,
"raw": "7"
}
}
}
],
"kind": "var"
}
],
"sourceType": "script"
复制代码
}安全
查看遍历过程: babel
const esprima = require("esprima");
const estraverse = require("estraverse");
let code = "var answer=6 * 7";
// 遍历语法树
estraverse.traverse(esprima.parseScript(code), {
enter(node) {
console.log("enter", node.type);
},
leave(node) {
console.log("leave", node.type);
}
});
复制代码
打印结果以下:模块化
以上代码经过estraverse模块的traverse方法,将esprima模块装换的AST进行了遍历。
经过打印type属性,能够知道深度遍历AST就是遍历每一层的type属性,因此遍历会分为两个阶段,进入阶段和离开阶段,在traverse方法中分别用参数enter和leave两个函数监听;
const esprima = require("esprima");
const estraverse = require("estraverse");
const escodegen= require("escodegen");
let code = "var answer=6 * 7";
let tree=esprima.parseScript(code); // 生成语法树
// 遍历语法树
estraverse.traverse(tree, {
enter(node) {
console.log("enter", node.type);
// 修改变量名
if(node.type==='VariableDeclarator'){
node.id.name='result';
}
},
leave(node) {
console.log("leave", node.type);
}
});
// 编译修改后的语法树;
let compileTreeJS=escodegen.generate(tree);
console.log(compileTreeJS);
复制代码
经过工具了解抽象语法树在 JavaScript 中的体现以及在 NodeJS 中用于生成、遍历和修改 AST 抽象语法树的核心依赖;让咱们有了更加深入地认识;