Optimizing Image Loading for Better Web Performance

Sami Salih İbrahimbaş
5 min readDec 19, 2023

--

Harnessing the Power of Lazy Loading in Real-world Projects

Images play a pivotal role in modern web design, enhancing visual appeal and conveying information effectively. However, they can also be a significant performance bottleneck if not managed efficiently. When a user visits a web page, the browser initiates the download of all images, regardless of whether they are immediately visible. This approach not only prolongs the page load time but also consumes unnecessary bandwidth.

Article Cover

The Power of Lazy Loading

Lazy loading is an ingenious technique that defers the loading of images until they enter the viewport, thereby conserving resources and enhancing performance. By leveraging the Intersection Observer API, lazy loading intelligently detects when an image becomes visible, triggering its download precisely when needed.

Technical talk aside, we are the ones who will do this.

Benefits of Lazy Loading

Implementing lazy loading offers a plethora of advantages:

  • Improved Performance: By deferring image loading, lazy loading significantly accelerates the initial page load time.
  • Reduced Bandwidth Consumption: By loading only the visible images, lazy loading conserves bandwidth, particularly beneficial for users on limited data plans.
  • Enhanced User Experience: Faster loading times and improved responsiveness culminate in a superior user experience, fostering user engagement and satisfaction.

React Example: Lazy Loading Images

Lazy loading is a technique used to enhance the performance of web pages. When a page loads, the browser is required to download all images visible to the user. However, this process extends the page loading time and increases data consumption for the user. Lazy loading addresses this issue by loading images only when they enter the user’s viewport.

Implementing Lazy Loading with the Optimized Image Component

In this example, we utilize a React component named OptimizedImage. This component ensures that images are loaded only when they come into the user's view.

import React, { useEffect, useState, useRef } from 'react';

type Props = {
src: string;
alt: string;
title?: string;
};

const OptimizedImage: React.FC<Props> = ({ src, alt, title }) => {
const [isInView, setIsInView] = useState(false);
const imgRef = useRef<HTMLPictureElement>(null);
const [loading, setLoading] = useState(true);

useEffect(() => {
const observer = new IntersectionObserver(
(entries) => {
const [entry] = entries;
if (entry.isIntersecting) {
setIsInView(true);
observer.disconnect();
}
},
{ threshold: 0.01 } // Initiates loading if 1% of the image is visible.
);

const currentRef = imgRef.current;
if (currentRef) {
observer.observe(currentRef);
}

return () => {
if (currentRef) {
observer.disconnect();
}
};
}, [src]);

const onImageLoad = () => {
setLoading(false);
};

return (
<picture ref={imgRef}>
{loading && <span>Loading...</span>}
{isInView && (
<>
<source srcSet={src} type='image/webp' />
<img src={src} alt={alt} title={title} onLoad={onImageLoad} />
</>
)}
</picture>
);
};

export default OptimizedImage;

In this implementation, we use the IntersectionObserver API to ensure that the image is loaded only when it enters the user's viewport. The threshold value specifies the portion of the image that must be visible for the loading to be initiated. Here, a value of 0.01 ensures that the image starts loading when only 1% of it is visible.

This approach enhances the performance of the web page, reduces data consumption for the user, and provides feedback on the loading status of the image through the OptimizedImage component.

Preloading Critical Images

For pivotal images that are crucial for the initial user experience, preloading is a viable strategy. By prefetching these images in the <head> section of your HTML document, you can ensure they are readily available when needed, without affecting the overall page load time.

<head>
<!-- ... -->
<link rel="preload" href="/path/to/critical-image.jpg" as="image">
</head>

By employing lazy loading for non-critical images and prefetching vital assets, you strike a balance between performance optimization and user experience.

We often apply this approach to product detail pages or search background images that take up the entire screen.

Experience with the Approach: A Real-world Application

The Lazy Loading technique, as illustrated through the PerfectImage component, isn't just a theoretical concept; it has been successfully applied in real-world projects. One such project where this approach was implemented is the UI Kit developed for Turistikrota.

PerfectImage Component

In the UI Kit, I’ve developed a component called PerfectImage, which embodies the principles of lazy loading. This component ensures that images are only loaded into the viewport, optimizing the performance of the web application. If you're curious to see the implementation, you can check out the code on GitHub.

Carousel Component

Another noteworthy component within the UI Kit is the Carousel. Just like the PerfectImage component, the Carousel also leverages efficient techniques to ensure smooth performance and user experience. The Carousel component's code is available for exploration on GitHub.

The UI Kit: A Comprehensive Solution

The UI Kit from Turistikrota is a testament to the power of well-designed components and efficient techniques. By integrating components like PerfectImage and Carousel, the UI Kit offers developers a robust toolkit to build high-performance web applications with ease. For those interested in diving deeper into the UI Kit's offerings, the entire repository can be accessed on GitHub.

Experience it Live

For a hands-on experience and to witness the components in action, you can explore the live examples at Turistikrota Places. These real-world implementations serve as a testament to the effectiveness and efficiency of the Lazy Loading technique and the components developed around it.

In conclusion, the Lazy Loading technique, when implemented thoughtfully, can significantly enhance web application performance and user experience. Its successful application in the Turistikrota UI Kit underscores its value and sets a precedent for future projects aiming to achieve optimal performance.

Conclusion

Lazy loading stands as a beacon of performance optimization in the realm of web development. By selectively loading images based on their visibility, you can substantially enhance page load times, reduce bandwidth consumption, and elevate the overall user experience. Complemented by additional strategies such as image format optimization and CDN utilization, lazy loading forms an integral part of a holistic approach to web performance optimization. Embrace the power of lazy loading and unlock a faster, more efficient web experience for your users.

--

--