Codemod vs. eslint --fix

时间:2017-12-30 12:07:10

标签: eslint codemod

我想编写几个脚本来自动检测缺少的导入并根据根目录导入它们。将此脚本编写为codemod脚本或使用fix选项编写eslint规则是否更好?

2 个答案:

答案 0 :(得分:1)

Codemods用于迁移,而linting则永久地唠叨/警告开发人员他们在开发过程中可能犯的一些错误。两者都可以一起使用。

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

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

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

  3. 我倾向于接近二,因为它更具有前瞻性。您可能希望直接使用此no-unresolved ESLint rule而不是编写自己的{{3}}。在任何情况下,如果你的项目有很多目录和文件,那么fix / codemod并不是一件容易的事情,可能会受到影响。

答案 1 :(得分:0)

您可以结合这两个世界并使用 putout 代码转换器,它可以用作 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 editor中的样子:

Putout Editor