노트

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

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)가 세 축이다.

  • 구성요소 줄이기

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

보기 옵션