기다리는 것을 좋아하는 사람은 없습니다. 로드 시간이 3초 이상 걸리면 사용자의 50% 이상이 웹사이트를 떠납니다.
대용량 JavaScript 페이로드를 전송하면 사이트 속도에 영향을 미칩니다 크게 향상되었습니다. 모든 자바스크립트를 애플리케이션의 첫 페이지가 로드되면 번들을 처음부터 필요한 것만 보냅니다.
코드 분할이 유용한 이유는 무엇인가요?
코드 분할은 시작 시간을 최소화하는 기법입니다. 시작 시 제공되는 JavaScript를 줄이면 이 중요한 기간 동안 기본 스레드 작업을 최소화하여 애플리케이션을 더 빠르게 상호작용할 수 있습니다.
코어 웹 바이탈의 경우 시작 시 다운로드되는 JavaScript 페이로드를 줄이면 다음 페인트에 대한 상호작용 (INP) 시간이 개선됩니다. 그 이유는 기본 스레드를 해제함으로써 애플리케이션이 JavaScript 파싱, 컴파일, 실행 관련 시작 비용을 줄여 사용자 입력에 더 빠르게 응답할 수 있기 때문입니다.
웹사이트의 아키텍처(특히 클라이언트 측 렌더링에 크게 의존하는 경우)에 따라 마크업을 렌더링하는 JavaScript 페이로드의 크기를 줄이면 최대 콘텐츠 페인트(LCP) 시간이 개선될 수 있습니다. 이 문제는 클라이언트 측 마크업이 완료될 때까지 LCP 리소스를 브라우저에서 검색하는 데 지연되거나 기본 스레드가 사용 중이어서 해당 LCP 요소를 렌더링할 수 없을 때 발생할 수 있습니다. 두 시나리오 모두 페이지의 LCP 시간을 지연시킬 수 있습니다.
측정
Lighthouse는 전체 데이터 세트에 시간이 너무 오래 걸리면 감사 실패를 표시합니다. 실행할 수 있습니다.
초기 경로에 필요한 코드만 전송하도록 자바스크립트 번들을 분할합니다. 애플리케이션을 로드할 수 있습니다 이렇게 하면 필요한 스크립트의 양을 최소화할 수 있습니다. 파싱 및 컴파일되어 페이지 로드 시간이 빨라집니다.
인기 모듈 번들러(예: webpack,
Parcel
Rollup을 사용하면
번들에 동적 가져오기를 사용합니다.
예를 들어, 다음과 같은 코드 스니펫이
someFunction
메서드: 양식이 제출될 때 실행됩니다.
import moduleA from "library";
form.addEventListener("submit", e => {
e.preventDefault();
someFunction();
});
const someFunction = () => {
// uses moduleA
}
여기서 someFunction
는 특정 라이브러리에서 가져온 모듈을 사용합니다. 만약
이 모듈은 다른 곳에서 사용되지 않는 경우
동적 가져오기를 사용하여 양식을 사용자가 제출한 경우에만 가져올 수 있습니다.
form.addEventListener("submit", e => {
e.preventDefault();
import('library.moduleA')
.then(module => module.default) // using the default export
.then(() => someFunction())
.catch(handleError());
});
const someFunction = () => {
// uses moduleA
}
모듈을 구성하는 코드는 초기 번들에 포함되지 않음 이제 지연 로드되거나, 로드 이후에 필요할 때만 사용자에게 제공됩니다. 있습니다. 페이지 성능을 더욱 개선하려면 중요한 청크를 미리 로드하여 우선순위를 지정하고 더 빨리 가져옵니다.
이전 코드 스니펫은 간단한 예이지만 제3자 지연 로드는 종속 항목은 대규모 애플리케이션에서 일반적인 패턴이 아닙니다. 일반적으로 세 번째 파티 종속 항목은 캐시할 수 있는 별도의 공급업체 번들로 분할됩니다. 자주 업데이트되지 않으므로 자세한 내용은 SplitChunksPlugin은 도움이 될 것입니다.
클라이언트 측 프레임워크를 사용할 때 경로 또는 구성 요소 수준에서 분할하는 것 애플리케이션의 여러 부분을 지연 로드하는 더 간단한 접근 방식입니다. 여러 항목 webpack을 사용하는 인기 있는 프레임워크는 지연 로드를 만드는 추상화를 제공합니다. 방법을 익히는 것보다 쉽습니다.