๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web Performance Optimization

[WPO] ์ด๋ฏธ์ง€ ์ง€์—ฐ(Lazy) ๋กœ๋”ฉ : IntersectionObserver

๐Ÿ“Œ ์ด๋ฏธ์ง€ ์ง€์—ฐ(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)