版本

统计数据

虽然可以通过设置 TIMING 环境变量来执行对 ESLint 运行中整体规则性能的分析,但有时获取更细粒度的时间数据(每个文件每个规则的 lint 时间)或收集其他感兴趣的指标可能很有用。特别是,在开发新的 自定义插件 以及评估/基准测试新的语言或规则集时。对于这些用例,您可以选择从 ESLint 收集运行时统计信息。

启用统计数据收集

要启用统计信息的收集,您可以:

  1. 使用 --stats CLI 选项。这会将统计数据传递给用于输出 ESLint 结果的格式化程序。(注意:并非所有格式化程序都输出统计数据。)
  2. ESLint 构造函数上将 stats: true 作为选项设置。

启用统计数据会在每个 LintResult 对象中添加一个新的 stats 键,其中包含解析时间、修复时间、每个规则的 lint 时间等数据。

因此,它无法通过 stdout 获取,但可以通过使用 CLI 或通过 Node.js API 的格式化程序轻松获取,以满足您的特定需求。

◆ 统计数据类型

Stats 值是每次 lint 运行的时间信息。 LintResult 类型的 stats 属性包含它。它具有以下属性

  • fixPasses (number)
    ESLint 在 lint 后应用至少一次修复的次数。
  • times ({ passes: TimePass[] })
    在(解析、修复、lint)文件上花费的时间,其中 lint 指的是每个规则的时间信息。
    • TimePass ({ parse: ParseTime, rules?: Record<string, RuleTime>, fix: FixTime, total: number })
      一个包含在(解析、修复、lint)上花费的时间的对象
      • ParseTime ({ total: number })
        解析文件时花费的总时间。
      • RuleTime ({ total: number })在规则上花费的总时间。
      • FixTime ({ total: number })将修复应用于代码时花费的总时间。

CLI 使用

让我们考虑以下示例

/*eslint no-regex-spaces: "error", wrap-regex: "error"*/

function a() {
    return / foo/.test("bar");
}

使用 --stats 运行 ESLint 并通过内置的 json 格式化程序 输出到 JSON

npx eslint file-to-fix.js --fix --stats -f json

这会生成以下 stats 条目作为格式化 lint 结果对象的一部分

{
    "times": {
        "passes": [
            {
                "parse": {
                    "total": 3.975959
                },
                "rules": {
                    "no-regex-spaces": {
                        "total": 0.160792
                    },
                    "wrap-regex": {
                        "total": 0.422626
                    }
                },
                "fix": {
                    "total": 0.080208
                },
                "total": 12.765959
            },
            {
                "parse": {
                    "total": 0.623542
                },
                "rules": {
                    "no-regex-spaces": {
                        "total": 0.043084
                    },
                    "wrap-regex": {
                        "total": 0.007959
                    }
                },
                "fix": {
                    "total": 0
                },
                "total": 1.148875
            }
        ]
    },
    "fixPasses": 1
}

请注意,对于上面的简单示例,所有规则时间的总和应与 TIMING 输出的第一列直接可比。使用 TIMING=all 运行相同的命令,您可以验证这一点

$ TIMING=all npx eslint file-to-fix.js --fix --stats -f json
...
Rule            | Time (ms) | Relative
:---------------|----------:|--------:
wrap-regex      |     0.431 |    67.9%
no-regex-spaces |     0.204 |    32.1%

API 使用

您可以通过将 stats: true 作为选项传递给 ESLint 构造函数来使用 Node.js API 实现相同的功能。例如

const { ESLint } = require("eslint");

(async function main() {
    // 1. Create an instance.
    const eslint = new ESLint({ stats: true, fix: true });

    // 2. Lint files.
    const results = await eslint.lintFiles(["file-to-fix.js"]);

    // 3. Format the results.
    const formatter = await eslint.loadFormatter("json");
    const resultText = formatter.format(results);

    // 4. Output it.
    console.log(resultText);
})().catch((error) => {
    process.exitCode = 1;
    console.error(error);
});
更改语言