:用 `eslint-suppressions.json` 渐进式启用严格规则)
ESLint 批量抑制Bulk Suppressions用eslint-suppressions.json渐进式启用严格规则【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint导读本文围绕 ESLint 的批量抑制Bulk Suppressions功能展开讲解如何在已存在大量历史违规的代码库中渐进式地启用新的error级别规则先用一行命令把存量违规“存档”进eslint-suppressions.json让新代码继续被严格约束再按自己的节奏逐步修复旧问题并清理存档。读完本文你将掌握--suppress-all、--suppress-rule、--prune-suppressions等 CLI 参数的完整用法、抑制文件的内部结构与匹配原理以及如何通过 Node.js API 以编程方式应用抑制。为什么需要批量抑制在项目早期就开启新规则很简单但当代码库已经成长到一定规模时把一条新规则直接配置为error会立刻产生成百上千条违规阻塞 CI、淹没团队。更麻烦的是如果规则本身不可自动修复无法靠--fix解决团队就必须手工清理完所有存量违规才能启用规则——而在清理期间新代码还可能引入更多违规形成永远追不上的困境。ESLint 的批量抑制功能正是为这一场景设计的它允许你对一条或多条规则批量抑制现有违规。规则会对新代码继续生效而已存在的违规不再被报告你可以按自己的节奏逐步处理历史遗留问题。::: important 关键限制 只有配置为error的规则才会被抑制。如果规则以warn启用ESLint 不会抑制其违规。这一点在 抑制服务的统计逻辑 中有直接体现countViolationsByRule()只统计severity 2的消息即 error 级别warning 一律不计入抑制。 :::用 CLI 批量抑制现有违规在配置文件如eslint.config.js中把规则启用为error之后执行eslint --fix --suppress-all命令说明--fix先自动修复可修复的违规避免把本可自动修复的问题也一并抑制掉这是官方文档明确推荐的做法。--suppress-all抑制当前所有以error启用的规则的全部现存违规。再次运行eslint时这些违规将不再被报告。如果想只抑制某一条规则使用--suppress-ruleeslint --fix --suppress-rule no-unused-expressions也可以重复传入参数一次抑制多条规则eslint --fix --suppress-rule no-unused-expressions --suppress-rule no-unsafe-assignment对应的 CLI 选项定义可在 lib/options.js 中查到--suppress-all是布尔开关默认false--suppress-rule是字符串数组类型--suppressions-location是路径类型--prune-suppressions与--pass-on-unpruned-suppressions均为布尔开关默认false。抑制文件的生成、结构与提交默认位置与文件内容执行抑制命令后ESLint 会在项目根目录即执行eslint命令的目录创建eslint-suppressions.json。该文件记录了被抑制的规则及其数量典型结构如下参考测试夹具 tests/fixtures/suppressions/eslint-suppressions.json{ test-file.js: { no-undef: { count: 3 }, no-sparse-arrays: { count: 2 } } }结构为三层嵌套文件层相对于当前工作目录cwd的文件路径统一使用 POSIX 分隔符getRelativeFilePath()中会做path.sep到/的转换见 lib/services/suppressions-service.js规则层被抑制的规则 ID计数层该文件下该规则的违规数量count。写入时使用json-stable-stringify-without-jsonify进行确定性排序序列化见 save()保证每次生成的文件内容稳定、diff 友好。一定要提交该文件eslint-suppressions.json应当提交到版本仓库让所有开发者共享同一份抑制记录否则其他人在本地运行时仍会看到已被抑制的违规团队内无法形成一致基线。自定义抑制文件位置如果需要可以用--suppressions-location改变抑制文件的位置。注意这个参数不仅在执行抑制时要传在平时运行eslint时也必须传否则 ESLint 找不到正确的抑制文件eslint --suppressions-location .github/.eslint-suppressions如果指定的路径以路径分隔符结尾或指向一个已存在的目录ESLint 会在该目录内创建一个以当前工作目录哈希命名的文件形如suppressions_hashOfCWD若指向普通文件则直接使用该文件。这一逻辑实现在 getCacheFile() 中并通过prefix: suppressions_传入见 lib/cli.js 与 lib/eslint/eslint.js。如果指定了--suppressions-location但文件不存在、且当前并非抑制模式未带--suppress-all/--suppress-ruleCLI 会直接报错退出见 lib/cli.js。修复存量违规并清理抑制未使用抑制的检测当你修复了代码、解决了部分被抑制的违规后再次运行eslint会注意到命令以非零退出码结束并提示存在不再发生的抑制 eslint There are suppressions left that do not occur anymore. Consider re-running the command with --prune-suppressions.其底层逻辑在 applySuppressions()每次 lint 时会把当前违规数与抑制计数对比——当前违规数小于等于抑制计数时消息被抑制而小于的部分以及那些已完全不再出现的规则会被收集到unused集合中。默认情况下只要存在 unused 抑制CLI 就会输出上述错误并以退出码2结束见 lib/cli.js以此提醒你清理过期的抑制记录。修剪无用抑制用--prune-suppressions移除不再需要的抑制eslint --prune-suppressionsprune()的实现见 lib/services/suppressions-service.js会若某规则的抑制计数恰好等于未使用的违规数则删除该规则的抑制条目若只修复了部分违规未使用数小于计数则把计数减去已修复的数量清空某文件下的所有规则后删除该文件条目对抑制文件中已不存在于磁盘上的文件一并清理其抑制记录。临时忽略未使用抑制如果暂时不想处理提示也不希望它影响退出码可以加--pass-on-unpruned-suppressionseslint --pass-on-unpruned-suppressions启用后未使用的抑制既不会计入退出码也不会再报告未使用抑制错误见 lib/cli.js。抑制参数之间的互斥与限制从 lib/cli.js 的校验逻辑可以看出以下组合是禁止同时使用的会直接报错并以退出码2结束--suppress-all与--suppress-rule不能同时使用前者是全量抑制后者是定向抑制语义冲突--suppress-all与--prune-suppressions不能同时使用--suppress-rule与--prune-suppressions不能同时使用--suppress-all、--suppress-rule、--prune-suppressions均不能用于管道输入piped-in code即通过 stdin 传入代码的场景。CLI 的整体执行顺序也值得注意见 lib/cli.js先按需执行suppress()写入新抑制 → 按需执行prune()修剪 → 最后统一调用applySuppressions()生成最终报告。也就是说抑制文件的更新与报告输出在同一次命令中完成。通过 Node.js API 使用抑制除了命令行抑制还可以在以编程方式使用 ESLint时应用对应文档 Node.js API。在ESLint构造函数中设置applySuppressions为trueconst eslint new ESLint({ applySuppressions: true, });默认情况下ESLint 会在当前工作目录查找eslint-suppressions.json。可以通过suppressionsLocation指定自定义位置const eslint new ESLint({ applySuppressions: true, suppressionsLocation: ./config/my-suppressions.json, });这两项选项的类型定义见 lib/types/index.d.ts。构造时若启用了applySuppressionsESLint 会实例化SuppressionsService并解析抑制文件路径见 lib/eslint/eslint.jslintFiles()会在返回结果前对全部结果应用抑制见 lib/eslint/eslint.js。使用lintText()时有一个关键要求必须提供filePath选项抑制才会生效——因为抑制是按文件路径匹配的见 lib/eslint/eslint.js。::: important Node.js API 的能力边界 Node.js API只支持应用已存在的抑制。创建新抑制对应--suppress-all、--suppress-rule以及修剪无用抑制对应--prune-suppressions目前仅能通过 CLI 完成。 :::抑制的底层匹配原理了解SuppressionsServicelib/services/suppressions-service.js的实现有助于预判边界行为按文件 规则 计数三重匹配applySuppressions()对每个 lint 结果先按规则统计 error 数量再与抑制文件中的count对比。只有当前违规数 ≤ 抑制计数时才会把消息移入LintResult#suppressedMessages并计入suppressions: [{ kind: file, justification: }]见 suppressMessagesByRule()。一旦新违规数超过计数该文件该规则的全部违规都会重新照常报告——这意味着抑制不是一刀切豁免而是带数量的额度。只统计 error如开头所述warningseverity 1不参与抑制统计。文件不存在按空处理load()在遇到ENOENT抑制文件尚未创建时返回空对象而不是报错见 lib/services/suppressions-service.js只有 JSON 解析失败才会抛出异常。统计字段同步重算消息被抑制后会通过calculateStatsPerFile()重算errorCount等统计字段保证报告数字与抑制后的消息一致见 lib/services/suppressions-service.js。这些行为都有对应的单元测试覆盖参见 tests/lib/services/suppressions-service.js。推荐工作流渐进式启用新规则结合以上全部机制推荐的落地流程为评估在eslint.config.js中将新规则配置为error本地先跑一次确认违规规模抑制执行eslint --fix --suppress-all或针对少量规则用eslint --fix --suppress-rule rule1 --suppress-rule rule2一次性存档存量违规提交把生成的eslint-suppressions.json提交进仓库CI 与团队成员即可共享同一基线持续守护此后新代码若再违反这些规则会立刻被报告超过计数即失效存量违规被抑制但记录在案逐步清理按文件或按规则修复旧违规定期执行eslint --prune-suppressions修剪过期记录若某阶段暂不方便清理可用--pass-on-unpruned-suppressions临时放行但不建议长期使用以免抑制文件与实际违规脱节收尾当某规则的抑制条目全部清零文件里不再出现该规则后即可确认该规则在存量代码中已完全合规。关于上述 CLI 参数更完整的定义参数类型、默认值、示例可进一步查阅 Command Line Interface 文档。对于以纯函数形式调用 ESLint 的集成场景请结合 Node.js API 文档 使用applySuppressions选项并牢记其只读应用、不创建不修剪的能力边界。【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考