跳至主内容

babel-eslint 的现状

· 1 分钟阅读
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

babel-eslint 已迁移至 @babel/eslint-parser

历史回顾

作为 Babel 和 ESLint 这两个由不同团队维护项目之间的兼容层,babel-eslint 自诞生起就是一个难以维护的包。团队在维护 babel-eslint 过程中面临的主要挑战包括:

  • babel-eslint 历史上由 Babel 团队维护,确保 ESLint 的核心规则(每两周发布一次)能兼容实验性语法是项艰巨任务

  • Babel 的内部 AST 表示与 ESTree(ESLint 使用的 AST 规范)存在差异,因此要实现 ESLint 兼容性,Babel 解析器需要插件来输出符合 ESTree 规范的 AST

  • Babel 支持实验性语法,而 ESLint 核心仅支持达到 Stage 4 并最终定案的语法。这意味着 ESLint 核心规则不适用于 Stage 3 及以下的语法。此外,ESLint 受限于 ESTree 规范的定稿进度,导致两个项目支持的语法差异日益扩大

  • babel-eslint 依赖的 Babel 解析器版本是其 package.json 中的直接依赖项,启用的插件也是硬编码的,这导致编译和代码检查可能使用不同版本及语言特性,历史上引发了大量混淆和难以调试的问题。我们认为解决此问题对维护者和终端用户都是重大改进

  • babel-eslint 需要持续适配两个上游项目的变化,但往往与某一方脱节

上述挑战使 babel-eslint 所需资源超出团队负荷,导致 babel-eslint 这个每周下载量达 600 万次(截至本文写作时)的流行项目无法及时更新

当前进展

babel-eslint 的迭代更新中,我们决定以新名称发布包:@babel/eslint-parser。为缓解前述挑战,我们采取以下措施:

  • @babel/eslint-parser 将要求 @babel/core 作为 peer 依赖项,并通过 Babel 核心 API 读取应用配置,确保编译和代码检查使用相同版本及设置,符合 Babel 生态其他包的推荐实践

  • @babel/eslint-parser 将移至主仓库 babel/babel,与其他 Babel 包共同维护,有助于解决 babel-eslint 过去遇到的一些同步问题,并支持用 GitHub 最新源码进行代码检查,缩短 Babel 变更对检查流程的影响周期

  • ESLint 遵循的 AST 规范 ESTree 近期重新活跃,Babel 团队已积极参与其中,这将促进实验性语法 AST 表示的实践经验共享,提升工具间集成效率

  • Kai Cataldo 参与维护 babel-eslint 多年,同时作为 Babel 和 ESLint 的维护者,在提升工具互操作性方面具有独特优势。过去数月他主导了上述代码变更,并将在新包发布后持续提供支持

未来规划

我们确信这些新包已准备好发布。鉴于涉及众多集成和项目(Babel、ESLint、Prettier、框架、各种插件、文本编辑器集成、命令行工具等),我们预计会有需要修复的问题,并计划快速迭代更新。

请注意:@babel/eslint-parser 将依赖 @babel/core 作为 peer 依赖项,此包必须存在于您项目的 node_modules 中。

确保已安装 @babel/core 后,可通过以下命令从 babel-eslintbabel-eslint-plugin 升级到新包:

npm uninstall babel-eslint babel-eslint-plugin
npm install --save-dev @babel/eslint-parser @babel/eslint-plugin
.eslintrc.js
module.exports = {
--- parser: "babel-eslint",
+++ parser: "@babel/eslint-parser"
plugins: [
--- "babel"
+++ "@babel
]
};

@babel/eslint-parser 需要标准的 Babel 配置文件(.babelrcbabel.config.js)。对于不想使用配置文件或通过其他工具(如 Webpack 的 babel-loader)运行 Babel 的用户,@babel/eslint-parser 也支持通过 ESLint 配置应用 Babel 配置选项。详见 babelOptions 配置说明。

携手并进

我们实施上述变更的短期目标是:降低 @babel/eslint-parser 的维护成本,同时让使用 ESLint 对 Babel 编译代码进行校验变得更简单可靠。诚邀您参与共建!在 GitHub 贡献代码或通过财务捐助都将助力我们为社区打造更完善的集成方案。