在一个 ESLint 规则中有多个选择器(selectors),每个选择器都会使用 context.report 报告问题,并且这些报告都包含修复(fix)操作。然而,你会发现这些修复操作会立即执行,而不是在所有选择器执行完毕后统一执行所有的修复。
在这种情况下,问题的原因在于 ESLint 的修复机制是即时执行的。当一个选择器报告一个包含修复操作的问题时,ESLint 会立即应用这个修复。
为了更好地控制修复操作,你可以尝试以下几种方法:
-
合并修复:如果修复操作之间存在依赖关系或需要按特定顺序执行,可以在最后一个选择器中统一进行修复操作,而不是在每个选择器中立即执行修复。
-
收集修复操作:在规则的创建函数中维护一个修复操作的队列,所有选择器将修复操作推入队列中,最后在一个特殊选择器或生命周期钩子(如
Program:exit)中统一执行修复。
下面是一个示例,演示如何在规则中收集修复操作并统一执行:
module.exports = {
meta: {
type: "problem",
docs: {
description: "example rule that demonstrates deferred fixing",
category: "Best Practices",
recommended: false
},
fixable: "code", // or "whitespace"
schema: [] // no options
},
create: function(context) {
let fixes = [];
return {
Identifier(node) {
if (node.name === "foo") {
// Collect the fix action
fixes.push({
node,
fix: function(fixer) {
return fixer.replaceText(node, "bar");
}
});
}
},
Literal(node) {
if (node.value === "foo") {
// Collect the fix action
fixes.push({
node,
fix: function(fixer) {
return fixer.replaceText(node, '"bar"');
}
});
}
},
"Program:exit"() {
// Apply all collected fixes
for (let { node, fix } of fixes) {
context.report({
node,
message: "Deferred fix",
fix
});
}
}
};
}
};
在这个示例中,Identifier 和 Literal 选择器会收集修复操作到 fixes 数组中,最终在 Program:exit 钩子中统一报告并执行这些修复操作。这样可以确保所有选择器都执行完毕后再统一执行修复操作。
这种方式有助于避免修复操作立即执行,确保所有问题都收集到并按预期顺序处理。
浙公网安备 33010602011771号