Codemod 与 eslint --fix
Codemod vs. eslint --fix
我想编写几个脚本来自动检测丢失的导入并根据根目录导入它们。将此脚本编写为 codemod 脚本还是作为带有修复选项的 eslint 规则更好?
Codemods 用于迁移,而 linting 永久存在 nag/warn 您的开发人员关于他们在开发过程中可能犯的一些错误。两者可以一起使用。
对于你的情况,我认为你可以采取两种方法:
编写一个检测问题的 lint 规则和一个 codemod 来修复现有的问题。 lint 规则可确保开发人员将来不会错过它。
编写检测问题的 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
非常有用,因为它具有所有需要的基础结构:
- ✅ test runner;
- ✅ 基于模板的声明式 API;
- ✅ handbook 学习;
- ✅ an editor;
在 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 编辑器 中的样子:
我想编写几个脚本来自动检测丢失的导入并根据根目录导入它们。将此脚本编写为 codemod 脚本还是作为带有修复选项的 eslint 规则更好?
Codemods 用于迁移,而 linting 永久存在 nag/warn 您的开发人员关于他们在开发过程中可能犯的一些错误。两者可以一起使用。
对于你的情况,我认为你可以采取两种方法:
编写一个检测问题的 lint 规则和一个 codemod 来修复现有的问题。 lint 规则可确保开发人员将来不会错过它。
编写检测问题的 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
非常有用,因为它具有所有需要的基础结构:
- ✅ test runner;
- ✅ 基于模板的声明式 API;
- ✅ handbook 学习;
- ✅ an editor;
在 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 编辑器 中的样子: