工作流程

关键内容
@babel/parser ES6+ ==> original AST
@babel/traverse 使用深度优先遍历,original AST ==> transformed AST
@babel/generator transformed AST ==> ES5/ES3
@babel/parser
    词法分析
        将ES6+转换为一些列tokens
        对于无效的文字或章节报告错误
    语法分析
        将一系列tokens转换为一个AST
        自动分号插入
        对于位置错误的tokens报告错误
    语义分析
        检查这个AST是否遵循ECMAScripts 所有静态的规则,即early error,如重复定义__proto__、在严格模式中使用with。
        对于重复定义的变量、块作用域符号、暴露未定义的变量等。
@babel/traverse
    声明式遍历
        使用深度优先遍历,enter()是默认入口,exit()是出口。
    支持动态的抽象语法树遍历
    scope 分析
        收集不同的scopes,如应用程序级别、函数级别、块级作用域级别
    收集声明
    收集引用
    实用程序
         nodes(AST)
            Srarch
            Introspection
            Evaluation
            Insertion
            Removal
            Replacment
         bindings(SCOPE)
            Validation
            Tracking
            Creation    
            Renaming
@babel/generator
    在必要的地方插入括号或缩进、注释等
@babel/core
    被@babel/cli babel-loader parcel等使用
    从babel.config.js等配置文件中合并配置
    收集预设和插件并将他们传递给@babel/traverse
@babel/types
    nodes 验证,用于AST node的验证和判断
    nodes 构建函数,在AST转换为JSON时,使得构建函数的参数名称与待生成的json 字段的value一一对应。
    
······