插入String类型的节点
其实到了这里,没看过前面的记录的盆友已经开始有疑问了。都是插入节点,其原理不是差不多吗,知道一种类型的节点的用法就可以了。
我的想法其实很简单,将types
提供的节点类型都走一遍,就有了一份思维脑图,以后遇到问题检索起来就更加的方便,了解的内容也就更加的丰富。
这一篇,同样是用babel
与acorn
分别实现,对已有的AST加入一个或者是多个String
类型的节点。在types
中声明的方式与Number
类型一样,大同小异。
所不同者,就是字面量创建函数不一样。在Number
中使用的方法为numLiteral
,在String
中使用的就是stringLiteral
。
javascript
/**
* @NOTE 创建一个字符串节点
*/
const varStr1 = t.variableDeclaration('const',
[t.variableDeclarator(t.identifier('str1'), t.stringLiteral('shadow'))])
/**
* @NOTE 创建一个数字节点
*/
const varNum1 = t.variableDeclaration('const', [
t.variableDeclarator(t.identifier('num1'), t.numericLiteral(1))
])
但是,到了acorn
上面这中创建字符串类型的操作就不行了。还记得之前提到过的吗,acorn
是没有stringLiteral
节点的,所以得换一种玩法。
javascript
const str2 = variableDeclaration('const', [
variableDeclarator(identifier('str2'), identifier(`'shadow2'`)),
])
这里的实现是不是比较直接,我可以直接用的identifier
来抽象一个值为shadow2
的标识符。identifier
是用来声明一个标识符的,但是这里我可以取巧将字符串也看做一个标识符。
之前说到的生成Number的方法,其实也可以用这种取巧的方法来实现。
总结:
- 在
babel
中,不可以直接使用字面量,必须使用types
提供的抽象函数来创建字面量节点 acorn
与babel
具有差异性,在babel
上可以正常的工作的语句,在acorn
中可能会有异常
源码地址: