노트

코드 스플리팅과 동적 임포트

Code Splitting

프론트엔드#performance#js · 연결된 개념 13개

쉽게 말하면

코드 스플리팅은 코스 요리처럼 한 상에 다 차리지 않고 필요할 때 다음 접시를 내오는 거예요. 첫 화면에 필요한 코드만 먼저 받으니 저사양 휴대폰에서도 화면이 빨리 떠요.

비유의 한계 접시를 너무 잘게 나누면 누를 때마다 다음 접시를 기다려야 해요. 그래서 prefetch로 미리 받아 두고, Next.js에선 라우트 분할이 기본이라 서버 컴포넌트로 둘 수 있는지부터 따져요.

코드 스플리팅(Code Splitting)은 하나의 큰 JavaScript 번들을 여러 청크(chunk)로 나누는 빌드 기법이고, 동적 임포트(Dynamic Import, import())는 그 청크를 실제로 필요해질 때 받아오는 방법이다. 나누는 것은 "어떻게", 불러오는 시점은 "언제"의 문제다.

  • 브라우저는 JS를 받기만 하는 게 아니라 파싱·컴파일·실행까지 해야 한다. 그래서 초기 번들이 작을수록 저사양 모바일에서 체감 차이가 크다(Core Web Vitals)
  • import()를 만나면 번들러가 별도 청크를 만든다. React에서는 React.lazy(() => import('./Chart')), Next.js에서는 next/dynamic을 쓴다
  • 자르는 단위는 보통 라우트, 또는 지도·차트·에디터·동영상 플레이어처럼 처음엔 필요 없는 무거운 기능이다
  • 너무 잘게 자르면 클릭할 때마다 다운로드를 기다리게 된다. 이 대기는 prefetch·preload로 줄인다
  • 안 쓰는 코드를 아예 빼는 트리 셰이킹과는 다른 기법이고, 둘은 같이 쓴다
const Editor = dynamic(() => import('@/components/Editor'), {
  loading: () => <p>에디터 로딩 중...</p>,
})

Next.js App Router에서

라우트 단위 분할은 기본으로 해 준다. 그래서 컴포넌트마다 dynamic()을 붙이기보다 아래 순서로 생각한다.

  1. 서버 컴포넌트로 둘 수 있나? 그러면 클라이언트로 JS를 아예 보내지 않는다
  2. 첫 화면에 필요한 클라이언트 컴포넌트인가? 그러면 그냥 import한다
  3. 무겁고 나중에 써도 되나? 그때 next/dynamic을 쓴다

번들을 줄이는 다른 방법은 번들 크기 줄이기에 정리했다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • loading 경계와 레이아웃 끌어올리기

    Next.js App Router에서 loading.tsx는 같은 세그먼트의 page와 그 아래(하위 layout 포함)를 suspense로 감싸지만, **같은 세그먼트의 layout은 감싸지 않는다**. 그래서 데이터를 기다릴 필요가 없는 공통 UI(탭바, 필터 헤더)를 page에서 layout으로 끌어올리면 스켈레톤에 덮이지 않고 처음부터 실제 모습으로 보인다.

  • Pages Router에서 App Router로

    App Router는 Next.js 13에서 도입된 app/ 디렉터리 기반 라우터로, 서버 컴포넌트·중첩 레이아웃(Nested Layouts)·스트리밍을 기본으로 한다. pages/ 기반의 Pages Router에서 옮길 때 바뀌는 생각을 정리한다.

  • 변경하기 쉬운 프론트엔드 코드

    Frontend Fundamentals는 "좋은 프론트엔드 코드 = 변경하기 쉬운 코드"라는 관점에서 가독성(Readability)·예측 가능성(Predictability)·응집도(Cohesion)·결합도(Coupling) 네 기준과 구체적인 기법을 정리한 공개 가이드다. 네 기준은 서로 부딪치기도 해서 상황에 맞게 무엇을 우선할지 고르는 것이 핵심이다.

  • 반응형 웹 디자인

    하나의 페이지가 화면 크기와 기기에 맞춰 레이아웃·이미지·글자 크기를 바꾸도록 만드는 접근. 미디어 쿼리(Media Query), 유연한 레이아웃(Flexible Layout), 반응형 미디어(Responsive Media)가 세 축이다.

  • 구성요소 줄이기

    셀 수 있는 모든 구성요소(파일, 폴더 깊이, 클래스, 함수, 분기, 변수, 테이블, 필드, 테스트 케이스…)는 비용이라는 관점. 심플 디자인의 네 번째 규칙을 실무 기준으로 풀어낸 것이다.

보기 옵션