babel是如今几乎每一个项目中必备的一个东西,可是其工做原理避不开对js的解析在生成的过程,babel有引擎babylon,早期fork了项目acron,了解这个以前咱们先来看看这种引擎解析出来是什么东西。不光是babel还有webpack等都是经过javascript parser将代码转化成抽象语法树,这棵树定义了代码自己,经过操做这颗树,能够精准的定位到赋值语句、声明语句和运算语句。有兴趣的能够关注一下个人github,点一个star。谢谢javascript
咱们能够来看一个简单的例子:html
var a = 1;
var b = a + 1;
复制代码
咱们经过这个网站,他是一个esprima引擎的网站,十分好用.画成流程图以下:前端
而他的json对象格式是这样的:java
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "a"
},
"init": {
"type": "Literal",
"value": 1,
"raw": "1"
}
}
],
"kind": "var"
},
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "b"
},
"init": {
"type": "BinaryExpression",
"operator": "+",
"left": {
"type": "Identifier",
"name": "a"
},
"right": {
"type": "Literal",
"value": 1,
"raw": "1"
}
}
}
],
"kind": "var"
}
],
"sourceType": "script"
}
复制代码
chrome有v8,firefix有spidermonkey.还有一些经常使用的引擎有:node
下面是一些引擎的速度对比,以及用不一样的框架,引擎们的加载速度:react
我我的认为,封装的越完美的,其实解析的时间更长,引擎之间也是acron这个速度比较优秀,babel引擎前身就是fork这个项目的。jquery
咱们能够来作一个简单的例子:webpack
1.先新建一个test的工程目录 2.在test工程下安装esprima、estraverse、escodegen的npm模块git
npm i esprima estraverse escodegen --save
复制代码
3.在目录下面新建一个test.js文件,载入如下代码:github
const esprima = require('esprima');
let code = 'const a = 1';
const ast = esprima.parseScript(code);
console.log(ast);
复制代码
你将会看到输出结果:
Script {
type: 'Program',
body:
[ VariableDeclaration {
type: 'VariableDeclaration',
declarations: [Array],
kind: 'const' } ],
sourceType: 'script' }
复制代码
4.再在test文件中,载入如下代码:
const estraverse = require('estraverse');
estraverse.traverse(ast, {
enter: function (node) {
node.kind = "var";
}
});
console.log(ast);
复制代码
输出的结果:
Script {
type: 'Program',
body:
[ VariableDeclaration {
type: 'VariableDeclaration',
declarations: [Array],
kind: 'var' } ],
sourceType: 'script' }
复制代码
5.最后在test文件中,加入如下代码:
const escodegen = require("escodegen");
const transformCode = escodegen.generate(ast)
console.log(transformCode);
复制代码
输出的结果:
var a = 1;
复制代码
const a = 1
转化成了var a = 1
有没有babel的感受0.0
抽象树在前端用的不少不少,如今流行的工具,无论是webpack仍是babel都会经过那个三板斧的流程,这里我只是大体介绍一下,过段时间,会出一篇抽象树的语法,有兴趣的也能够把esprima的源码看一下,为何是esprima呢,由于esprima的资料比较多,而acron比较轻量级。有兴趣的能够关注一下个人github,记得点个star,就当是对笔者的支持,谢谢。