拓冰建站拓冰建站
首页 / 资讯中心 / 正文

深入解析 ESLint `space-before-keywords` 规则:关键字前置空格的强制规范与 `keyword-spacing` 演进之路

深入解析 ESLintspace-before-keywords规则关键字前置空格的强制规范与keyword-spacing演进之路【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint关键字keyword是 JavaScript 语法结构中的保留标识符例如function、if、return等。它们在语言中具有特殊含义其前后空格的使用方式往往是团队代码风格规范的重要一环。本文基于 ESLint 仓库中的space-before-keywords规则文档完整还原该规则的设计理念、参数选项与正反示例并结合仓库源码剖析其接替者keyword-spacing的底层实现原理。读完本文你将掌握关键字前置空格的两种风格always/never如何配置理解该规则为何在 ESLint v2.0.0 被移除、如何平滑迁移到keyword-spacing以及新规则在源码层面如何完成检查与自动修复。规则背景为什么需要规范关键字前的空格关键字是 JavaScript 语法元素的组成部分如function和if。这些标识符对语言具有特殊含义因此代码编辑器中通常会以不同的颜色显示它们。作为语言的重要组成部分各类风格指南常常对关键字周围的空格做出约定。例如你可能有一个风格指南要求关键字必须始终被空格前置那么if-else语句必须写成这样if (foo) { // ... } else { // ... }当然也可能存在相反的风格指南——禁止在关键字前出现空格。space-before-keywords规则正是为了在团队中统一关键字前是否留空格这一细节而设计的。该规则属于布局类layout规则并且支持自动修复原文档明确指出通过命令行的--fix选项可以自动修复该规则报告的问题fixable。重要提示该规则已在 ESLint v2.0.0 中被移除由 keyword-spacing 规则取代。仓库的版本数据文件 rule_versions.json 中记录着这条规则的生命周期其首次出现于 1.4.0space-before-keywords: 1.4.0在 2.0.0-beta.3space-before-keywords: 2.0.0-beta.3之后正式退役。规则详情覆盖的关键字与两种风格选项该规则将强制以下关键字之前的空格一致性条件与循环if、else、for、while、do、switch异常处理throw、try、catch、finally流程控制with、break、continue、return声明function、yield、class以及变量声明let、const、var标签语句label statements参数选项该规则接收一个参数always或never选项行为默认值always关键字前必须至少有一个空格✅ 默认值never关键字else、whiledo...while 场景、finally和catch前不允许有空格—值得注意的是当选项为always时该规则允许关键字前面出现左花括号{即}else {会被要求修正但{后的换行与空格不在此规则管辖范围。如果你希望调整这一行为可以考虑使用 block-spacing 规则。代码示例always选项下的正反例默认always选项下的错误代码/*eslint space-before-keywords: [error, always]*/ if (foo) { // ... }else {} // else 前缺少空格 const foo bar;let baz qux; // let 前缺少空格 var qux function bar () {} // function 前缺少空格 function bar() { if (foo) {return; } // return 前缺少空格 }默认always选项下的正确代码/*eslint space-before-keywords: [error, always]*/ if (foo) { // ... } else {} // else 前有空格 (function() {})(); // function 前是 ( ) 等起始符号不受限制 Foo onClick{function bar() {}} / // JSX 属性中的 function 表达式 for (let foo of [bar, baz, qux]) {} // for/of 前均有空格从上面的 JSX 示例可以看出该规则同样作用于 JSX 语法上下文中的关键字示例中开启了parserOptions.ecmaFeatures.jsx。代码示例never选项下的正反例never选项下的错误代码/*eslint space-before-keywords: [error, never]*/ if (foo) { // ... } else {} // else 前不应有空格 do { } while (foo) // do...while 的 while 前不应有空格 try {} finally {} // finally 前不应有空格 try {} catch(e) {} // catch 前不应有空格never选项下的正确代码/*eslint space-before-keywords: [error, never]*/ if (foo) { // ... }else {} // else 前无空格 do {}while (foo) // do...while 的 while 前无空格 try {}finally {} // finally 前无空格 try{}catch(e) {} // catch 前无空格何时不使用该规则如果你不希望强制执行关键字空格的一致性则可以完全关闭此规则不启用space-before-keywords。规则的演进v2.0.0 移除与keyword-spacing接替space-before-keywords之所以被移除是因为 ESLint 团队在 v2.0.0 推出了能力更全面的keyword-spacing规则——后者不仅能控制关键字之前before的空格还能控制关键字之后after的空格并且支持对每个关键字单独定制overrides。仓库中的 replacements.json 明确记录了这一替代关系space-before-keywords: [keyword-spacing]同时迁移指南 migrating-to-2.0.0.md 也写明了对应说明space-before-keywordsis replaced bykeyword-spacing.因此如果你从旧版本升级到 ESLint 2.0.0 或更高版本只需将配置中的规则名替换为keyword-spacing并按下文所述方式设置before选项即可保持原有的检查行为。源码剖析keyword-spacing如何实现关键字前空格检查替代规则 keyword-spacing.js 的实现位于仓库lib/rules/目录其meta声明为type: layout布局类与fixable: whitespace可自动修复空白。其配置 Schema 如下源码 lib/rules/keyword-spacing.js 第 112–136 行schema: [ { type: object, properties: { before: { type: boolean, default: true }, after: { type: boolean, default: true }, overrides: { type: object, properties: KEYS.reduce((retv, key) { retv[key] { type: object, properties: { before: { type: boolean }, after: { type: boolean }, }, additionalProperties: false, }; return retv; }, {}), additionalProperties: false, }, }, additionalProperties: false, }, ],该 Schema 揭示了三层能力before默认true控制关键字前是否需要空格等价于旧的space-before-keywords的alwaystrue与neverfalseafter默认true控制关键字后是否需要空格这是旧规则不具备的能力overrides以关键字名为键可针对单个关键字单独覆盖before/after行为实现细粒度的特例控制。在检查逻辑中规则维护了两组正则源码第 20–23 行const PREV_TOKEN /^[)\]}]$/u; const NEXT_TOKEN /^(?:[([{~!]|\\?|--?)$/u; const PREV_TOKEN_M /^[)\]}*]$/u; const NEXT_TOKEN_M /^[{*]$/u;这些模式用于判断关键字前/后的相邻 token 是什么。当关键字前一个 token 匹配PREV_TOKEN如}、)、]、时才触发期望空格expectSpaceBefore或禁止空格unexpectSpaceBefore的判断。修复逻辑的底层实现expectSpaceBefore源码第 156–177 行通过sourceCode.getTokenBefore(token)获取关键字的前一个 token在满足前一个 token 类型或值匹配模式、与关键字处于同一行、且两者之间没有空格时报告错误并调用修复器fix(fixer) { return fixer.insertTextBefore(token, ); }即在关键字前插入一个空格。与之对应的unexpectSpaceBefore源码第 185–209 行则在两个 token 之间存在空格时报告错误并移除两者之间的空白区域fix(fixer) { return fixer.removeRange([ prevToken.range[1], token.range[0], ]); }这种先取前一个 token、再判断行内空格的机制保证了规则只在同一行内检查空格不会误伤跨行代码例如else换行到下一行的写法。规则在create阶段会根据options.before ! false决定对每个关键字挂载expectSpaceBefore还是unexpectSpaceBefore源码第 280–300 行并支持overrides中的逐关键字覆盖这正是迁移自space-before-keywords后最直接的对应关系。测试用例印证在测试文件 tests/lib/rules/keyword-spacing.js 中可以看到对before: false的验证等价于旧的never选项options: [{ before: false }],以及通过overrides对单个关键字做特判的用例例如对else、if单独设置before: false、as设置before: true等测试第 982–987 行、1234–1248 行、2395 行、4904 行。这些用例直接覆盖了从全局统一到逐关键字定制的全部配置形态。迁移对照从space-before-keywords到keyword-spacing综合原规则文档与keyword-spacing的源码 Schema两者的配置映射关系如下旧规则配置新规则等价配置说明[error, always][error, { before: true }]关键字前必须有空格before默认即为true[error, never][error, { before: false }]关键字前禁止空格无法实现[error, { before: true, after: true }]同时控制关键字后的空格无法实现[error, { before: true, overrides: { else: { before: false } } }]仅对else特例禁止前置空格迁移时的关键提醒原space-before-keywords的never只作用于else、whiledo...while、finally和catch四个关键字而keyword-spacing的before: false会影响其关键字列表中的全部关键字源码中KEYS由keywords模块导出并额外包含as、async、await、from、get、let、of、set、yield等见 keyword-spacing.js 第 28–38 行。因此如果旧配置使用never迁移到新规则后若不想改变对if、for等关键字的行为需要借助overrides精确指定哪些关键字前置空格被禁用例如{ rules: { keyword-spacing: [error, { before: true, overrides: { else: { before: false }, catch: { before: false }, finally: { before: false } } }] } }补充keyword-spacing的后续命运与格式化规则迁移需要留意的是keyword-spacing规则本身在 ESLint 8.53.0 也被标记为弃用。仓库源码 keyword-spacing.js 第 80–101 行的meta.deprecated字段记录了这一事实该规则属于格式化类规则ESLint 团队正逐步将格式化规则移出核心keyword-spacing计划在 11.0.0 之后从核心中移除其维护职责已移交至 ESLint Stylistic 项目stylistic/eslint-plugin中的keyword-spacing规则。这意味着新项目若需要关键字空格检查建议直接使用 ESLint Stylistic 提供的对应规则而历史项目在升级时则需关注这一迁移路径。总结space-before-keywords虽然已在 ESLint v2.0.0 退役但它所承载的关键字前空格一致性这一风格诉求至今仍是格式化检查的重要一环。通过本文你不仅完整掌握了该规则的两个选项always/never及其全部正反示例还深入理解了其接替者keyword-spacing在 lib/rules/keyword-spacing.js 中的 Schema 设计、token 相邻判断机制与自动修复实现以及从旧规则到新规则的精确迁移对照。当你需要在团队中统一关键字空格风格时无论是直接启用现代规则还是阅读历史代码中的旧配置都可以借助本文快速定位到正确的配置形态。【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门