홈페이지에서 가장 많은 로딩 시간을 차지하는 요소는 이미지입니다. 이미지 최적화는 페이지 로딩을 단축시켜 웹 성능을 향상시키고, 사용자 경험을 개선할 수 있습니다.
라이트하우스를 사용하여 사이트를 검사하면 이미지 최적화 방법을 제안해준다…
그럼 라이트 하우스에서 알려준 방법대로 하나씩 최적화를 적용해보자.
특정 이미지를 미리 로드하면 최대 콘텐츠가 포함된 페인트 시간을 줄일 수 있습니다.
HTML <link>
태그를 사용하여 중요한 이미지를 미리 로드할 수 있습니다.
<link rel="preload" href="/path/to/image.jpg" as="image">
browser-image-compression
는 브라우저에서 이미지 파일을 압축하고 변환할 수 있는 라이브러리입니다. 해당 라이브러리를 사용해서 이미지 크기를 줄이고 WebP 형식으로 변환해 봅시다.
WebP는 구글에서 개발한 이미지 파일 포맷으로, 동일한 이미지 품질이라도 WebP 파일의 크기가 다른 포맷(GIF, JPG, PNG)의 파일에 비해 훨씬 작기 때문에 이미지 로딩 속도를 크게 단축시킬 수 있습니다.
설치
npm install browser-image-compression
export const uploadProductImage = async (file: File): Promise<string> => {
// 이미지 압축 및 리사이징 옵션
const options = {
maxSizeMB: 1, // 최대 파일 크기 (MB)
maxWidthOrHeight: 300, // 최대 너비 또는 높이 (px)
useWebWorker: true, // 웹 워커 사용 여부
fileType: 'image/webp' // 변환할 파일 형식
};
// 이미지 압축 및 리사이징
const compressedFile = await imageCompression(file, options);
// 새로운 파일 이름 생성
const newFileName = `${uuid()}-${file.name.split('.')[0]}.webp`;
const storageRef = ref(storage, `products/${newFileName}`);
// Firebase Storage에 업로드
await uploadBytes(storageRef, compressedFile);
return getDownloadURL(storageRef);
};
옵션을 설정한 후 imageCompression
함수를 사용하여 이미지 형식을 변환하고 이미지 사이즈를 변환할 수 있습니다.
여기서 파일크기가 maxWidthOrHeight
의 크기보다 크다면 자동으로 maxWidthOrHeight
값으로 리사이징 해줍니다.
변환한 이미지와 원본 이미지를 비교해보면 790KB
에서 37KB
까지 용량이 줄어든 것을 확인할 수 있습니다.
+) WebP를 지원하지 않는 브라우저에서도 호환성을 유지하기 위해 <picture>
태그를 사용할 수 있습니다.
<picture>
<source srcset="/images/your-image.webp" type="image/webp">
<img src="images/your-image.jpg" alt="Description">
</picture>
HTML의 <img>
태그의 loading
속성을 사용하여 화면 밖에 있는 이미지의 로딩을 사용자가 가까이 스크롤할 때까지 지연시킬 수 있습니다.
이렇게 설정하면 중요하지 않는 (첫화면에 보여지지 않는) 리소스가 필요한 경우에만 로드되어 초기 로딩 속도를 증가시킬 수 있습니다.
<img src="image.jpg" loading="lazy" alt="Description">
참고
https://developer.mozilla.org/ko/docs/Web/Performance/Lazy_loading
https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preload#including_a_mime_type