babel✅
日常有使用过 babel 么,用在哪些场景?
答案
Babel 主要用于实现在低版本浏览器或其他运行环境中使用高版本 JavaScript 特性,或者使用一些新的语法特性,比如 ES6/7/8/9/10/11/12 等,或者使用 JSX、TypeScript 等语言,将其转换为浏览器可以识别的代码。典型的使用场景包括
- 转换语法,通过配置 babel, 实现在低版本浏览器中使用高版本 JavaScript 语法,比如箭头函数、解构赋值
- 自定义插件,通过编写自定义插件,实现一些特定的功能,比如代码检查、代码转换等
- ployfill,通过引入
@babel/polyfill
实现对新 API 的支持,比如Promise
、Set
等
延伸阅读
- what is babel Babel 官方文档对 Babel 的介绍
面试官视角
这是 babel 的热身问题,通过答题者对 babel 的整体认识,判断是否需要继续追问细节。
良 能够基本知道 babel 的作用和能力,对 babel 的插件和预设有一定了解 优 能够说出 babel 整体的工作流程,涉及的概念及常用的 API 等,比如能说出 AST 的结构,常用节点类型,各环节涉及的核心 API, 常用配置等
babel 是如何工作的?
答案
整个 babel 的工作流程简述为三个阶段
- 解析(parser),输入字符串,输出抽象语法树(AST)
- 转换(transformer),对 AST 进行遍历,转换成新的 AST
- 生成(generator),将 AST 重新转换成字符串
Terminal
延伸阅读
- 对于解析重点是理解 AST,可以参考 AST Explorer 来查看不同语言的 AST 结构,babel 定义参考 ast spec
- 对于转换,可以参考 babel-handbook traversal 理解涉及的核心概念
- 对于生成,可以参考 babel-generator 了解如何将 AST 转换成代码
如何编写 babel 插件
答案
参看示例,该插件实现了提取代码中的 todo 注释,生成为 todo.md
的功能
Tests
插件开发的核心流程如下
- 创建插件文件:在项目中创建一个新的 JavaScript 文件,用于编写自定义插件的代码。核心配置包括
- name ,插件名,一般以
babel-plugin-
开头,例如示例中的babel-plugin-todo-collector
, 详细规范参考 命名格式 - vistor ,访问者对象,包含了对 AST 节点的处理函数,其中涉及的核心概念包括
- NodeType 节点类型,如
Identifier
,CallExpression
等 - path 路径对象,表示 AST 中的一个路径,你可以通过该对象访问和操作 AST 节点
- state 状态对象,表示插件的状态,可以用来共享数据和配置
- enter、exit,表示对节点的处理时机,enter 表示进入节点时的处理,exit 表示退出节点时的处理
- NodeType 节点类型,如
- pre 和 post 选项,表示插件的执行时机,pre 表示在转换之前执行,post 表示在转换之后执行, 可选
- 其他配置详见 pluginObject 配置
- name ,插件名,一般以
- 消费插件可以直接本地引入,或发布为包进行消费
提示
注意插件引用的执行顺序为从左到右,而 preset 的执行顺序为从右到左
延伸阅读
- babel 手册 官方文档,虽然很久未更新,但是核心概念基本未发生变化,
- babel 插件通关秘籍 深入学习推荐此小册,内容详实