프론트엔드 개발자를 위한, 실전 웹 성능 최적화 Part.2 (인프런)
인프런 동영상 강의 내용을 요약 정리하면서 추가적으로 참고한 내용을 덧붙였습니다.
useEffect(() => {
const options = {};
const callback = (entries, observer) => {
entries.forEach(entry => {
if(entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
observer.unobserve(entry.target);
}
});
};
const observer = new IntersectionObserver(callback, options);
observer.observe(imgRef.current);
}, [])
return (<img data-src={props.image} ref={imgRef}/>)
import React, {useEffect, useRef} from 'react';
const LazyImage = ({
observer,
src,
alt,
}) => {
const imageEl = useRef(null);
useEffect(() => {
const {current} = imageEl;
if (observer !== null) {
observer.observe(current);
}
return () => {
observer.unobserve(current);
}
}, [observer]);
return (
<img
ref={imageEl}
data-src={src}
alt={alt}
/>
)
}
export default LazyImage;
img
태그에서 사용할 수 있으며 대부분의 모던 브라우저에서 지원된다.
picture
태그를 사용하여 WebP 미지원 브라우저에 이미지 대체 (Use WebP images)<picture> <source type="image/webp" srcset="pic.webp"> <img src="pic.jpg" alt="test"> </picture>
video
태그에서 사용할 수 있으며 대부분의 모던 브라우저에서 지원된다.
video
태그를 사용하여 WebM 미지원 브라우저에 동영상 대체 (Video Tag)<video controls width="250"> <source src="/media/cc0-videos/flower.webm" type="video/webm"> <source src="/media/cc0-videos/flower.mp4" type="video/mp4"> Sorry, your browser doesn't support embedded videos. </video>
font-display
속성으로 브라우저 렌더링 방식을 변경할 수 있다. font-display: auto; // 브라우저에 의해 결정
font-display: swap; // 폴백 폰트가 표시되고 로딩 완료되면 적용
font-display: block; // 폰트가 표시되지 않고 로딩 완료되면 적용 (최대 3초)
font-display: fallback; // ~100ms 까지 폰트 표시 안됨, ~3초 까지 폴백 폰트 표시 후 로딩 완료되면 적용
font-display: optional; // ~100ms 까지 폰트 표시 안됨, 폴백 표시 후 로딩 완료시 네트워크 상태에 따라 폴백/웹폰트 적용
@font-face {
font-family: 'Nanum Gothic';
font-style: normal;
font-weight: 400;
src: url(/static_fonts/NanumGothic-Regular.eot),
url(/static_fonts/NanumGothic-Regular.woff2) format("woff2"),
url(/static_fonts/NanumGothic-Regular.woff) format("woff"),
url(/static_fonts/NanumGothic-Regular.ttf) format("truetype");
}
@font-face {
font-family: MyHelvetica;
src: local("Helvetica Neue Bold"),
local("HelveticaNeue-Bold"),
url(MgOpenModernaBold.ttf);
font-weight: bold;
}
<link rel="preload" href="./nanumGothic.woff2" as="font" type="font/woff2" crossorigin="anonymous">
Cache-Control
속성을 컨트롤하여 캐싱을 최적화한다.etag
속성을 사용하여 리소스 변경을 식별한다.ETag HTTP 응답 헤더는 특정 버전의 리소스를 식별하는 식별자입니다. 웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭도 아낄 수 있습니다. (ETag HTTP)
HTML: no-cache
CSS, JS, IMG: public, max-age=31536000
HTML: max-age=0, s-maxage=31536000
CSS, JS, IMG: public, max-age=31536000
The HTML meta tag will only be used when the page is viewed from a local disk file system via a
file://
(StackOverflow)