各种 AST 解析器
JavaScript
最知名的当属 babylon,因为他是 babel 的御用解析器,一般 JavaScript 的 AST 这个库比较常用
acron:babylon 就是从这个库 fork 来的
HTML
htmlparser2:比较常用
parse5:不太好用,还需要配合 jsdom 这个类库
CSS
cssom、csstree 等
less/sass
XML
XmlParser
babel用法
1 | { |
AST
AST转化器https://astexplorer.net/
Babel的AST
解析原理
解析方法
Babel 的三个主要处理步骤分别是:
解析(parse),转换(transform),生成(generate)。
解析
使用 babylon 解析器,现在已变为babel-parser对输入的源代码字符串进行解析并生成初始 AST(File.prototype.parse)
利用 babel-traverse 这个独立的包对 AST 进行遍历,并解析出整个树的 path,通过挂载的 metadataVisitor 读取对应的元信息,这一步叫 set AST 过程
解析结果:转换
transform 过程:遍历 AST 树并应用各 transformers(plugin) 生成变换后的 AST 树
babel 中最核心的是 babel-core,它向外暴露出babel.transform
接口。
1 | let result = babel.transform(code, { |
- 生成
利用 babel-generator 将 AST 树输出为转码后的代码字符串
解析模板的AST
解析原理
Babel 插件
再写代码之前,你需要明白Babel它的原理,简单点说: Babel解析成AST,然后插件更改AST,最后由Babel输出代码
babel-coreBabel 的核心依赖包
babel-types包含里处理AST的一系列工具方法,具体可以查看文档,实际编写的时候,建议在astexplorer.net/中输入编译前后的代码,对比AST的区别,然后通过babel.types提供的方法修改AST即可。
那么Babel的插件模块需要你暴露一个function,function内返回visitor:1
2
3
4
5
6module.export = function(babel){
return {
visitor:{
}
}
}