You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:03:23