Skip to content

插入String类型的节点

其实到了这里,没看过前面的记录的盆友已经开始有疑问了。都是插入节点,其原理不是差不多吗,知道一种类型的节点的用法就可以了。

我的想法其实很简单,将types提供的节点类型都走一遍,就有了一份思维脑图,以后遇到问题检索起来就更加的方便,了解的内容也就更加的丰富。

这一篇,同样是用babelacorn分别实现,对已有的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的方法,其实也可以用这种取巧的方法来实现。

总结:

  1. babel中,不可以直接使用字面量,必须使用types提供的抽象函数来创建字面量节点
  2. acornbabel具有差异性,在babel上可以正常的工作的语句,在acorn中可能会有异常

源码地址:

  1. babel创建字符串节点: https://github.com/stack-wuh/mini-cli/blob/main/core/create-string-node-babel/babel.js
  2. acorn创建字符串节点: https://github.com/stack-wuh/mini-cli/blob/main/core/create-string-node-babel/acorn.js

MIT License.