npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

redux-limiter

v2.0.0

Published

Throttle Redux selector re-renders to animation frame rate via a React hook

Readme

Synopsis

Throttle Redux selector re-renders to animation frame rate via a React hook.

Every Redux dispatch triggers a potential re-render. When actions arrive faster than the display can refresh (~60fps), components re-render more often than they need to. redux-limiter solves this with useThrottledSelector — a drop-in alternative to useSelector that coalesces rapid store updates into at most one re-render per animation frame.

Motivation

Boost the throughput of actions through Redux by skipping render requests that are invisible to the human eye.

Caveat

This hook is appropriate for components whose props derive entirely from Redux state. Since intermediate frames are intentionally skipped, any component with non-Redux local state that must stay in sync per-dispatch should continue using useSelector.

Installation

npm install redux-limiter

Usage

import { useThrottledSelector } from 'redux-limiter';

function Counter() {
  // Re-renders at most once per animation frame (~60fps),
  // even if the store is updated hundreds of times per second.
  const count = useThrottledSelector((state: RootState) => state.counter.count);
  return <div>{count}</div>;
}

No store wrapping required. Swap useSelector for useThrottledSelector in the components where you want throttled updates.

API

useThrottledSelector<TSelected>(
  selector: (state: any) => TSelected,
  equalityFn?: (prev: TSelected, next: TSelected) => boolean,
  maxFps?: number
): TSelected

| Parameter | Default | Description | |--------------|----------------|------------------------------------------------------------------------------------------------------| | selector | required | Selector function, same as useSelector | | equalityFn | Object.is | Controls whether a new selector result triggers a re-render | | maxFps | device refresh | Cap updates to at most this many times per second (e.g. 30 for 30fps instead of the default 60fps) |

Migrating from v1

v1 wrapped the Redux store globally:

const store = limitStore(baseStore, throttleRate);

<Provider store={store}>
  <App />
</Provider>

v2 works at the component level — no store wrapping needed:

// Before (v1 + useSelector)
const value = useSelector((state: RootState) => state.value);

// After (v2)
const value = useThrottledSelector((state: RootState) => state.value);

Benchmark

The benchmark project provides a sample application for demonstrating performance at different throttle rates.

Contributors

Jack Ofnotrade

License

MIT