-
[GDSC/Front-End] React lazy loadingFront-end/GDSC 2022. 11. 8. 15:59
๐ lazy loading
ํ์ ์์ ๊น์ง ๊ฐ์ฒด์ ์ด๊ธฐํ๋ฅผ ์ฐ๊ธฐ์ํค๊ธฐ ์ํด ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์ ํํ ์ฌ์ฉ๋๋ ๋์์ธ ํจํด์ ํ๋์ด๋ค.
ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ ์์ ์ ๋น์ฅ ํ์ํ์ง ์์ ๋ฆฌ์์ค๋ค์ ๋์ค์ ๋ถ๋ฌ์ค์!
๐ React image placeholder
๋์ญํญ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ฉฐ ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ทฐํฌํธ ์ธ๋ถ์์ ์ด๋ฏธ์ง ๋ก๋๋ฅผ ์ฐ๊ธฐํ๋ค.
1๏ธโฃ ์ฝ๋ ์ถ๊ฐ
์ด๋ฏธ์ง๋ฅผ ์ง์ฐ๋ก๋ฉ ํ๋ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ์ฌ์ด ๊ฒ์ img ์์ ์์ loading=" lazy" ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค.
<img src="image.jpg" alt=" " loading="lazy" />
2๏ธโฃ ์ด๋ฏธ์ง ๋ธ๋ฌ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
React Lazy Load Image Component ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
3๏ธโฃ intersection observer ์ฌ์ฉ
์ง์ ๋ ์์ญ์ ๋ํด ๊ต์ฐจ(intersection) ํ๋์ง๋ฅผ ๊ฐ์งํ๊ณ ํด๋น ์์ ์ ์ํ๋ ์์ ์ ํ ์ ์๊ฒ ํด์ค๋ค.
๐ DOMContentLoaded ์ด๋ฒคํธ์์ lazy์ ๋ฑ๊ธ์ด ์๋ ๋ชจ๋ <img> ์์์ ๋ํ DOM์ ์กฐํํ๋ค.
document.addEventListener("DOMContentLoaded", function() { var lazyImages = [].slice.call(document.querySelectorAll("img.lazy")); if ("IntersectionObserver" in window) { let lazyImageObserver = new IntersectionObserver(function(entries, observer) { entries.forEach(function(entry) { if (entry.isIntersecting) { let lazyImage = entry.target; lazyImage.src = lazyImage.dataset.src; lazyImage.srcset = lazyImage.dataset.srcset; lazyImage.classList.remove("lazy"); lazyImageObserver.unobserve(lazyImage); } }); }); lazyImages.forEach(function(lazyImage) { lazyImageObserver.observe(lazyImage); }); } else { // Possibly fall back to event handlers here } });
๐ img ํ๊ทธ์ class
<img class="lazy" src="placeholder-image.jpg" data-src="image-to-lazy-load-1x.jpg" data-srcset="image-to-lazy-load-2x.jpg 2x, image-to-lazy-load-1x.jpg 1x" alt="I'm an image!">
- JavaScript์์ ์์๋ฅผ ์ ํํ๋ class ์์ฑ
- ํ์ด์ง๊ฐ ์ฒ์ ๋ก๋๋ ๋ ํ์๋ ์๋ฆฌ ํ์์ ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐํ๋ src ์์ฑ
- ์์๊ฐ ๋ทฐํฌํธ์ ์์ ๋ ๋ก๋ํ ์ด๋ฏธ์ง์ URL์ ํฌํจํ๋ ์๋ฆฌ ํ์์ ์์ฑ์ธ data-src ๋ฐ data-srcset ์์ฑ
4๏ธโฃ CSS ์ด๋ฏธ์ง
- CSS background-image ์์ฑ(๋ฐ ๊ธฐํ ์์ฑ)์ ํตํด ์ด๋ฏธ์ง๋ฅผ ํธ์ถ
- ๋ฌธ์์ CSS ๊ฐ์ฒด ๋ชจ๋ธ ๋ฐ ๋ ๋ ํธ๋ฆฌ๊ฐ ๊ตฌ์ถ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ธฐ ์ ์ CSS๊ฐ ๋ฌธ์์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ๊ฒ์ฌํ๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๋ CSS ๊ท์น์ด ํ์ฌ ๊ตฌ์ฑ๋ ๋ฌธ์์ ์ ์ฉ๋์ง ์๋๋ค๊ณ ํ๋จํ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์์ฒญํ์ง ์์
- JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์์๊ฐ ๋ทฐํฌํธ ๋ด์ ์๋์ง ํ์ธํ ๋ค์ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง๋ฅผ ํธ์ถํ๋ ์คํ์ผ๋ง์ ์ ์ฉํ๋ ์์์ ํด๋์ค๋ฅผ ์ ์ฉํ์ฌ CSS์์ ์ด๋ฏธ์ง ๋ก๋๋ฅผ ์ฐ๊ธฐํ๋ ๋ฐ ์ด ์ถ์ธก ๋์์ ์ฌ์ฉ
<div class="lazy-background"> <h1>Here's a hero heading to get your attention!</h1> <p>Here's hero copy to convince you to buy a thing!</p> <a href="/buy-a-thing">Buy a thing!</a> </div>
๐ ์์๊ฐ ๋ทฐํฌํธ์ ์์ ๋ visible ํด๋์ค๋ฅผ ํตํด div.lazy-background ์์์ background-image ์์ฑ์ ๊ฒฉ๋ฆฌํ ์ ์๋ค
.lazy-background { background-image: url("hero-placeholder.jpg"); /* Placeholder image */ } .lazy-background.visible { background-image: url("hero.jpg"); /* The final image */ }
๐ ์์๊ฐ ๋ทฐํฌํธ์ ์๋์ง ํ์ธํ๊ณ (Intersection Observer) ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ์์ ์์ visible ํด๋์ค๋ฅผ div.lazy-background ์์์ ์ถ๊ฐ
document.addEventListener("DOMContentLoaded", function() { var lazyBackgrounds = [].slice.call(document.querySelectorAll(".lazy-background")); if ("IntersectionObserver" in window) { let lazyBackgroundObserver = new IntersectionObserver(function(entries, observer) { entries.forEach(function(entry) { if (entry.isIntersecting) { entry.target.classList.add("visible"); lazyBackgroundObserver.unobserve(entry.target); } }); }); lazyBackgrounds.forEach(function(lazyBackground) { lazyBackgroundObserver.observe(lazyBackground); }); } });
<link rel="stylesheet" href="/style.css" /> <script src="lazy.js"></script> </head> <body> <div class="wrapper"> <div class="lazy-background one"></div> <div class="lazy-background two"></div> <div class="lazy-background three"></div> </div> </body>
'Front-end > GDSC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[GDSC/์ํ์ธ๋] ๊ฐ๋ฐ ์ผ์ง #1-2์ฃผ ์ฐจ (0) 2023.01.09 [GDSC/Front-End] JWT ๋ก๊ทธ์ธ (0) 2022.12.06