Kosha is a minimal global state management solution tailored for modern React applications. At only 420 bytes (minzipped), it provides exceptional performance and simplicity for developers focused on clean and efficient code.
-
Ultra-Lightweight
- Minzipped size: 571 bytes, ideal for performance-critical projects.
-
Optimized Re-renders
- Components only re-render when the selector output changes.
- Example:
const count = useKosha(state => state.count);
-
Partial State Updates
- Update specific parts of the state easily without spreading:
set({ count }); set(state => ({ count: state.count + 1 }));
- Update specific parts of the state easily without spreading:
-
Flexible Consumption
- Use the entire store or specific selectors as needed:
const { count, setCount } = useKosha();
- Use the entire store or specific selectors as needed:
-
Concurrent Rendering Ready
- Built on React’s
useSyncExternalStore
, ensuring compatibility with React 18+ features.
- Built on React’s
Install Kosha using your preferred package manager:
pnpm add kosha
or
npm install kosha
or
yarn add kosha
import { create } from "kosha";
const useKosha = create(set => ({
count: 0,
increment: () => set(state => ({ count: state.count + 1 })),
}));
const Counter = () => {
const { count, increment } = useKosha();
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
};
const Counter = () => {
const count = useKosha(state => state.count);
const increment = useKosha(state => state.increment);
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
};
In the latest version, the .set
method has been removed from the hook. This means useKosha.set
is no longer available by default.
To use the set
method, you must explicitly expose it within your store:
import { create } from "kosha";
const useKosha = create(set => ({
count: 0,
increment: () => set(state => ({ count: state.count + 1 })),
set, // <- Expose the set method to use it as a standard setter with full functionality
}));
This post provides a clear comparison between Kosha and Zustand, emphasizing Kosha's advantages in terms of size, performance, and flexibility. Here’s a brief recap and refinement:
-
Lighter & Faster
- Kosha’s minzipped size is only 420 bytes, making it ideal for performance-critical projects.
- Zustand is heavier, which could impact apps where every kilobyte counts.
-
Optimized Selectors
-
Kosha ensures zero unnecessary re-renders out of the box—components only re-render when the selector output changes.
Example:const count = useKosha(state => state.count);
or
const fullName = useKosha(state => state.firstName + state.lastName);
-
Zustand requires explicit optimizations and may still trigger redundant re-renders. See the Zustand docs.
-
-
Built-in Partial Updates
-
Kosha simplifies state updates with clean syntax, no need to spread the previous state manually:
set({ count }); // Update 'count' only set(state => ({ count: state.count + 1 })); // Increment 'count'
-
Zustand also supports partial updates in newer versions, but Kosha delivers this efficiency in a smaller footprint.
-
-
Flexible API
- Kosha allows consuming the entire store when needed:
const { count, setCount } = useKosha();
- Kosha allows consuming the entire store when needed:
Choose Kosha if your project prioritizes:
- Minimal bundle size.
- Performance and selector efficiency.
- Modern state management with a lean API.
For larger projects or those already using Zustand’s ecosystem, Kosha offers a streamlined alternative.
Yes! You can handle async actions with callbacks or promises directly within your store functions.
Kosha relies on React’s useSyncExternalStore
for smooth integration with React’s latest features, including concurrent rendering.
We welcome your contributions! If you encounter issues or have suggestions, please submit them on the Kosha GitHub Repository.
Kosha is licensed under the MPL-2.0 open-source license.
Check out our courses or sponsor our work.
Built with 💖 by Mayank Kumar Chaudhari