ES5 凉凉,Babel 8 正式发布,默认不再编译为 ES5 和 CJS......

👇 今日要闻

打破信息壁垒,走近全球前端。Hello 大家好,我是林语冰。

Babel 团队官宣,Babel 8 正式发布,主要包括:

  • Babel 8 现在只支持 纯 ESM 模块(ESM-only)
  • 所有 Babel 官方模块都内置了 TypeScript 类型定义
  • 默认不再编译为 ES5 和 CommonJS

Babel 8 的重心不在于添加大量新功能,而是针对 Babel 自身架构的现代化改造。

本期我们会看到,从 Babel 7 升级到 Babel 8 不会像以前一样存在很多阻力,本次主版本升级会更加丝滑。

👉 Babel 8 重大更新

Babel 8 要求 Node.js 最低版本至少为 Node 22+,因为 Node 20.x 已经停止维护。

Babel 团队推荐使用 Node 24 ,这是 Node.js 的 LTS(长期支持版),支持 require(esm) 这种 CJS 和 ESM 模块混合导入的功能。

之前,Babel 7 编译的输出目标是兼容所有浏览器,而现在 Babel 8 默认的输出目标是尽量兼容大多数 现代浏览器

babel.config.json 中的默认配置变化如下:

同时,Babel 8 现在只以原生 ESM 模块 发布,所有官方模块不再提供 CJS 等其他非标准模块格式。

此外,现在所有 Babel 官方模块都内置 TS 类型,这意味着你现在可以在 TS 项目中使用 Babel 编程式 API,无需安装 @types/babel__* 等类型定义模块作为开发依赖。

当使用 Babel API 开发插件或直接把 Babel 作为工具库导入使用时,也要注意 Babel 8 API 的变化。

举个栗子,Babel 8 的 AST(抽象语法树)和之前有所不同:

上面这段 JS 动态导入的源码会生成下列 AST:

可以看到,现在 Babel 8 的 AST 和之前略有不同,实际操作 AST 时要注意这个区别,另请参考 Babel 官网提供的《Babel 8 API 升级指南》。

👉 Babel 插件的变化

Babel 8 中,所有预设和插件都要求 @babel/core@^8 作为对等依赖(peerDependencies)。

如果你想进一步把 Babel 8 和 ESLint 结合使用,那么 @babel/eslint-parser@babel/eslint-plugin 还要求至少升级到 ESLint 9,这两个模块不再支持 ESLint 7 和 ESLint 8。

另外,@babel/preset-env 预设环境默认不再把代码编译为 ES5,而且会编译为 ESM 模块而不是 CJS 模块。

作为新版替代方案,@babel/preset-envtarget 选项会继承顶层 @babel/core 的同名配置,所以目前 Babel 8 默认的编译目标是 ES2023

因为 Babel 8 现在默认会采用 browserslist(浏览器列表)的 defaults 查询结果,这是一个针对全球浏览器兼容性和采用率自动更新的动态编译目标。

随着 IE 浏览器的退役和 ES6 的普及,这是一个与时俱进的改动。但如果你确实需要编译到 ES5 去支持旧版浏览器,你可以在 Babel 的配置中手动自定义 targets 或创建 .browserslistrc 配置。

注意,生态相关插件也从 Babel 7.22 开始重命名,插件模块名从 ...-proposal-... 重命名为 ...-transform-...,这标志着这些插件对应的 JS 提案已经正式到达 Stage4 了。

示例如下:

Babel 7 Babel 8
@babel/plugin-proposal-dynamic-import @babel/plugin-transform-dynamic-import
@babel/plugin-proposal-json-modules @babel/plugin-transform-json-modules
... ...

安装上述插件或升级 Babel 项目时,插件名称需要同步更新。

另外一个配置的重大变化是,以前在 @babel/preset-env 预设或其他插件中,Babel 一直支持 loosespec 选项,用于调节编译兼容性、性能和体积等。

现在,Babel 8 不推荐使用 loosespec 选项,直接从 @babel/preset-env 中删除,其他插件也慎用这两个配置。

举个栗子,以前的 spec 选项现在等价于下列配置:

可以看到,替代方案是优先使用 assumptions 选项,这个配置从 Babel 7.13 次版本开始就已经支持,Babel 8 强烈推荐全面采用。

针对 polyfill(功能补丁),Babel 8 不建议使用 @babel/preset-envuseBuiltIns 选项,以及 @babel/plugin-transform-runtimecorejs 选项。

Babel 8 推荐将其删除,改用 babel-plugin-polyfill-corejs3,它提供了一种控制 core-js 注入的集中式方案。

由于 core-js@2 已经多年没有维护了,你应该改用 core-js@3,在 babel.config.json 中更新下面的插件配置:

👉 Babel 生态现状

随着 Babel 8 稳定,Babel 7 将暂停移植修复补丁和新功能。但仍会提供一年的安全支持,直至明年 6 月。

目前为止,尤雨溪公司的 Oxc 等原生编译器尚未对 Babel 造成致命打击。

Babel 依然是前端工程优雅降级的流行转译器,它的周下载量从 2018 年的 170 万次,暴涨到今年 6.51 亿次。

鉴于 Babel 在前端工程依然举足轻重,我们还是要继续投入精力掌握它。Babel 官方也提供了详细的《Babel 8 升级指南》。

👇 重点总结

Babel 团队官宣,Babel 8 正式发布,主要包括:

  • Babel 8 现在只支持 纯 ESM 模块
  • 默认编译为 ES2023 而非 ES5,现代浏览器优先
  • 插件配置更新,成熟模块重命名等

👍 以上就是本期《前端日报》的全部内容了,如果读完对你有所帮助,可以按赞打卡、在看推荐或转发分享。

🙏 已经关注我的粉丝们,我们下期再见啦,掰掰~~

👇 参考文献:

相关推荐
光影少年3 小时前
react批量更新、同步/异步更新场景
前端·react.js·掘金·金石计划
假如让我当三天老蒯3 小时前
模块化:ES Module 与 CommonJS 的区别
前端·面试
用户40950115773173 小时前
Private Forge v2.0 发布:12大前端业务场景技能系统
前端
weedsfly3 小时前
异步编程全景与事件循环——彻底搞懂 JS 执行机制
前端·javascript
用户059540174463 小时前
AI Agent记忆测试踩坑实录:Mock骗了我一周,Mem0+pytest一招破局
前端·css
用户1733598075373 小时前
纯前端 PDF 数字签名实战:Vue 3 + pdf-lib 在浏览器里完成签名嵌入
前端·javascript
IT_陈寒4 小时前
SpringBoot自动配置的坑,我爬了三天才出来
前端·人工智能·后端
Avan_菜菜11 小时前
AI 能写代码了,为什么我反而开始要求它先写文档?
前端·github·ai编程
JieE21214 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法