
ESLint line-comment-position 规则详解统一行注释位置规范代码可读性【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslintline-comment-position是 ESLint 内置的布局类layout规则用于强制统一行注释//的摆放位置——注释只能放在代码上方独占一行或者放在代码行末尾。本文基于本仓库的实际文档 line-comment-position.md、规则源码 lib/rules/line-comment-position.js 与测试用例 tests/lib/rules/line-comment-position.js完整讲解规则行为、全部配置项position、ignorePattern、applyDefaultIgnorePatterns及底层实现原理帮助你为团队锁定一致的注释风格。Rule Details规则行为与判定基准规则要求行注释//开头的注释位置保持一致要么在代码上方独占一行要么紧跟在代码行的末尾。块注释/* */完全不受该规则影响。// above comment var foo bar; // beside comment从源码实现看判定逻辑非常直观。规则在Program节点的访问器中运行lib/rules/line-comment-position.js核心流程如下通过sourceCode.getAllComments()取出全部注释用token.type Line过滤出所有行注释对每条行注释调用sourceCode.getTokenBefore(node, { includeComments: true })获取其前一个 token比较该 token 的结束行与注释的起始行是否相同previous.loc.end.line node.loc.start.line判断注释是否与代码处于同一行。这个是否与代码同行的判断是整个规则唯一的行为基础above模式要求注释与代码不同行独立成行、在代码上方beside模式要求注释与代码同一行位于代码末尾。源码中对应的两条报告消息为Expected comment to be above code.和Expected comment to be beside code.lib/rules/line-comment-position.js。默认情况下规则会自动忽略以特定指令词开头的注释eslint、jshint、jslint、istanbul、global、exported、jscs、falls through。这些指令类注释如// eslint-disable-line、// global MY_GLOBAL、// jshint ignore:line通常具有固定的放置习惯强制改变其位置会破坏它们的作用因此被默认豁免。源码级原理默认忽略模式是如何实现的默认忽略列表并非散落在规则代码中而是定义在共享工具模块 lib/rules/utils/ast-utils.js 中该规则直接引用const COMMENTS_IGNORE_PATTERN /^\s*(?:eslint|jshint\s|jslint\s|istanbul\s|globals?\s|exported\s|jscs)/u;注意该正则要求关键字后跟空白字符如jshint\s且globals?同时匹配global与globals。此外规则源码中还单独定义了fallThroughRegExp /^\s*falls?\s?through/ulib/rules/line-comment-position.js它比文档中列出的falls through更宽松可以匹配fall through、falls through、fallthrough等多种写法。这两个正则共同构成默认忽略逻辑。在 lib/rules/line-comment-position.js 中忽略判定顺序为先判断applyDefaultIgnorePatterns是否为true并依次测试默认正则与 fallthrough 正则再判断自定义ignorePattern是否命中。命中任意一个即跳过该注释不进行位置校验。Options完整的配置参数说明该规则接收一个参数可以是字符串或对象。字符串写法与对象中的position属性语义完全一致。对象写法支持以下属性additionalProperties: false传入未定义属性会触发 schema 校验错误见 lib/rules/line-comment-position.js。positionposition有两个取值above默认值强制行注释必须独立成行、位于代码上方beside强制行注释只能位于代码行的末尾。当参数省略、传空字符串或字符串值为above时均按above处理对象写法中position缺失时同样默认abovelib/rules/line-comment-position.js。{ position: above }的正确示例/*eslint line-comment-position: [error, { position: above }]*/ // valid comment 1 1;{ position: above }的错误示例/*eslint line-comment-position: [error, { position: above }]*/ 1 1; // invalid comment{ position: beside }的正确示例/*eslint line-comment-position: [error, { position: beside }]*/ 1 1; // valid comment{ position: beside }的错误示例/*eslint line-comment-position: [error, { position: beside }]*/ // invalid comment 1 1;ignorePattern默认忽略列表之外ignorePattern允许提供自定义正则表达式进一步豁免匹配的注释。该参数传入源码后会被构造为new RegExp(ignorePattern, u)lib/rules/line-comment-position.js在默认忽略判断之后执行。正确示例/*eslint line-comment-position: [error, { ignorePattern: pragma }]*/ 1 1; // pragma valid comment错误示例未匹配 ignorePattern且默认规则生效/*eslint line-comment-position: [error, { ignorePattern: pragma }]*/ 1 1; // invalid comment从测试用例可见ignorePattern支持正则特性例如pragma|lintertests/lib/rules/line-comment-position.js且仅在注释内容上执行测试不会影响其他注释。applyDefaultIgnorePatternsignorePattern提供后默认忽略模式依然生效。若希望关闭默认模式、仅使用自定义ignorePattern需将applyDefaultIgnorePatterns设为false。正确示例关闭默认忽略后命中自定义 pragma 的注释仍被豁免/*eslint line-comment-position: [error, { ignorePattern: pragma, applyDefaultIgnorePatterns: false }]*/ 1 1; // pragma valid comment错误示例关闭默认忽略后falls through不再被默认豁免因此报错/*eslint line-comment-position: [error, { ignorePattern: pragma, applyDefaultIgnorePatterns: false }]*/ 1 1; // falls through注意applyDefaultPatterns已被废弃请改用applyDefaultIgnorePatterns。不过源码对旧属性做了兼容处理只有当对象中没有applyDefaultIgnorePatterns键时才会回退读取applyDefaultPatterns且新属性优先lib/rules/line-comment-position.js。测试用例 tests/lib/rules/line-comment-position.js 分别验证了废弃选项仍可工作与新选项名优先两种场景。实际配置示例扁平配置文件eslint.config.jsexport default [ { rules: { line-comment-position: [error, above] } } ];要求注释全部放在代码末尾{ rules: { line-comment-position: [error, beside] } }组合使用自定义忽略与默认忽略{ rules: { line-comment-position: [error, { position: above, ignorePattern: ^TODO|^FIXME, applyDefaultIgnorePatterns: true }] } }测试用例印证边界行为一览规则测试文件 tests/lib/rules/line-comment-position.js 完整覆盖了规则的边界行为从中可以提炼出几个容易忽视的细节块注释完全不受影响/* block comments are skipped */无论在上方还是末尾均通过校验tests/lib/rules/line-comment-position.js包括/* eslint-disable */等指令注释指令注释豁免// eslint-disable-line、// eslint-disable-next-line、// global MY_GLOBAL、// exported MY_GLOBAL, ANOTHER、// istanbul ignore next、// jshint ignore:line等均在默认忽略列表中beside模式下位于上方的// jscs: disable也被豁免tests/lib/rules/line-comment-position.jsfallthrough 变体// fallthrough、// fall through、// falls through全部通过默认忽略tests/lib/rules/line-comment-position.js但// mentioning falls through关键词不在开头不豁免仍会报错tests/lib/rules/line-comment-position.js自定义正则豁免ignorePattern: linter可豁免// linter excepted commenttests/lib/rules/line-comment-position.js错误定位精确above模式下1 1; // invalid comment的报告行号为第 1 行、列为第 8 列beside模式下独立成行注释的报告列号为第 1 列便于 IDE 精准高亮。When Not To Use It如果你的项目不关心行注释位置的统一例如大量使用行尾注释解释单行逻辑、或注释风格本身就比较自由可以直接关闭该规则。同类注释风格相关的规则还可参考 lines-around-comment控制注释周围空行与 multiline-comment-style统一多行注释写法按需组合使用。弃用状态与迁移建议从规则源码的元数据lib/rules/line-comment-position.js与规则清单 docs/src/_data/rules.json 中可以确认该规则属于格式类规则在 ESLint v9.3.0 起被标记为已弃用deprecated计划于 v11.0.0 从核心中移除。ESLint 官方将格式类规则迁移至 ESLint Stylistic 项目持续维护stylistic/eslint-plugin中提供了同名规则line-comment-position作为替代。因此在使用本规则时建议注意ESLint v9.3.0 及以上版本中启用该规则会收到弃用提示但功能仍然可用不影响检查结果新项目建议直接通过stylistic/eslint-plugin中的line-comment-position规则维护注释位置风格以获得长期支持存量项目可结合 ESLint 的配置兼容机制平滑迁移迁移时只需将规则名替换为插件限定的stylistic/line-comment-position配置参数语义保持一致。Compatibility兼容性该规则的风格理念源自JSCS的validateCommentPosition规则历史上沿用了相同的above / beside位置模型。了解这一渊源有助于理解规则默认值的设计JSCS 时代注释通常默认放置在代码上方这也是本规则将above作为默认取值的原因。【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考