统计数据
虽然可以通过设置 TIMING 环境变量来执行对 ESLint 运行中整体规则性能的分析,但有时获取更细粒度的时间数据(每个文件每个规则的 lint 时间)或收集其他感兴趣的指标可能很有用。特别是,在开发新的 自定义插件 以及评估/基准测试新的语言或规则集时。对于这些用例,您可以选择从 ESLint 收集运行时统计信息。
启用统计数据收集
要启用统计信息的收集,您可以:
- 使用
--stats
CLI 选项。这会将统计数据传递给用于输出 ESLint 结果的格式化程序。(注意:并非所有格式化程序都输出统计数据。) - 在
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);
});