编写自定义ESLint规则:仅同时引入Library A和B时触发警告
解决方案
要实现这个规则,你需要在遍历AST的过程中收集当前文件的导入信息,等所有导入都遍历完成后,再判断是否同时存在两个库的导入,最后针对性地抛出警告。具体实现如下:
module.exports = { meta: { messages: { useComponent: 'Library A 已弃用,请勿与 Library B 同时导入', }, }, create(context) { // 标记当前文件是否导入了目标库 let hasLibraryA = false; let hasLibraryB = false; // 存储所有Library A的导入节点,用于后续精准抛出警告 const libraryAImports = []; return { // 遍历所有导入声明节点,收集导入信息 ImportDeclaration(node) { const importSource = node.source.value; if (importSource.includes('Library A')) { hasLibraryA = true; libraryAImports.push(node); } else if (importSource.includes('Library B')) { hasLibraryB = true; } }, // Program是文件根节点,exit钩子会在所有节点遍历完成后执行 'Program:exit'() { // 同时存在两个库的导入时,针对Library A的所有导入抛警告 if (hasLibraryA && hasLibraryB) { libraryAImports.forEach(node => { context.report({ node, messageId: 'useComponent', }); }); } }, }; }, };
关键说明:
- 避免使用
context.getText()或context.source.getText():这类方法在不同ESLint运行环境(编辑器插件、CLI等)中存在兼容性问题,直接操作文本也不如分析AST节点可靠。 - 选择
Program:exit钩子:确保所有导入节点都被遍历完成后再做判断,不会因为导入顺序导致误判(比如先遍历到Library A时,还未检测到Library B)。 - 收集Library A的节点:可以精准定位所有需要警告的导入位置,而非仅针对第一个导入节点。
内容的提问来源于stack exchange,提问作者Samantha
相关产品推荐
相关产品推荐

