ESLint 规则 `semi-spacing` 全解:分号前后空格的强制与禁止

发布时间:2026/11/12 3:14:33

ESLint 规则 `semi-spacing` 全解:分号前后空格的强制与禁止 ESLint 规则semi-spacing全解分号前后空格的强制与禁止【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslintESLint 的semi-spacing规则docs/src/rules/semi-spacing.md专门用于统一分号;前后的空格风格避免var a b ;这类前后缀空格混乱、以及var c d;var e f;这类缺少分隔空格的写法从而提升代码的可读性与一致性。读完本文你将掌握该规则的完整配置参数before/after、默认行为、与semi、comma-spacing等相邻规则的职责划分以及其底层实现原理和可自动修复--fix能力。规则概览JavaScript 语法允许在分号前后放置多余空格例如var a b ; var c d;var e f;第一行的分号前多了一个空格第二行两个语句之间的分号后缺少空格。semi-spacing规则的目标就是在分号两侧强制执行一致的空格风格禁止表达式中的分号前出现空格并按配置约束分号后的空格。从源码 lib/rules/semi-spacing.js 的meta定义可以看出该规则属于layout排版布局类型且声明为fixable: whitespace意味着它产生的全部报告都能被 ESLint 的--fix自动修复。同时该规则未被纳入recommendedrecommended: false需要你在配置中显式开启。注意该规则已在 ESLint v8.53.0 中被标记为已废弃deprecated可用至 v11.0.0。核心团队正在将格式化类规则移出 ESLint 核心交由 ESLint Stylistic 项目stylistic/eslint-plugin中的semi-spacing规则继续维护详见源码中的 deprecated 元数据。如果项目从旧版本迁移这条规则的行为与配置方式保持不变。规则细节与检查范围规则的检查核心逻辑位于checkSemicolonSpacinglib/rules/semi-spacing.js它只对真正是分号的 token通过astUtils.isSemicolonToken判断见 lib/rules/utils/ast-utils.js进行两项判定分号前是否有空格hasLeadingSpace结合配置决定是报告多余空格还是缺失空格分号后是否有空格hasTrailingSpace同样结合配置决定报告方向。具体的报告消息messageId有四种均定义在 lib/rules/semi-spacing.jsmessageId文案触发场景unexpectedWhitespaceBeforeUnexpected whitespace before semicolon.配置禁止分号前空格却出现了空格unexpectedWhitespaceAfterUnexpected whitespace after semicolon.配置禁止分号后空格却出现了空格missingWhitespaceBeforeMissing whitespace before semicolon.配置要求分号前空格却缺失missingWhitespaceAfterMissing whitespace after semicolon.配置要求分号后空格却缺失规则不检查的三种情况原文档明确了该规则不会检查以下三种场景这些边界在源码中都有对应的守卫条件分号是行首第一个 token 时不检查分号后的空格对应源码中的isFirstTokenInCurrentLine判断lib/rules/semi-spacing.js。例如下一行的;foo();这种用于防御 ASI 问题的写法不会被干涉。分号紧跟左括号(或{时不检查分号前的空格分号紧跟右括号)或}时不检查分号后的空格。这部分间距分别由space-in-parens和block-spacing负责对应源码中的isBeforeClosingParen判断lib/rules/semi-spacing.js。例如if (true) {;}中的分号紧贴{与}semi-spacing会主动让位。空条件的 for 循环for(;;)中的分号间距不检查。测试用例for (;;) {}在默认配置下是合法的tests/lib/rules/semi-spacing.js。检查覆盖的语句类型从规则底部的return对象lib/rules/semi-spacing.js可以看出checkNode会检查所有最后一个 token 是分号的语句包括VariableDeclaration变量声明ExpressionStatement表达式语句BreakStatement/ContinueStatementbreak/continueDebuggerStatementdebuggerDoWhileStatementdo...whileReturnStatementreturnThrowStatementthrowImportDeclaration/ExportNamedDeclaration/ExportAllDeclaration/ExportDefaultDeclarationES Module 导入导出PropertyDefinition类字段ES2022见测试 tests/lib/rules/semi-spacing.js此外ForStatement有专门的处理器只检查for头部init与test之后、非末尾处的分号lib/rules/semi-spacing.js。配置选项规则接受一个对象参数包含两个布尔键选项键类型默认值含义beforebooleanfalse为true时强制分号前有空格为false时禁止分号前空格afterbooleantrue为true时强制分号后有空格为false时禁止分号后空格其中after选项只在分号不在行末时生效即分号后面同一行还有别的 token。默认配置为{before: false, after: true}即分号前禁空格、分号后要空格。在配置文件中开启该规则的完整写法{ rules: { semi-spacing: [error, { before: false, after: true }] } }如果省略选项对象等价于使用默认值{ before: false, after: true }源码中create函数的初始化逻辑正是如此lib/rules/semi-spacing.js。同时schema 定义 声明了additionalProperties: false即不接受任何未知键传入{ before: false, after: true, foo: 1 }这类配置会直接触发配置校验错误。默认选项{before: false, after: true}这是默认选项也是最贴近社区主流风格配合semi规则的语句末必须加分号的组合禁止分号前空格强制分号后空格。不正确的代码示例/*eslint semi-spacing: error*/ var foo ; var foo;var bar; throw new Error(error) ; while (a) { break ; } for (i 0 ; i 10 ; i) {} for (i 0;i 10;i) {}这些例子分别触发了分号前多余空格var foo ;、throw ... ;、break ;、for 头部和分号后缺失空格var foo;var bar;、for (i 0;i 10;i) {}。正确的代码示例/*eslint semi-spacing: error*/ var foo; var foo; var bar; throw new Error(error); while (a) { break; } for (i 0; i 10; i) {} for (;;) {} if (true) {;} ;foo();注意后三行属于前面提到的豁免场景for(;;)空条件不检查{;}中的分号紧贴括号由block-spacing负责行首的;foo();属于 ASI 防御写法分号后不强制空格。反向选项{before: true, after: false}该选项要求分号前必须有空格分号后禁止空格。这是一种比较少见的风格通常与语句不以分号收尾或semi: [error, never]搭配使用分号仅用于分割同一行的语句。不正确的代码示例/*eslint semi-spacing: [error, { before: true, after: false }]*/ var foo; var foo ; var bar; throw new Error(error); while (a) { break; } for (i 0;i 10;i) {} for (i 0; i 10; i) {}正确的代码示例/*eslint semi-spacing: [error, { before: true, after: false }]*/ var foo ; var foo ;var bar ; throw new Error(error) ; while (a) {break ;} for (i 0 ;i 10 ;i) {}对比两组例子可以直观看出before: true时var foo;变成错误、var foo ;才是正确after: false时var foo ; var bar;中的分号后空格成为错误正确的写法是var foo ;var bar ;。自动修复与源码实现原理由于规则声明了fixable: whitespace所有报告都可以通过--fix自动修复。修复逻辑直接内嵌在checkSemicolonSpacing的fix回调中lib/rules/semi-spacing.js移除分号前的多余空格fixer.removeRange([tokenBefore.range[1], token.range[0]])在分号前插入一个空格fixer.insertTextBefore(token, )移除分号后的多余空格fixer.removeRange([token.range[1], tokenAfter.range[0]])在分号后插入一个空格fixer.insertTextAfter(token, )。报告位置也有讲究分号前的问题报告区间覆盖分号前一个 token 的结尾到分号开头的空白区域分号后的问题同理lib/rules/semi-spacing.js。测试文件 tests/lib/rules/semi-spacing.js 中的大量用例同时验证了code原始代码与output修复后代码例如var a b ;→var a b;移除分号前两个空格var a b;c d;→var a b; c d;补上分号后缺失的空格for(a ; ; );→for(a;; );before: false, after: false组合下同时移除两个空格do {} while (true); foo→do {} while (true) ;foobefore: true, after: false下先补后删。这些测试还覆盖了字符串内的分号不被误判var a b ; c;合法、跨行变量声明、IIFE、正则字面量后分号、debugger、类字段等边界场景tests/lib/rules/semi-spacing.js。与相邻规则的职责划分semi-spacing只是分号处理体系中的一环原文档 frontmatter 声明的相关规则related_rules明确了各自的边界规则职责与 semi-spacing 的关系semi决定是否必须/禁止写分号搭配使用semi: [error, always]保证分号存在semi-spacing保证分号两侧空格no-extra-semi移除多余的分号分号本体重复/多余的问题归它管semi-spacing只关注空格。测试中foo; ;;;;;;;;;之所以合法正是因为多余分号由no-extra-semi清理comma-spacing控制逗号前后空格对标分号场景语义几乎一致block-spacing控制代码块花括号{ }内部空格负责{;}这类紧贴花括号的分号两侧空格space-in-parens控制圆括号( )内部空格负责(;;)这类紧贴圆括号的分号两侧空格用一句话概括semi-spacing只管分号两侧的空格凡是分号紧贴括号或处于行首/行末的边界情形都由上述相邻规则接管。历史沿革合并自no-space-before-semi从 conf/rule-type-list.json 的移除规则清单可以看到旧版规则no-space-before-semi禁止分号前空格已被移除其功能合并进semi-spacing{ removed: no-space-before-semi, replacedBy: [{ rule: { name: semi-spacing } }] }因此在配置中看到遗留的no-space-before-semi时应当迁移为semi-spacing的before: false配置。何时关闭该规则如果你不关心分号前后空格的一致性——例如团队已经统一使用格式化工具Prettier 等管理空白、或刻意使用无分号风格且不在意行内分割——可以直接关闭该规则。另外需要重申由于该规则已被标记为废弃见 lib/rules/semi-spacing.js新项目更建议直接使用 ESLint Stylistic 的semi-spacing规则其选项与行为完全一致迁移成本为零。参考资源规则文档docs/src/rules/semi-spacing.md规则实现lib/rules/semi-spacing.js单元测试含全部自动修复用例tests/lib/rules/semi-spacing.js相关规则文档docs/src/rules/semi.md、docs/src/rules/no-extra-semi.md、docs/src/rules/comma-spacing.md、docs/src/rules/block-spacing.md、docs/src/rules/space-in-parens.md移除规则对照表conf/rule-type-list.json【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/9 17:43:10

Win7内核驱动内存读写实现指南

简介:这是一份面向Windows驱动开发初学者与内核安全研究者的Win7内存读写驱动实践项目,聚焦Ring 0级物理内存直接访问能力的实现与调试,适用于系统调试、底层性能分析及驱动编程学习场景。资源包共37个文件,包含核心源码&#xff…

2026/11/11 16:41:34

Java Web网商购物网站课设:从JSP到数据库事务的完整实践指南

简介:基于Java Web的网商购物网站课程设计完整项目包,适合计算机相关专业在校生完成课程设计、毕业设计或初期项目演示,也适合新手学习Java Web开发全流程。项目已获导师认可,答辩评审95分,代码经过运行验证&#xff0…

2026/11/12 3:14:16

新疆高压电工证办理怕考不过白交培训费?良心建议在这

新疆高压电工证办理怕考不过白交培训费?良心建议在这 怕考不过白交培训费?这是很多想办理新疆高压电工证的学员最担心的事情。尤其是对新疆的高压电工证考试不了解,又担心培训机构坑人、考试难度高,结果一不小心就白花了钱。今天我就以一个在南阳劳务班组…

2026/11/12 3:14:16

澄迈考电工证怎么考良心建议:工地太忙也能一次性通过

澄迈考电工证怎么考良心建议:工地太忙也能一次性通过 工地太忙根本没时间复习考试,这事儿我懂。作为干了十年特种作业证考试培训的老手,我见过太多人因为没时间复习,要么考了三次都没过,要么干脆放弃。但其实, 考电工证没那么难…

2026/11/12 3:14:16

大专加电工证实操考试心里没底怕挂科?保姆级教程帮你稳过

大专加电工证实操考试心里没底怕挂科?保姆级教程帮你稳过 实操考试心里没底怕挂科,这几乎是每个准备考取 大专加电工证 的朋友最真实的心理写照。尤其是在高压电工、焊接与热切割、高处作业等实操性强的工种中,一点小失误都可能直接导致考试失败。如果你…

2026/11/12 3:14:16

考电工证 报名怎么考 在哪考外省证能转吗

考电工证 报名怎么考 在哪考外省证能转吗 之前考的证在外省能不能转过来?这是很多在外地打工、已经考了电工证但又想换个地方干的工友最关心的问题。尤其是像济源这样的地方,很多建筑工人都会问, 在哪考…

2026/11/12 3:09:16

中级电工证考试简单吗网上查询怎么操作

中级电工证考试简单吗网上查询怎么操作 工地太忙根本没时间复习考试,这是很多一线电工的真实写照。尤其是那些在开封市政公用工程领域奋战的电工师傅,经常是白天干活、晚上加班,连吃饭时间都得挤出来。可偏偏这个时候,单位要求你必须考中级电工证,还催着…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑