Babel原理深度解析:AST魔法与编译器工程实践
Babel 是可插拔的 JS 编译器,通过解析、转换、生成三段式把 ESNext、TS、JSX 编译为标准 JS,是代码即数据理念在前端工程化的经典实践。 面试常考 AST 在三阶段中的作用、写一个 Babel 插件遍历修改节点的思路,以及 preset 与 plugin 的执行顺序。
Babel 是可插拔的 JS 编译器,通过解析、转换、生成三段式把 ESNext、TS、JSX 编译为标准 JS,是代码即数据理念在前端工程化的经典实践。 面试常考 AST 在三阶段中的作用、写一个 Babel 插件遍历修改节点的思路,以及 preset 与 plugin 的执行顺序。
Vite 开发时利用浏览器原生 ESM 实现按需加载不打包,用 esbuild 预构建依赖,用 Rollup 做生产打包,本质是用两套策略分别解决体验与体积。 面试常考它与 Webpack 的根本差异、依赖预构建为什么用 esbuild、以及 HMR 为何如此快。
Webpack 的 Loader 是内容翻译器(文件进文件出),Plugin 是生命周期钩子(在编译各阶段注入逻辑),两者构成扩展体系的全部。 面试常考如何写一个同步或异步 Loader、Plugin 的 apply 方法与 compiler/compilation 钩子,以及两者的本质区别。
Webpack 构建是一次递归扫描加流水线加工:从 entry 遍历 import 建依赖图,Loader 转换模块,Plugin 通过 Tapable 钩子注入逻辑。 流程围绕 Compiler(全局管家)与 Compilation(单次编译)展开,面试常考 Tapable 钩子机制与编译、优化、输出三阶段。
Webpack 用 entry、output、loader、plugin、mode 五个概念统一前端资源打包,一切皆模块意味着 JS、CSS、图片、字体都能 import。 面试常考 loader 与 plugin 的职责边界、模块图(Module Graph)如何组织,以及为什么说构建工具是模块图的组织者而非搬运工。
Promise.all 的类型推导、柯里化函数的类型推断、对象路径类型提取三道类型挑战,分别考察变长元组映射、递归条件类型和模板字面量类型。 掌握它们意味着从会用 TypeScript 进阶到能设计类型系统,是中高级前端面试的分水岭。
联合类型 A 竖线 B 是或,交叉类型 A 和 B 是且,但要驾驭它们得理解分布式条件类型怎么拆联合、函数参数逆变怎么把联合变交叉。 IsUnion、UnionToTuple、UnionToIntersection 等经典体操背后是类型运算思维,面试能写出即证明真正理解类型系统。
递归类型让 TS 类型系统能钻进对象的深层结构逐层施加映射变换,就像运行时的深拷贝但发生在类型层面。 核心是 DeepReadonly 这类递归映射类型,配合条件类型判断是否到达原始类型、数组、函数后停止递归,面试常考递归终止条件。
条件类型 T extends U 问号 X 否则 Y 是 TS 类型系统的 if/else,infer 则是其中的模式匹配解构。 两者组合能从函数签名、Promise、数组中精确提取内部类型,ReturnType 与 Parameters 就是它们最著名的产品,面试手写必考。
Partial、Required、Readonly、Pick、Omit、Record 六个内置工具类型,底层全是映射类型加索引访问的组合体操。 手写一遍就能从查文档复制进阶到随手造自己的类型变换,面试中能现场推导出任意工具类型的实现。