Codemod 与 eslint --fix

Codemod vs. eslint --fix

我想编写几个脚本来自动检测丢失的导入并根据根目录导入它们。将此脚本编写为 codemod 脚本还是作为带有修复选项的 eslint 规则更好?

Codemods 用于迁移,而 linting 永久存在 nag/warn 您的开发人员关于他们在开发过程中可能犯的一些错误。两者可以一起使用。

对于你的情况,我认为你可以采取两种方法:

  1. 编写一个检测问题的 lint 规则和一个 codemod 来修复现有的问题。 lint 规则可确保开发人员将来不会错过它。

  2. 编写检测问题的 lint 规则以及 --fix 选项以自动修复问题。

我倾向于方法二,因为它更适合未来。您可能只想直接使用此 no-unresolved ESLint rule 而不是自己编写。在任何情况下,fix/codemod 都不是微不足道的,如果您的项目有很多目录和文件,它可能会影响性能。

您可以结合两个世界并使用 Putout code transformer I’m working on for a couple years. It can be used as a plugin for ESLint 并且对于编写 codemods 非常有用,因为它具有所有需要的基础结构:

scopes 的帮助下,您可以轻松检测您使用的变量是否已声明。

这里是一个 plugin 的例子,它可以满足你的需要:@putout/plugin-declare-undefined-variables 它是这样工作的:

import {template} from 'putout';

export const match = () => ({
    'await readFile(__a, __b)': (vars, path) => {
        return !path.scope.bindings.readFile;
    }
});

export const replace = () => ({
    'await readFile(__a, __b)': (vars, path) => {
        const programScope = path.scope.getProgramParent();
        const importNode = template.ast('import {readFile} from "fs/promises"');
        programScope.path.node.body.unshift(importNode);
        return path;
    }
});

这是 Putout 编辑器 中的样子: