Bable是什么?
babel作用
- babel 将 ES6/ES7/ES8 等新特性(如
let/const
、箭头函数、类、模板字符串、解构赋值、可选链等)转换为 ES5 或更低版本。 - 支持 TypeScript、JSX(React)、Flow 等非标准语法的编译。
bable功能示例:如何转jsx高级js语法糖
babel工作方式:
- Polyfill 填充,通过
@babel/polyfill
或core-js
,为不支持新特性的环境提供兼容性支持(例如 Promise、Array.from、Symbol 等)。
实现原理:
- 判断
'filter' in Array.prototype
- 如果没有,则添加垫片 Array.prototype.filter = function () {}
bable插件:开发自定义插件
import fs from 'node/fs'
import babel from '@bable/core'
const filedata = fs.readFileSync('src/file.js','utf-8')
// 自定义插件,type包含了ast节点的所有方法
const myBabelPlugin = ({ type: t }) => {
return {
name: 'my-plugin箭头函数',
visitor: {
ArrowFunctionExpression (path) {
const node = path.node
const arrfn = t.functionExpression(
null,
node.params,
t.blockStatement(t.returnStatement(node.body)),
node.async
)
path.replaceWith(arrfn)
}
}
}
}
babel.transform(filedata, {
presets: [],
plugins: [
myBabelPlugin
]
})
bable插件介绍
@babel/core
@babel/core
是 Babel 的核心运行库,它负责将你的 JavaScript 代码进行 解析(Parse)→ 转换(Transform)→ 生成(Generate) 的完整流程。- 它是整个 Babel 工具链中最核心的包,其他工具如
@babel/cli
、@babel/preset-env
、@babel/plugin-transform-arrow-functions
等都依赖于它来工作。
@babel/parser
解析 @babel/parser
将源码字符串解析为 AST(抽象语法树)
@babel/transform
执行代码转换的工具集,用于将新语法、新特性转换为等效的旧版实现。
常见的 @babel/plugin-transform-*
插件示例
@babel/plugin-transform-arrow-functions
将箭头函数转换为普通函数@babel/plugin-transform-block-scoping
将 let / const 转换为 var@babel/plugin-transform-classes
将类语法转换为 ES5 构造函数@babel/plugin-transform-spread
将数组展开运算符 ... 转换为 concat 或 apply@babel/plugin-transform-template-literals
转换模板字符串@babel/plugin-transform-runtime
避免重复引入 helper 函数和 polyfill,减少代码体积
transform.presets
(预设插件)
- 定义:
Preset
是一组预先配置好的插件集合,旨在简化配置过程 - 用途:通常用于支持特定版本的 ECMAScript 或者特定框架(如 React、TS)所需的语法转换,JavaScript 语法转换为兼容旧版浏览器的代码
- 灵活性:快速配置的方式,灵活性相对较低
transform.plugins
(自定义/第三方插件)
- 定义:
Plugins
是具体执行代码转换工作的模块。每个插件通常专注于单一功能或特性,比如箭头函数转换、类属性转换等 - 用途:通过直接指定插件,可以更精确地控制哪些特性需要被转换以及如何转换。这允许你针对项目的具体需求定制转换流程
- 灵活性:与 presets 相比,plugins 提供了更高的灵活性和控制力。你可以单独添加、移除或调整任何插件的位置以满足特定要求
@babel/generator
@babel/generator
主要作用:将抽象语法树(AST)重新生成为 JavaScript 代码字符串。
它是 Babel 转换流程的最后一个阶段 —— 代码生成(Code Generation)。
注意:是否保留注释打印,是否压缩代码,是否生成源代码映射,是否函数表达式括号等,在此控制
@babel/cli
@babel/cli
提供 命令行工具(Command Line Interface) ,它允许你直接在终端中使用 Babel 来转换 JavaScript 文件。
@babel/template
@babel/template
主要作用:帮助你快速创建 AST(抽象语法树)节点或代码片段。
@babel/template
的核心功能:
快速生成 AST 节点,你可以写一小段 JavaScript 代码模板字符串,然后通过 template 模块将其转换为一个 AST 片段。这个 AST 可以插入到其他 AST 中,或者用于替换、添加代码结构。
@babel/types
@babel/types
主要作用:创建和操作 AST(抽象语法树)节点。
@babel/types
提供了:
- 创建 AST 节点的方法(如变量、函数、表达式等)
- 判断 AST 节点类型的方法
- 修改或操作 AST 的辅助函数]
esbuild 是什么?
esbuild
是一个用 Go 语言编写的高性能 JavaScript 打包工具和压缩工具。它的主要特点是速度快,支持并行处理和增量构建,适合大型项目或开发服务器。
极快的构建速度
- 它通过纯 Go 实现,并且利用了并行化技术,能够以极高的速度解析、打包和压缩 js 和 ts。
- 支持增量构建,进一步提升性能。
支持现代语法
- 原生支持 TypeScript、JSX、CSS、JSON。
- 原生支持 支持 ES6+ 语法。
- 原生支持 JSX(适用于 React 等框架)。
- 原生支持 CSS 和 JSON 文件。
零配置即可使用
- 不像 Webpack 那样需要复杂的配置文件。
- 提供简单的 API:命令行接口(CLI)、js API 和 Go API。
轻量级
- 占用内存少,适合资源受限的环境。
可扩展性强
- 支持插件系统,可以自定义加载器、解析器等行为。
主要用途
- 构建生产环境的 JS/CSS 包
- 开发环境热更新(HMR)
- 编译 TypeScript / JSX
- 压缩代码(Minify)
- 代码分割、tree-shaking、minify
- 替代 Babel 或 Terser 进行代码转换和压缩
- 构建 Node.js 项目的发布版本(打包成单个文件)
SWC是什么?
SWC (Secure Web Compiler)是 Rollup 插件,用于替代传统 TypeScript 和 Babel 编译工具,提供一体化代码转换和压缩功能,显著提升构建效率。
比 Babel 更快的替代方案。它主要用于代码转换(如将 TypeScript 编译为 JavaScript、ES6+ 转 ES5 等),也可以用于打包和压缩。
极快的速度
- 用 Rust 编写,性能远超 JavaScript 编写的编译工具(如 Babel)。
- 支持并行处理,充分利用多核 CPU。
- 支持现代语法
- 支持最新的 ECMAScript 标准(ES2020+)。
- 支持 TypeScript 和 JSX(适用于 React)。
- 支持 Decorators、Top-level await、Async Iteration 等高级特性。
可扩展性强
- 提供插件系统,允许开发者自定义 AST 转换逻辑。
- 可集成到构建工具中,例如 Next.js、Parcel、Deno、SvelteKit 等。
跨平台支持
- 支持 Node.js 和浏览器环境(通过 WebAssembly)。
- 可以作为 CLI 工具使用,也可以通过 JS API 或 Rust API 集成进项目。
安全性
- 名称 "swc" 来源于 Secure Web Compiler,强调其安全性和稳定性。
主要用途
- 替代 Babel 进行代码转换(ES6+ → ES5)
- 编译 TypeScript
- 压缩 JavaScript(虽然不是主打功能,但有 minify 插件)
- 构建工具中的预处理器(如在 Next.js 中默认使用 swc 来处理 TypeScript 和 JSX)
对比 esbuild
、swc
和 Babel
SWC 在性能方面表现卓越,单线程上比 Babel 快 20 倍,四核上快 70 倍。
采用编译型的 Rust 语言开发,在编译时将代码直接转化为机器码,执行效率高
JavaScript 是解释型语言,尽管现代引擎使用 JIT 技术提升性能,但本质上运行时开销更大
总结对比表
功能/特性 | esbuild | SWC | Babel |
---|---|---|---|
开发语言 | Go | Rust | JavaScript |
构建速度 | ⚡⚡⚡ 最快 | ⚡⚡ 很快 | ⚡ 较慢 |
是否支持打包 | ✅ 是(核心功能) | ❌ 否 | ❌ 否 |
TypeScript 支持 | ✅ 原生支持 | ✅ 原生支持 | ✅ 插件支持 |
JSX 支持 | ✅ 原生支持 | ✅ 原生支持 | ✅ 插件支持 |
插件生态 | 中等 | 中等 | ⭐⭐⭐ 强大 |
是否适合开发服务器 | ✅ 非常适合 | ✅ 适合 | ❌ 不适合 |
是否适合构建生产 | ✅ 是 | ✅ 是 | ✅ 是 |
是否适合代码转换 | ✅ 基础转换 | ✅ 深度转换 | ✅ 深度转换 |
社区成熟度 | 中等 | 成长中 | ⭐⭐⭐ 非常成熟 |
推荐使用场景
场景 | 推荐工具 | 理由 |
---|---|---|
快速打包 & 构建(如 CI、本地服务) | esbuild | 极快的速度,零配置即可完成打包和压缩。 |
替代 Babel 进行代码转换 | swc | 高性能且支持 TypeScript、React,适合现代化项目。 |
传统项目 / 需要强大插件系统 | Babel | 成熟生态,丰富的插件库,适合需要精细控制编译流程的项目。 |
React + TypeScript 项目 | swc | Next.js 默认使用 swc,性能更好。 |
构建 Electron 应用 | esbuild | 支持打包为单文件,构建速度快。 |
需要 Polyfill 支持 | Babel | 内置 polyfill 支持,适合兼容老旧浏览器。 |