解读 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 Hash | 1e641c9 | 定位到具体提交,用于 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.1→v10.0.0-beta.0→v10.0.0-rc.0→v10.0.0-rc.1→v10.0.0-rc.2→ 正式版。这些预发布条目的内容会与正式版部分重叠(正式版条目聚合了各阶段积累的变更),其价值在于:可以按阶段追溯某个破坏性变更是从哪个 alpha 版本开始引入的,便于二分定位问题。历史上 v9.0.0、v8.0.0、v7.0.0 等大版本也都遵循同样的 alpha/beta/rc 发布流程,例如v9.0.0-alpha.0 - December 29, 2023、v9.0.0-beta.0、v9.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, 2013与v0.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-regex、no-div-regex、block-scoped-var、strict(缺失'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-1、v1.0.0-rc-2、v1.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 目录所对应的技术栈现状。归纳其核心变更:
- 彻底移除 eslintrc 支持:
feat!: remove eslintrc support (#20037)。这解释了当前仓库配置体系全面采用 flat config(lib/config/flat-config-array.js、lib/config/flat-config-schema.js),并在 messages/eslintrc-incompat.js 中保留了对旧配置的兼容性报错; - 精简导出面:
fix: remove fake FlatESLint and LegacyESLint exports (#20460),对外 API 收敛到 lib/api.js、lib/universal.js 等统一入口; - Node.js 版本要求收紧:
feat!: Require Node.js ^20.19.0 || ^22.13.0 || >=24 (#20160); - JSX 引用跟踪:
feat!: enable JSX reference tracking (#20152),强化对 JSX 作用域的分析能力; - RuleTester 断言增强:
feat!: estimate rule-tester failure location、feat: add error assertion options、feat: rule tester add assertion option requireData等一批能力落地于 lib/rule-tester/rule-tester.js; - 规则选项收紧与清理:
fix!: add uniqueItems: true in no-invalid-regexp option、fix!: Deprecate "always" and "as-needed" options of the radix rule、fix!: tighten func-names schema、feat!: update eslint:recommended configuration等,均可在 lib/rules 对应文件中找到 schema 定义佐证; - 不再保留 v10 实验性 flags:
feat!: remove v10_* and inactive unstable_* flags (#20225)。
v10 之后的迭代节奏(v10.1.0 → v10.9.1,2026 年 3 月至 8 月)以每两周一版的频率进行,内容以规则修复和增量功能为主,例如v10.9.0的feat: add checkConditionalExpressions to no-unmodified-loop-condition、v10.8.0的feat: export ConfigObject from eslint/config。值得注意的是,v10 主线上还并行维护着 v9 分支:v9.39.2(December 12, 2025)、v9.39.4、v9.39.5(July 10, 2026)等条目表明项目采取"旧大版本按需补丁、新大版本快速迭代"的发布策略。
四、变更类别透视:规则、工具链与工程化
4.1 规则层:高频出现的演进主题
对规则相关的feat/fix条目做归因,可以提炼出 ESLint 规则维护的三个持续主题:
- 误报(false positive)压制:如
fix: no-loss-of-precision false positive with trailing decimal point、fix: avoid no-invalid-regexp false positive for shadowed RegExp、fix: avoid prefer-numeric-literals false positive for shadowed globals。这些条目通常伴随精确到 AST 节点或作用域场景的描述,是排查"为什么这条规则误报"时的直接线索; - 自动修复(autofix)安全性:如
fix: prevent unsafe no-var autofix with hoisted functions、fix: prevent ASI hazard in no-unused-labels autofix、fix: handle ASI hazards in no-unused-vars removeVar suggestion。自动修复可能改变语义(ASI 风险、函数提升),因此这类修复通常对应 lib/linter/source-code-fixer.js 中 fixer 合并策略的调整; - 新选项与覆盖场景扩展:如
feat: add errorClassNames option to preserve-caught-error rule、feat: max-nested-callbacks option for constructor callbacks、feat: add countThis option to max-params。新增选项的 schema 均可在 lib/rules 对应文件中直接查阅。
4.2 测试与质量保障
从 v10.8.1 开始出现成批的test: add error locations to ...条目(涉及no-void、no-unreachable、no-undef、require-await、no-extra-label、eqeqeq等大量规则),配合 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#nodeType、radix规则的"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),仅供参考