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,现代浏览器优先
  • 插件配置更新,成熟模块重命名等

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

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

👇 参考文献:

相关推荐
To_OC7 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
To_OC7 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
vipbic7 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy7 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志8 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble9 小时前
c端系统,其实更像一个信息展示平台
前端
你怎么知道我是队长9 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
李姆斯10 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜10 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司11 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能