Q: 如果让你写一个 Babel 插件,大概结构是什么样的?Visitor 模式是什么?
Babel 插件本质上就是一个 Transformer (代码转换器)。 它利用 AST,遵循 Visitor 模式 (Visitor Pattern),遍历并修改代码。
一个标准 Babel 插件必须是一个函数,返回一个对象。
Babel Traverse 会深度优先遍历 AST 树。当遇到特定的 节点类型 (Node Type) 时,就会调用在这里定义的同名函数 (如 Identifier, BinaryExpression)。
path.node),还包含了上下文信息 (如父级 path, 作用域 scope),以及操作 AST 的方法 (path.replaceWith, path.remove, path.insertBefore)。插件函数的参数里提供了一个 types 对象 (通常简写为 t)。它类似于 React createElement,用于 创建新的 AST 节点,或者 判断节点类型 (t.isIdentifier(node) )。
利用 path.scope (作用域) 对象。Babel 会自动分析作用域链。
path.scope.getBinding('a').constant 为 true 表示常量,false 表示被修改过。这在做常量折叠 (Constant Folding) 优化时非常有用。