This is a plugin for Biome, the JavaScript and TypeScript linter, that identifies bad uses of the useEffect hook in React.
This plugin is heavily inspired and the code in it draws on rules in @NickvanDyke's eslint-plugin-react-you-might-not-need-an-effect package, which provides a similar functionality for ESLint.
Warning
This plugin is currently a work in progress. While it has been tested to work with the rudimentary examples found in the tests directory, you may find false positives. Please open a GitHub issue if you encounter one.
You can add this plugin to your project using your preferred package manager:
npm install --save-dev @jacobwolf/biome-unnecessary-effect
# or
pnpm add -D @jacobwolf/biome-unnecessary-effect
# or
bun add -D biome-unnecessary-effect
# or
yarn add -D biome-unnecessary-effectTo use this plugin, you must have Biome 2.0+ installed. You can do so and configure Biome according to their documentation. Plugins are not supported in Biome versions prior to 2.0.
After installation, the plugin will automatically configure your biome.json file, adding the respective plugin rule. No manual setup is required!
Then, you can run Biome:
npx biome lint --write
# or
bunx biome lint --writeThis plugin currently includes the following rules:
-
avoidEmptyEffect: Identifies and flags empty
useEffectoruseLayoutEffecthooks. -
avoidInitializingState: Flags
useEffectoruseLayoutEffecthooks that are used solely for initializing state. This should ideally be done directly withuseState. -
avoidDerivedOrChainedState: Warns against storing derived state or chaining state updates within
useEffectoruseLayoutEffect. Consider computing derived values during render or combining state updates into a single event handler. -
avoidDataFetchingInEffect: Warns against directly fetching data inside
useEffectoruseLayoutEffect. Recommends using data fetching libraries like React Query (TanStack Query) or SWR for better handling of loading, caching, and errors. -
avoidParentChildCoupling: Warns against coupling parent behavior or state to a child component via
useEffectoruseLayoutEffect. Suggests lifting shared logic or state up to the parent component. -
avoidEventHandler: Flags
useEffectoruseLayoutEffecthooks that behave like event handlers. Instead, the event handler should be called directly.
Contributions are welcome! Please feel free to open issues or submit pull requests.
This project is licensed under the Beerware License. See the LICENSE file for details.