โก Performance tips
Depending on the device you are operating on, in-editor performance can be a concern with Sheriff.
@typescript-eslint
can be particularly taxing on the system, so, some performance considerations are in order.
Rules performance benchmarkingโ
The currently known slowest rules in Sheriff are:
@typescript-eslint/no-misused-promises
@typescript-eslint/no-unsafe-argument
@typescript-eslint/naming-convention
@typescript-eslint/no-floating-promises
import/no-unresolved
import/no-named-as-default
You can benchmark rules performance by yourself by running the following command in the terminal:
- npm
- Yarn
- pnpm
TIMING=1 npm run eslint .
TIMING=1 yarn eslint .
TIMING=1 pnpm run eslint .
Learn more in the ESLint official docs section.
Rules performance optimization strategiesโ
There are a few techniques you can leverage to improve linting time.
You can choose which technique to employ or mix-and-match them.
Disable some of the heaviest rulesโ
As simple as it sounds, you could assess which of the slowest rules you can live without and simply disable them.
Enable some of the heaviest rules only on CIโ
This approach has a little more overhead, but you could try to run the heaviest rules only on CI.
Here is an example on how you can achieve it:
- ESM
- CommonJS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
lodash: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"@typescript-eslint/no-misused-promises": process.env.CI ? 2 : 0,
},
},
]);
const { sheriff } = require("eslint-config-sheriff");
const { defineFlatConfig } = require("eslint-define-config");
const sheriffOptions = {
react: false,
next: false,
lodash: false,
playwright: false,
jest: false,
vitest: false,
};
module.exports = defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"@typescript-eslint/no-misused-promises": process.env.CI ? 2 : 0,
},
},
]);
This is a tradeoff, as this approach is a DX degradation and could lead to some developer frustration, because perfectly valid code in local environment could instead fail in CI.
Adopt ESLint cacheโ
ESLint features an internal cache where you can store your previous runs.
This technique has pretty much no downsides and you should employ it in any case, regardless of any other factor.
Read the official docs on ESLint caching here: command-line-interface#caching.
Instead, if your project lives in a monorepo, you can follow this guide.
Review glob patternsโ
ESLint, Typescript and Sheriff use minimatch syntax to handle glob patterns.
Wide glob patterns can lead to performance degradation.
Pay special attention to: