ESLint 中的 generator-star 规则:星号位置的强制统一与 v1.0.0 后的迁移路径
2026/9/11 17:38:19 网站建设 项目流程

ESLint 中的 generator-star 规则:星号位置的强制统一与 v1.0.0 后的迁移路径

【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint

generator-star 是 ESLint 早期(0.x 时代)为 ECMAScript 6 生成器函数提供的一条格式校验规则,用于强制统一生成器函数声明中*(星号)与function关键字、函数名之间的相对位置。这条规则在 ESLint v1.0.0 中已被移除,由功能更强、可配置项更细的 generator-star-spacing 规则取代。阅读本文后,你将掌握生成器函数星号书写的三种合法形态、generator-star 规则的完整选项语义(start / middle / end),以及如何平稳迁移到替代规则并在现代 ESLint 版本中继续统一生成器代码风格。

背景:生成器函数与星号的三种合法写法

生成器是 ECMAScript 6 引入的一种特殊函数类型,可以在执行过程中多次暂停并返回值。此类函数通过在function关键字后放置一个*来表示。由于 JavaScript 语法本身对*的位置相当宽容,同一个生成器函数存在三种等价但风格迥异的写法:

// 写法一:星号紧贴 function 关键字 function* generator() { yield "44"; yield "55"; } // 写法二:星号紧贴函数名 function *generator() { yield "44"; yield "55"; } // 写法三:星号两侧都有空格 function * generator() { yield "44"; yield "55"; }

以上三种写法在语法上全部合法(原文档 generator-star.md 中逐一给出了可运行示例),这也正是generator-star规则存在的意义——为了保持团队代码风格的一致性,规则强制将*固定到唯一指定的位置。

规则详情:start / middle / end 三种选项

generator-star规则的核心逻辑是:强制*要么紧贴function关键字,要么紧贴函数名,两者之间只取其一作为团队规范。规则只接受一个字符串类型的选项,用于指定星号的位置:

选项含义强制形态
"start"星号紧贴function关键字function* generator()
"middle"星号位于正中间(两侧各一空格)function * generator()
"end"星号紧贴函数名function *generator()

默认值为"end",即默认要求写成function *generator()的形式。

在配置文件中启用

该规则属于早期 ESLint 的配置风格,直接在rules中配置规则名、严重级别与选项字符串即可:

"generator-star": ["error", "start"]

"start"换成"middle""end",即可切换强制风格:

"generator-star": ["error", "middle"]
"generator-star": ["error", "end"]

三种选项对应的声明形态

选用"start"时,强制以下写法(星号紧贴function关键字):

function* generator() { }

选用"middle"时,强制星号两侧各保留一个空格:

function * generator() { }

选用"end"时,强制星号紧贴函数名:

function *generator() { }

函数表达式形态的对应约束

规则同样作用于函数表达式。使用"start"时,强制:

var generator = function* () { }

使用"middle"时,强制:

var generator = function * () { }

使用"end"时,强制:

var generator = function *() { }

值得注意的是,对于匿名函数表达式,"start""end"两种配置下有一处交集:当星号同时紧贴function关键字与左括号(即匿名且星号两侧均无空格)时,function*()对两种选项都是合法写法:

var generator = function*() { }

此外,规则明确不检查对象字面量中的生成器简写方法(如{ *generator() {} }),因为简写语法没有function关键字,不存在位置歧义。

规则历史:v1.0.0 移除与官方替换

generator-star是 ESLint 历史中的一条"短命"规则。它在 ESLintv1.0.0 中被正式移除,官方以功能覆盖更完整的 generator-star-spacing 规则作为替代。原文档 generator-star.md 顶部用醒目的提示块标注了这一事实,而仓库中多处元数据与文档均可交叉印证这条演进路径:

  • 替换映射表conf/replacements.json 中记录了"generator-star": ["generator-star-spacing"]的官方替换关系,与此并列的还有global-strict → strictno-comma-dangle → comma-dangle等一批同期调整;
  • 规则元数据docs/src/_data/rules.json 的removed列表中同样收录了generator-star,并指明其replacedBygenerator-star-spacing
  • 官方迁移指南migrating-to-1.0.0.md 的 "Removed Rules" 一节明确列出:"generator-star is replaced by generator-star-spacing",并提示升级时如仍使用已被移除的规则,ESLint v1.0.0 会发出警告并建议替换规则。

替代规则 generator-star-spacing 的能力升级

要理解迁移的价值,需要看清替代规则 generator-star-spacing 比旧规则强在哪里。它的核心实现位于 lib/rules/generator-star-spacing.js,从源码可以印证以下设计:

1. 双向空间控制,取代单一位置枚举。旧规则用"start"/"middle"/"end"描述星号整体位置;新规则拆分为"before"(星号与function关键字之间)与"after"(星号与函数名或左括号之间)两个布尔维度,并提供了四个字符串简写:"before""after""both""neither",默认值为{"before": true, "after": false}(等价于旧规则的"end"风格)。

"generator-star-spacing": ["error", {"before": true, "after": false}]

字符串简写写法:

"generator-star-spacing": ["error", "after"]

2. 按函数形态分别覆写(named / anonymous / method)。源码中modes对象将配置解析为namedanonymousmethod三类分别生效——命名函数、匿名函数、类方法或对象属性简写方法可各自独立设置风格:

"generator-star-spacing": ["error", { "before": false, "after": true, "anonymous": "neither", "method": {"before": true, "after": true} }]

在上述配置下,顶层before/after定义默认行为,anonymousmethod覆盖默认行为;覆盖值可以是{before, after}对象,也可以是简写字符串(generator-star-spacing.md 中给出了正确的代码示例)。

3. 可自动修复(fixable: "whitespace")。源码meta.fixable声明为"whitespace"fix()函数会根据期望自动插入或删除空格,--fix即可一键统一全项目生成器风格。源码中checkSpacing通过比较rightToken.range[0] - leftToken.range[1]与期望的布尔值是否一致来判定违规,并分别用missingBeforemissingAfterunexpectedBeforeunexpectedAfter四个消息 ID 上报(lib/rules/generator-star-spacing.js)。

4. 对对象简写方法不检查 before。与旧规则一致,对象字面量简写方法(无function关键字)不做 before 侧检查,源码checkFunction中对method类型且星号为函数体第一个 token 时跳过before校验。

替代规则本身也进入了新一轮生命周期:它在ESLint v8.53.0 起被标记为弃用(格式化类规则逐步移出核心包),meta.deprecated注明availableUntil: "11.0.0",推荐迁移至@stylistic/eslint-plugin中同名规则(lib/rules/generator-star-spacing.js)。

规则测试:从测试用例验证行为

仓库中 tests/lib/rules/generator-star-spacing.js 提供了 1041 行的完整RuleTester测试,可用于精确验证替代规则的各项行为。测试覆盖了默认配置、四种字符串简写、对象覆写配置,以及声明、命名表达式、匿名表达式、对象简写方法、类方法与静态方法等全部生成器形态;错误消息 ID 也被独立提取(missingBefore/missingAfter/unexpectedBefore/unexpectedAfter)逐一断言。测试采用ecmaVersion: 2018的语言选项,说明规则对 ES2018 之前的生成器语法均有稳定支持。

迁移建议与何时不需要此规则

从旧规则迁移到替代规则的实操步骤很简单:

  1. 在配置文件中将generator-star改为generator-star-spacing
  2. 做一次语义映射:"start""neither"(星号两侧均无空格)、"middle""both"(两侧各一空格)、"end""before"(星号前保留空格、后无空格);
  3. 运行eslint --fix自动统一存量代码,再人工复核差异即可。

至于是否启用此类规则,原文档 generator-star.md 给出的建议至今适用:如果项目不会使用生成器函数,就完全不需要这条规则;对使用生成器但不在意空格一致性的项目,也可以选择不启用。而在现代代码库中,更推荐直接启用generator-star-spacing(或迁移至@stylistic/eslint-plugin的维护版本),以获取更细粒度的风格控制与自动修复能力。

【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询