A lightweight React library for optimizing image loading through preloading, lazy loading, and caching capabilities.
- 🚀 Image Preloading: Load images in advance for instant display
- 🎯 Lazy Loading: Load images only when they enter the viewport
- 💾 Image Caching: Cache images for faster subsequent loads
- 📊 Status Tracking: Monitor image loading states
- 🎨 TypeScript Support: Full TypeScript support with type definitions
- 🪶 Lightweight: No external dependencies except React
npm install react-img-toolkit
import { ImagePreloader } from 'react-img-toolkit';
function Gallery() {
const data = {
images: [
'https://example.com/image1.jpg',
'https://example.com/image2.jpg',
],
otherData: 'Hello World!',
};
return (
<ImagePreloader
data={data}
onSuccess={() => console.log('All images loaded!')}
onError={(error) => console.error('Failed to load:', error)}
>
{/* Your gallery content */}
</ImagePreloader>
);
}
Preload multiple images and track their loading status:
import { useImagePreloader } from 'react-img-toolkit';
function Gallery() {
const { imageUrls, count } = useImagePreloader([
'https://example.com/image1.jpg',
'https://example.com/image2.jpg'
]);
return (
<div>
<p>Loaded {count} images</p>
{imageUrls.map((url, index) => (
<img key={index} src={url} alt={`Image ${index + 1}`} />
))}
</div>
);
}
Load images only when they enter the viewport:
import { useLazyImage } from 'react-img-toolkit';
function LazyImage() {
const { ref, isIntersecting, isLoaded } = useLazyImage(
'https://example.com/large-image.jpg',
{
threshold: 0.1,
rootMargin: '50px'
}
);
return (
<div ref={ref}>
{isLoaded && (
<img src="https://example.com/large-image.jpg" alt="Lazy loaded" />
)}
</div>
);
}
Cache images for faster subsequent loads:
import { useImageCache } from 'react-img-toolkit';
function CachedImage() {
const { cachedSrc, loading, isCached } = useImageCache(
'https://example.com/image.jpg'
);
if (loading) return <div>Loading...</div>;
return <img src={cachedSrc} alt="Cached image" />;
}
Track the loading status of an image:
import { useImageStatus } from 'react-img-toolkit';
function ImageWithStatus() {
const status = useImageStatus('https://example.com/image.jpg');
return (
<div>
<p>Status: {status}</p>
{status === 'loaded' && (
<img src="https://example.com/image.jpg" alt="Status tracked" />
)}
</div>
);
}
Prop | Type | Description |
---|---|---|
data | any | Any structured data. |
onSuccess | () => void | Callback when all images are loaded |
onError | (error: Error) => void | Callback when an error occurs |
children | ReactNode | Content to render |
function useImagePreloader(
urls: string[],
options?: {
onSuccess?: () => void;
onError?: (error: Error) => void;
}
): {
imageUrls: string[];
count: number;
};
function useLazyImage(
src: string,
options?: {
threshold?: number;
rootMargin?: string;
}
): {
ref: RefObject<HTMLElement>;
isIntersecting: boolean;
isLoaded: boolean;
};
function useImageCache(
src: string
): {
cachedSrc: string | null;
loading: boolean;
isCached: boolean;
};
function useImageStatus(
src: string
): 'idle' | 'loading' | 'loaded' | 'error';
- Clone the repository:
git clone https://github.com/IxtiyorDeveloper/react-img-toolkit.git cd react-img-toolkit
- Install dependencies:
npm install
- Start development server:
npm run dev
- Run tests:
npm test
Contributions are welcome! Please feel free to submit a Pull Request.
MIT