抽象语法树

Posted 前端精髓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象语法树相关的知识,希望对你有一定的参考价值。

webapck打包代码的时候会自动修改导入导出的格式,比如下面的例子:

require('./title')
// 修改为
__webpack_require__(/*! ./title */ "./src/title.js")

完整的打包之后的代码如下:

(() => 
  var __webpack_modules__ = (
    "./src/title.js":
      ((module) => 
        module.exports = 'title'
      )
  );
  var __webpack_module_cache__ = ;
  function __webpack_require__(moduleId) 
    var cachedModule = __webpack_module_cache__[moduleId];
    if (cachedModule !== undefined) 
      return cachedModule.exports;
    
    var module = __webpack_module_cache__[moduleId] = 
      exports: 
    ;
    __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
    return module.exports;
  
  var __webpack_exports__ = ;
  (() => 
    let title = __webpack_require__(/*! ./title */ "./src/title.js")
    console.log(title)
  )();
)()

那么修改源代码导入导出格式就需要用到抽象语法树来实现,parser 是解析器用来把代码转换为抽象语法树,traverse 用来遍历抽象语法树的,generator 用来把语法树重新转换为代码,types 用来修改节点类型。

const parser = require('@babel/parser')
const traverse = require('@babel/traverse').default
const generator = require('@babel/generator').default
const types = require('babel-types')

const sourceCode = 'const title = require("./title")'

const ast = parser.parse(sourceCode,  sourceType: "module" );

traverse(ast, 
  CallExpression: ( node ) => 
    if (node.callee.name === 'require') 
      const depModuleName = node.arguments[0].value // ./title
      const depModuleId = './src' + depModuleName // ./src/title.js
      node.arguments = [types.stringLiteral(depModuleId)] // 把./title改成./src/title.js
      node.callee.name = '__webpack_require__'
    
  
)
const  code  = generator(ast)
console.log(code) // const title = __webpack_require__("./src./title");

打开 https://astexplorer.net/ 这个网站,我们可以在线把代码转换为抽象语法树。

在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。

查看这个网站,打开 babel 手册 https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于抽象语法树的主要内容,如果未能解决你的问题,请参考以下文章

AST 抽象语法树

五分钟了解抽象语法树(AST)babel是如何转换的?

解析树和抽象语法树 (AST) 有啥区别?

AST抽象语法树

java AST 抽象语法树

java AST 抽象语法树