解读 ESLint 项目 CHANGELOG:从 v0.0.6 到 v10.9.1 的版本演进与变更记录
2026/9/11 1:57:18 网站建设 项目流程

解读 ESLint 项目 CHANGELOG:从 v0.0.6 到 v10.9.1 的版本演进与变更记录

【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint

CHANGELOG.md是 ESLint 项目(定位为 "Find and fix problems in your JavaScript code")的核心发布记录文件,位于仓库根目录,共计 10,116 行,完整记录了从 2013 年 7 月的v0.0.6到 2026 年 8 月的v10.9.1之间422 个版本条目,是目前了解该项目发展脉络、规则演进与破坏性变更的第一手资料。本文将系统拆解该文件的结构与约定,梳理每个大版本的核心走向,并教你如何把它当作排查问题、评估升级成本、追踪规则能力变化的实用工具。

一、文件总览:一份跨越 13 年的工程日志

在 CHANGELOG.md 中,每个版本条目由两部分构成:

  • 版本标题行:以v开头,紧跟语义化版本号和发布日期,例如v10.9.1 - August 24, 2026
  • 提交条目列表:每条以*开头,格式统一为commit hash 类型: 描述 (#PR号) (作者)

以文件开头的v10.9.1为例:

v10.9.1 - August 24, 2026 * fix: no-loss-of-precision false positive with trailing decimal point (#21251) (Aleksandr Shoronov) * docs: add deprecation steps for EOL package versions (#21248) (Francesco Trotta) * chore: update ecosystem plugins (#21249) (ESLint Bot)

从这份文件的统计来看(对版本标题行做检索可得全部 422 个版本标题),它覆盖了项目从早期原型到当前主流版本的完整生命周期:最早的v0.0.6 - July 16, 2013出现在文件末尾附近,而仓库 package.json 中记录的当前版本正是文件头部的v10.9.1,两者完全吻合。

二、条目格式约定:如何读懂每一条提交记录

2.1 标准条目结构

CHANGELOG 中绝大多数条目遵循统一的模板,这在 v9 之前的历史条目中表现得尤其典型。一条完整记录包含五个要素:

要素示例作用
Commit Hash1e641c9定位到具体提交,用于 git 追溯
变更类型前缀fix:feat:docs:标识变更性质,也是语义化分类依据
变更对象与描述no-loss-of-precision false positive...指明受影响的规则/模块及具体行为变化
PR 编号#21251关联到评审与讨论现场
作者(Aleksandr Shoronov)责任归属与致谢

其中类型前缀是理解变更影响范围的关键,从全文的条目中可以归纳出以下高频类型:

  • feat:—— 新增能力,例如feat: handle underflow in no-loss-of-precision(v10.9.0)、feat: add checkConditionalExpressions to no-unmodified-loop-condition(v10.9.0);
  • fix:—— 缺陷修复,通常针对误报(false positive)、漏报或崩溃,例如fix: prevent unsafe no-var autofix with hoisted functions(v10.9.0)、fix: quadratic-time regex in prefer-template(v10.8.0);
  • docs:—— 文档更新,如docs: add deprecation steps for EOL package versions
  • chore:—— 工程维护,如依赖升级chore: update ecosystem plugins、CI 调整ci: bump github/codeql-action
  • refactor:—— 内部重构,不改外部行为,例如refactor: Config class(v9.9.1)、refactor: remove lib/linter/rules.js(v10.0.0);
  • test:—— 测试补充与加固,例如 v10.8.1 中大量test: add error locations to ...系列条目;
  • build:—— 构建与发布流程,常与自动提交同时出现(如Build: changelog update for ...)。

2.2 破坏性变更标记:feat!:fix!:

在大版本(尤其是 v10.0.0)的条目中频繁出现带感叹号的类型前缀,这是 ESLint 内部约定俗成的破坏性变更标记。例如 v10.0.0 阶段集中出现:

feat!: remove eslintrc support (#20037) feat!: Remove deprecated rule context methods (#20086) feat!: require Node.js ^20.19.0 || ^22.13.0 || >=24 (#20160) feat!: enable JSX reference tracking (#20152) fix!: remove deprecated LintMessage#nodeType and TestCaseError#type (#20096) fix!: stricter rule tester assertions for valid test cases (#20125)

这类条目的语义是:升级到该版本时,既有配置、API 或运行环境可能需要同步调整。升级前,应优先筛查本小节内的所有!条目,逐一对照迁移指南评估影响面。

2.3 预发布版本条目的特殊性

v10.0.0 正式版(February 6, 2026)之前,CHANGELOG 中保留了完整的预发布阶梯:v10.0.0-alpha.0(November 14, 2025)→v10.0.0-alpha.1v10.0.0-beta.0v10.0.0-rc.0v10.0.0-rc.1v10.0.0-rc.2→ 正式版。这些预发布条目的内容会与正式版部分重叠(正式版条目聚合了各阶段积累的变更),其价值在于:可以按阶段追溯某个破坏性变更是从哪个 alpha 版本开始引入的,便于二分定位问题。历史上 v9.0.0、v8.0.0、v7.0.0 等大版本也都遵循同样的 alpha/beta/rc 发布流程,例如v9.0.0-alpha.0 - December 29, 2023v9.0.0-beta.0v9.0.0-rc.0直至v9.0.0 - April 5, 2024

三、版本演进主线:从 0.0.x 到 10.x 的里程碑

将文件中的版本标题按时间排列,可以清晰看到 ESLint 的演进节奏。早期版本迭代极快(2013–2016 年几乎每月数个版本),从 v1.0.0 开始进入稳定节奏,随后每次大版本大约间隔一年到两年。以下是关键里程碑及其核心内容:

3.1 起源阶段(v0.0.6 – v0.x,2013 年)

文件末尾的v0.0.6 - July 16, 2013v0.0.7 - July 22, 2013记录了项目最初的原型工作:添加不可达代码检测(switch case 与 continue/break 之后)、throw/return之后代码检测、花括号检查、缺失分号规则("Added rule to check for missing semicolons")、guard-for-in规则等。当时项目还无法自举,使用.jshintrc做自身的静态检查("Added .jshintrc file (until ESLint can lint itself)")。

v0.1.0 - November 03, 2013,规则体系开始成形:no-control-regexno-div-regexblock-scoped-varstrict(缺失'use strict'检测)、no-global-strict等相继加入;同时出现了几个沿用至今的机制雏形:config.globals全局变量配置("Implement config.globals")、通过注释禁用/启用规则("Disabling/enabling rules through comments")、以及 "Added script to auto-generate changelog"——CHANGELOG 的自动生成传统从 v0.1.0 就已确立

3.2 走向稳定的 1.x(v1.0.0 – v1.10.0,2015 年)

v1.0.0 - July 31, 2015标志着项目进入语义化版本稳定期,其发布流程包含v1.0.0-rc-1v1.0.0-rc-2v1.0.0-rc-3三个候选版本。此阶段还可见早期"formatter(格式化器)"与 CLI 输出机制的演化记录,例如"Change reporters to formatters, add format command line option"、"Add problem count to compact formatter",这些正是今天 lib/cli-engine/formatters 目录的前身。

3.3 大版本轮替(v2.0.0 → v10.0.0)

  • v2.0.0(February 12, 2016):紧随 1.x 之后,继续规则与配置能力的增量演进;
  • v3.0.0(July 1, 2016):完成新一轮破坏性变更收敛;
  • v4.0.0(June 11, 2017):进入更成熟的规则治理阶段;
  • v5.0.0(June 22, 2018);
  • v6.0.0(June 21, 2019);
  • v7.0.0(May 8, 2020):预发布序列v7.0.0-alpha.0(January 17, 2020)起历经 4 个 alpha、1 个 rc;
  • v8.0.0(October 9, 2021):同样经历 alpha/beta/rc 全流程;
  • v9.0.0(April 5, 2024):预发布从v9.0.0-alpha.0 - December 29, 2023开始。该版本引入了--inspect-configCLI 标志、reportUsedIgnorePattern选项(no-unused-vars)、flat config 相关的name字段文档化,以及"move AST traversal into SourceCode"等内部重构;
  • v10.0.0(February 6, 2026):最近一次大版本,详见下一节。

3.4 v10.0.0:一次彻底的架构收敛

v10.0.0的条目(含其 alpha/beta/rc 阶段条目)集中体现了当前仓库 lib、packages 与 docs 目录所对应的技术栈现状。归纳其核心变更:

  1. 彻底移除 eslintrc 支持feat!: remove eslintrc support (#20037)。这解释了当前仓库配置体系全面采用 flat config(lib/config/flat-config-array.js、lib/config/flat-config-schema.js),并在 messages/eslintrc-incompat.js 中保留了对旧配置的兼容性报错;
  2. 精简导出面fix: remove fake FlatESLint and LegacyESLint exports (#20460),对外 API 收敛到 lib/api.js、lib/universal.js 等统一入口;
  3. Node.js 版本要求收紧feat!: Require Node.js ^20.19.0 || ^22.13.0 || >=24 (#20160)
  4. JSX 引用跟踪feat!: enable JSX reference tracking (#20152),强化对 JSX 作用域的分析能力;
  5. RuleTester 断言增强feat!: estimate rule-tester failure locationfeat: add error assertion optionsfeat: rule tester add assertion option requireData等一批能力落地于 lib/rule-tester/rule-tester.js;
  6. 规则选项收紧与清理fix!: add uniqueItems: true in no-invalid-regexp optionfix!: Deprecate "always" and "as-needed" options of the radix rulefix!: tighten func-names schemafeat!: update eslint:recommended configuration等,均可在 lib/rules 对应文件中找到 schema 定义佐证;
  7. 不再保留 v10 实验性 flagsfeat!: remove v10_* and inactive unstable_* flags (#20225)

v10 之后的迭代节奏(v10.1.0 → v10.9.1,2026 年 3 月至 8 月)以每两周一版的频率进行,内容以规则修复和增量功能为主,例如v10.9.0feat: add checkConditionalExpressions to no-unmodified-loop-conditionv10.8.0feat: export ConfigObject from eslint/config。值得注意的是,v10 主线上还并行维护着 v9 分支:v9.39.2(December 12, 2025)、v9.39.4v9.39.5(July 10, 2026)等条目表明项目采取"旧大版本按需补丁、新大版本快速迭代"的发布策略。

四、变更类别透视:规则、工具链与工程化

4.1 规则层:高频出现的演进主题

对规则相关的feat/fix条目做归因,可以提炼出 ESLint 规则维护的三个持续主题:

  1. 误报(false positive)压制:如fix: no-loss-of-precision false positive with trailing decimal pointfix: avoid no-invalid-regexp false positive for shadowed RegExpfix: avoid prefer-numeric-literals false positive for shadowed globals。这些条目通常伴随精确到 AST 节点或作用域场景的描述,是排查"为什么这条规则误报"时的直接线索;
  2. 自动修复(autofix)安全性:如fix: prevent unsafe no-var autofix with hoisted functionsfix: prevent ASI hazard in no-unused-labels autofixfix: handle ASI hazards in no-unused-vars removeVar suggestion。自动修复可能改变语义(ASI 风险、函数提升),因此这类修复通常对应 lib/linter/source-code-fixer.js 中 fixer 合并策略的调整;
  3. 新选项与覆盖场景扩展:如feat: add errorClassNames option to preserve-caught-error rulefeat: max-nested-callbacks option for constructor callbacksfeat: add countThis option to max-params。新增选项的 schema 均可在 lib/rules 对应文件中直接查阅。

4.2 测试与质量保障

从 v10.8.1 开始出现成批的test: add error locations to ...条目(涉及no-voidno-unreachableno-undefrequire-awaitno-extra-labeleqeqeq等大量规则),配合 v10.0.0 的feat!: estimate rule-tester failure location,体现了项目对测试用例位置信息完整性的系统化收口。仓库中 tests/lib/rules 下的 301 个测试文件即对应这一测试体系。

4.3 工程化与 CI

CHANGELOG 中还记录了大量ci:chore:条目,例如 CI 中新增 Node.js 26(ci: add Node.js 26 to CI)、Dependabot/CodeQL Action 版本升级、生态插件同步(chore: update ecosystem plugins)、以及"run ecosystem tests on pull requests"(在 PR 阶段即运行生态测试,防止规则变更破坏下游插件)。这解释了为什么 ESLint 对规则行为的变更如此谨慎——任何fix:都可能影响庞大的插件生态。

五、如何高效利用这份 CHANGELOG

5.1 定位某个规则的变更历史

no-unused-vars是项目中维护最活跃的规则之一。以它为线索,在文件中搜索no-unused-vars可以看到其在 v10.9.0(add reportUsedIgnorePattern option)、v10.8.1(handle ASI hazards in no-unused-vars removeVar suggestion)、v10.8.0(destructuring in catch clause in no-unused-vars)等多个版本中的修复与增强记录。据此可以:

  • 判断"当前版本是否已修复我遇到的误报"——搜索规则名 + 误报描述关键词;
  • 决定是否升级——若修复版本已发布,升级到包含该条目的版本即可。

5.2 评估升级风险

升级前,定位大版本区块,逐条扫描带!的条目,重点核对:Node 版本要求、配置格式要求(如 eslintrc 移除)、被删除的 API/选项(如LintMessage#nodeTyperadix规则的"always"/"as-needed"选项、SourceCode废弃方法)。再结合仓库 docs/use 目录下的迁移文档规划改造。

5.3 追溯构建与发布流程

文件中大量Build: changelog update for ...package.json update for @eslint/js release等自动提交,佐证了 ESLint 的发布流水线:由 CI 在打 tag 时自动生成 CHANGELOG 条目并更新 package.json 版本号。当前仓库版本10.9.1与文件头部一致,也是这一流程的结果。

5.4 配合源码做交叉验证

CHANGELOG 是"变更的索引",源码是"变更的实现"。例如读到feat: add errorClassNames option to preserve-caught-error rule(v10.7.0),可到 lib/rules/preserve-caught-error.js 中查看errorClassNames的 schema 与校验逻辑;读到feat!: enable JSX reference tracking,可到 lib/languages/js 中查看 JSX 作用域处理的实现。这种"日志 → 源码"的对照路径,是把版本记录转化为代码理解的最短通道。

六、局限性说明与阅读建议

  • 粒度以提交为单位:CHANGELOG 反映的是每个提交的独立变更,多个关联提交可能共同构成一个完整特性,阅读时建议按 PR 编号聚合理解;
  • 历史条目不含重大变更注记:早期版本(如 v0.x 时代)条目没有feat!:/fix!:标记体系,破坏性变更需结合当时文档判断,不能直接套用 v10 的标记约定;
  • 版本策略前提:文中所有版本号、日期、变更内容均以当前仓库 CHANGELOG.md 实际记录为准;随着项目继续迭代,该文件的头部条目会持续更新,本文所述以 v10.9.1 为最新版本。

总的来说,这份 10,000 余行的 CHANGELOG 既是 ESLint 十余年工程演进的浓缩档案,也是一份可直接检索使用的"规则变更字典":它告诉你在哪个版本、因为什么原因、由谁改变了什么行为。掌握它的格式约定与检索方法,就能把每次升级、每个误报的排查都建立在准确的版本证据之上。

【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询