什麼是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 抽象語法樹的核心依賴;讓咱們有了更加深入地認識;