cover
2022年10月17日 - 2023年7月31日

无处不在的 babel

babel 作为前端生态圈举足轻重的一员,在前端工程化等领域起着非常重要的作用。今天一起来看看那些常见的 babel 使用场景,看一看 babel 的生态圈有多庞大。

webpack:babel-loader

虽说这一年来 vite 大火,但是 webpack 依旧占据着主流地位。babelwebpack 可以说是相互成就,基本配置 webpack 时必不可少的插件就是 babel-loaderwebpack 帮助前端开发者解决了工程化打包、开发的问题,而 babel 则帮助我们解决了 JS 的兼容问题。

随着 babel 最近几年的更新,在 webpack 中的配置也是越来越简单,我们只需要下载 babel-loader @babel/core @babel/preset-env 这三个依赖包,然后在 webpack.config.js 中配置好 babel 的配置即可。还记得早期 webpackbabel 刚盛行的时候,需要下载和配置一堆的 babel 插件,而现在 babel 通过 preset 方案大大降低了配置成本。

rollup:@rollup/plugin-babel

rollup 在库开发中的地位和 webpack 在普通项目开发中的地位相当,而且 vite 还是深度依赖 rollup 来进行打包,包括它的插件设计都是参考 rollup 的插件来的。然而在实际使用中,为了保障代码能够正常运行,我们依旧需要使用 @rollup/plugin-babel 来帮助解决转译和 polyfill 问题。

vite:@vitejs/plugin-legacy

vite 在最近的一年里热度上升迅速,大有赶超 webpack 的趋势,然而如果你想让你的产品安心上线,就需要考虑浏览器的兼容问题,特别是在国内。于是 vite 团队开发了 @vitejs/plugin-legacy 插件来解决兼容问题。

而其实 @vitejs/plugin-legacy 就是使用 babel 来实现兼容的,不过不同于在 webpackrollup 中的使用,@vitejs/plugin-legacy 使用的是 @babel/standalone,所以不需要额外的插件等依赖包,而且配置也是被 @vitejs/plugin-legacy 封装好的,不需要自行编写,所以在使用时让开发者几乎感觉不到 babel 的存在。

@babel/cli

babel 本身也提供了 cli 工具用来进行直接的代码转译。一般使用在开发开源库时,有些包除了会将库使用 webpack 等工具进行打包外,还会再使用 @babel/cli 直接进行文件转译,这样可以方便进行文件级别的按需加载,当然在 tree-shaking 到来后,这种需求正在慢慢减少。

@babel/standalone

@babel/standalone 上面也提到过,在 @vitejs/plugin-legacy 中使用的就是它了,它是另一个 babel 官方提供的能够直接调用 babel 能力的包。不同于使用 @babel/core 需要自行安装或配置各种插件,@babel/standalonebabel 自身几乎所有的插件全部内置,并且它可以直接在浏览器运行,当然带来的问题就是它庞大的体积和略差的性能。一般情况下不推荐使用,只有在一些浏览器需要在线编译的特殊场景才会用到。

eslint:@babel/eslint-parser

现代前端开发者 eslint 也是不可或缺的一员,然而 eslint 本身的 parser 所支持的语法速度有时会和项目中所用到的有所差别,此时便可以通过 @babel/eslint-parser 来让 eslint 识别这些语法,保证开发提示和编译的统一性。

react:@babel/preset-react

当我们在开发 react 应用时,必然需要处理 jsx 的编译问题,babel 一样提供了方案,通过 @babel/preset-react,不但可以解决 jsx 的编译问题,它还能帮忙自动添加 displayName,还支持自定义 jsx 实现。

typescript:@babel/preset-typescript

TS 无比流行的现在,我们在开发时必然绕不开 TS 的编译问题,此时 babel@babel/preset-typescript 插件便可以派上用场,使用后可以一站式解决编译转译问题,不需要再借助额外的 ts-loader 等。

codemod - jscodeshift

此外,babelcodemod 中也起着重要的作用,如 jscodeshift 中就是使用 babel 来生产 AST 并进行节点遍历来实现 codemod

总结

除了上面讲到的这些常见的工具、库等需要用到 babel 外,还有很多如 jestvue 等等也会有和 babel 相关的内容。总之,只要你想使用新语法、新 API,而你的产品使用用户的使用环境又存在着与你想要使用的语法的兼容问题,那 babel 基本会成为项目中必不可少的部分。