๐ ์ด๋ฏธ์ง ์ง์ฐ(Lazy) ๋ก๋ฉ
- ์คํฌ๋กค์ ํ์ ๋ ํ๋ฉด์ ํน์ ์์(์ด๋ฏธ์ง)๊ฐ ๋จ๋ ์์ ์์๋ง ์์๊ฐ ๋ก๋ฉ๋๋๋ก ํด๋ณด์
- ๋จ์ : ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ๋๋ฌด ๋ง์ด ์ฌ์ฉํด์ ์คํ๋ ค ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค
์ด๋ฐ ๋จ์ ์ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ?!
๋ฐ๋ก, IntersectionObserver์ ์ฌ์ฉ!
๐ IntersectionObserver
- ์ง์ ํ ํน์ ์์๊ฐ ํ๋ฉด์ ๋ณด์ฌ์ง๋์ง ์๋์ง ํ๋จ
- ํ๋ฉด์ ํน์ ์์๊ฐ ๋ณด์ฌ์ง๋ ํจ์๋ฅผ ์คํ์์ผ ์ฑ๋ฅ์ ์ด๋์ ์ทจํ ์ ์๋ค!
let observer = new IntersectionObserver([callbackํจ์], [๋ฏธ๋ฆฌ์ ์ธํ option])
observer.observe([Dom element])
→ callback ํจ์ : ์คํฌ๋กค์ ๋ด๋ฆฌ๋ค๊ฐ ์ง์ ๋ ์์(Dom element)๊ฐ ํ๋ฉด์์ ๋ณด์ด๋ ์๊ฐ๊ณผ ์ง๋์น๋ ์๊ฐ์ ์คํ๋๋ ํจ์
์ ์ฉ์์ผ๋ณด๊ธฐ
๋๋ฒ์ฉ ํธ์ถ๋๋๊น,, ํ๋ฉด์ ๋ฑ ๋ณด์ผ ๋๋ง ํธ์ถ๋๊ฒ ํด๋ณด์ (ํ๋ฉด์์ ์์๊ฐ ์์ด์ง ๋๋ ํธ์ถ์ํค์ง ์๋๋ก!)
entries, isIntersecting ์ฌ์ฉ
const callback = (entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('is Intersecting')
}
});
}
์ด์ ์ฝ์์ ํ๋ฉด์ ๋ณด์ผ๋๋ง ํธ์ถ๋๊ฒ ํ์ผ๋, ์ค์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ฉํด๋ณด์!
→ entry.target : ์ด๋ฏธ์ง ์์
→ data-src : ์ถ์ ์ด๋ฏธ์ง URL, ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ด๋ฏธ์ง ๋ก๋๊ฐ ์๋ฃ๋๋ฉด data-src๋ฅผ src๋ก ๊ต์ฒด๋๋ฉด์ ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์ ๋ก๋๋๊ฒ ๋จ!
→ entry.target.dataset.src : props์ ์ด๋ฏธ์ง ์ฃผ์ (= props.image)
→ entry.target.src = entry.target.dataset.src : ์ด๋ฏธ์ง๋ ์ด ์ฝ๋๊ฐ ์คํ๋ ๋ ์์ค๊ฐ ์๊ธฐ๋ ๊ฒ์, ์ด๋ ์ด๋ฏธ์ง๊ฐ ๋ก๋๋๊ฒ ๋๋ ๊ฒ!
observe ์ค๋จ์ unobserve()๋ก!
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('is Intersecting')
entry.target.src = entry.target.dataset.src
observer.unobserve(entry.target)
}
});
Reference
Inflearn : ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ, ์ค์ ์น ์ฑ๋ฅ ์ต์ ํ(feat. React)
'Web Performance Optimization' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[WPO] ์ด๋ฏธ์ง ์ฌ์ด์ฆ ์ต์ ํ : WEBP (0) | 2022.09.21 |
---|---|
[WPO] ์ปดํฌ๋ํธ Preloading (0) | 2022.09.15 |
[WPO] ์ด๋ฏธ์ง Preloading (0) | 2022.09.14 |
[WPO] transform์ ์ด์ฉํ ์ ๋๋ฉ์ด์ ์ต์ ํ (0) | 2022.09.13 |
[WPO] ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ : Critical Rendering Path, Reflow, Repaint (0) | 2022.09.13 |