版本

统计数据

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

启用统计数据收集

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

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

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

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

◆ 统计数据类型

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

  • fixPassesnumber
    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);
});
更改语言