【问题标题】:Is there a way to programmatically suppress all ESLint errors on a line by line basis?有没有办法以编程方式逐行抑制所有 ESLint 错误?
【发布时间】:2020-06-23 00:34:00
【问题描述】:

如果我在现有代码库中添加任何给定的 ESLint 规则,例如 no-param-reassign,我可能会遇到很多违规行为。

是否有一种以编程方式逐行添加对所有现有违规行为的碱基抑制的好方法?

在示例情况下:

// eslint-diable-next-line no-param-reassign
param = foo;

澄清

确实想要在我的项目中使用规则,保护我们编写的所有新代码。我想手动修复所有发出违规行为的旧代码(我想要一个脚本来为我做这件事,或者如果可能的话 eslint 自己)。这就是为什么我想压制所有现有的违规行为,但尊重所有新的违规行为。我的主要目标是尽可能快地遵守新规则,以便从所有新代码中获得价值。我不介意旧的挥之不去的压制违规行为。

【问题讨论】:

标签: javascript eslint


【解决方案1】:

您可以通过修改 .eslintrc.* 文件或 package.json 文件中的 eslintConfig 字段来删除项目中不需要的特定规则。因为他们负责您项目中的规则。如果您从中删除任何规则,您的编辑将停止查找该违规行为。

如果您仍然希望这些规则用于未来的开发,请不要修改您的规则配置文件,您可以做两件事,

  1. 抑制违反规则的旧代码。

  2. 修复它们。 (推荐)

【讨论】:

  • 感谢您的回答!我确实想要我的项目中的规则,保护我们编写的所有新代码。我不想修复所有发出违规行为的旧代码。这就是为什么我想压制所有现有的违规行为,但尊重所有新的违规行为。我将编辑我的问题以澄清
  • 如果您希望这些规则用于未来的开发,那么您可以做两件事 1. 抑制违反规则的旧代码。 2. 修复它们。 (推荐)
  • 是的,我可以自己压制它们,但我的问题的要点是:我可以避免这种情况而没有太多麻烦吗?我的主要目标是遵守新规则以从中获得价值。我不介意挥之不去的压制违规行为
【解决方案2】:

为了完成你想要的,你应该为那些你希望 ESLint 完全忽略的旧文件禁用 eslint。将此添加到旧文件的顶部:

/* eslint-disable */

这里有更多方法来完成不同的禁用:

【讨论】:

  • 感谢您的回复!我不想在任何不必要的范围内禁用 eslint。我想在任何文件和任何行中捕获任何类型的新违规行为。此外,我想避免手动进行任何抑制。我应该是一个脚本可以做的事情。老实说,感觉就像 eslint 应该提供的!但我不认为是这样;(我澄清了我的问题以更好地解释问题。
【解决方案3】:

对于单行:

// eslint-disable-next-line

对于一个块

/* eslint-disable */
// liniting issues here
/* eslint-enable */

如果没有eslint-disable,将对文件的其余部分禁用 linting

【讨论】:

    【解决方案4】:

    如果您不想逐个文件添加这些指令,您可以使用ESLint overrides 功能。在.eslintrc:

    {
      /*
        Main set of properties here
        ...
      */
      overrides: [
        {
          files: [
            /*
              List of glob patterns matching files that should have
              some rules overwritten
            */
          ],
          rules: [
            /* 
              Add the common rules here, otherwise they'll be overwritten.
              After that, add the ones you want to disable:
            */
            no-param-reassign: 0,
          ]
        },
      ],
    }
    

    否则,如果你想在一行中禁用规则,你只需要这样做:

    // eslint-disable-nex-line <rule name>
    

    最后,如果你想在多行代码中禁用一个规则,你可以使用:

    // eslint-disable <rule name>
    
    // Code on which the rule shouldn't be applied
    // ...
    
    // eslint-enable <rule name>
    

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,一堆react-hooks/exhaustive-deps lint 警告最终使用了json formatter 和一个插入 eslint 禁用注释的脚本。我运行yarn lint . -f json -o warnings.json 来获取 lints 的 json 列表,然后是这个

      const json = require('./warnings.json');
      const fs = require('fs');
      
      json.forEach(({ filePath, messages, source }) => {
        // if there is no source we have nothing that needs to be eslint-ignore'd
        if (!source) {
          return;
        }
      
        const data = source.split('\n');
      
        // if the source has multiple lines which need to be eslint-ignored our offset changes per addition
        // offset is 1 because line numbers start at 1 but index numbers in an array start at 0
        let offset = 1;
      
        // group errors/warnings by line because we want to have one eslint disable comment with all the rules to disable
        const groupedMessages = messages.reduce((acc, next) => {
          const prevMessages = acc[next.line] ? acc[next.line] : [];
          // some lines may have the same rule twice
          const duplicateRuleForLine = prevMessages.find(message => message.ruleId === next.ruleId);
          // ignore jsx and graphql lint rules
          const applicableRule = next.ruleId && !next.ruleId.includes('jsx') && !next.ruleId.includes('graphql');
      
          // ignore the eslint-ignore addition for duplicates and non applicable rules
          if (duplicateRuleForLine || !applicableRule) {
            return acc;
          }
      
          return {
            ...acc,
            [next.line]: [...prevMessages, next],
          };
        }, {});
      
        Object.entries(groupedMessages).forEach(([line, messages]) => {
          // grouped ignores
          const ignore = `// eslint-disable-next-line ${messages.map(({ ruleId }) => ruleId).join(' ')}`;
          data.splice(line - offset, 0, ignore);
          offset--;
        });
      
        const updated = data.join('\n');
      
        fs.writeFile(filePath, updated, function(err) {
          if (err) return console.log(err);
        });
      });
      

      对我来说效果很好,虽然我希望我插入的这些 cmets 是自动格式化的。

      【讨论】:

      • 如果您将prettiereslint 结合使用,您可以在此脚本之后运行另一个yarn lint --fix 来格式化它们。谢谢你。
      【解决方案6】:

      我通常使用这个: https://github.com/amanda-mitchell/suppress-eslint-errors

      为你的 repo 配置 jscodemod 有点困难,但是一旦你开始工作就值得了。有很多强大的代码模块。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 2016-07-31
        • 2013-04-02
        相关资源
        最近更新 更多