250x250
반응형
arkhyeon
arkhyeon
arkhyeon
전체 방문자
오늘
어제
  • 분류 전체보기 (88)
    • Spring (5)
    • Java (4)
    • React (25)
      • TypeScript (6)
      • JavaScript (1)
      • Jest (9)
    • NEXT (8)
    • SQL (1)
    • React native (1)
    • CSS (3)
    • Web (1)
    • Git (3)
    • ETC (6)
    • 빅데이터DB (8)
    • Docker (4)
    • Tool (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • HIVE
  • Spring WebSocket
  • node WebSocket
  • websocket server
  • javascript wss
  • WSS
  • react usetransition
  • react spring websocket
  • react19
  • react jest
  • react loading
  • jest
  • docker tomcat
  • react
  • usetransition
  • websocket
  • react typescript
  • javasciprt websocket
  • react websocket
  • kudu

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
arkhyeon

arkhyeon

React

Dynamic Import / Lazy Loading - 코드 스플리팅[Code Splitting]

2023. 9. 7. 16:11
728x90
반응형

코드 스플리팅

코드를 다양한 번들로 분할하고, 요청에 따라 로드하여 사용자가 필요할 때에 필요한 코드만 사용할 수 있습니다.

더 작은 번들을 만들고 리소스 우선순위를 올바르게 제어하기 위해서 사용하며, 잘 활용하면 SPA의 단점인 로딩 시간을 절약할 수 있습니다.

Dynamic Import (동적 불러오기)

모듈 내에서 인라인 함수 호출을 통해 코드를 분할합니다.

 

App.tsx

  function App() {
    const test = () => {
      import('./common/test').then(test => {
        console.log(test.text());
      });
    };

    return <button onClick={() => test()}>Dynamic Import Button</button>;
  }

test.ts

export const text = () => {
  console.log('open');
};

버튼 클릭 전
버튼 클릭 후

Lazy Loading (지연 로딩)

SPA  첫 로드 시 모든 화면을 다 가져오는데 이는 첫 화면 불러오는 시간을 많이 사용하게 됩니다.
따라서 지연 로딩은 필요한 파일을 필요할 때만 로딩하도록 만듭니다.

 

Modal, Dialog 등 안 보였다가 바로 보여야 하거나 지연 로딩도 필요하지만 미리 로딩해 대기하고 있어야 하는 컴포넌트의 경우 preload를 사용하여 해결할 수 있습니다.

지연 로딩된 파일이 필요 없는 화면(Main.tsx 로딩X)
지연 로딩된 파일이 필요 있는 화면(Main.tsx 로딩O)
Lazy Loading 이지만 PreLoad한 경우(Main.tsx 로딩O)

1. 기본 방식

import { lazy, Suspense } from 'react';
const Main = lazy(() => import('./page/main/Main'));

function App() {

  return (
    <Router>
      <Routes>
          <Route
            path="/"
            element={
              <Suspense fallback={<div>...Loading</div>}>
                <Main />
              </Suspense>
            }
          />
      </Routes>
    </Router>
  );
}

2. PreLoad 기본 방식

import { lazy, Suspense } from 'react';

const MainPromise = import('./page/main/Main');
const Main = lazy(() => MainPromise);

function App() {

  return (
    <Router>
      <Routes>
          <Route
            path="/"
            element={
              <Suspense fallback={<div>...Loading</div>}>
                <Main />
              </Suspense>
            }
          />
      </Routes>
    </Router>
  );
}


3. 재사용 함수 방식

import { ComponentType, lazy, LazyExoticComponent, Suspense, useEffect } from 'react';

// Path Type Function
const [Main, preload] = getLazyComponentAndPreload(() => import('./page/main/Main'));
// Path Type String
const [Main, preload] = getLazyComponentAndPreload('./page/main/Main');

function App() {
  useEffect(() => {
    preload();
  }, []);
  
  return (
    <Router>
      <Routes>
          <Route
            path="/"
            element={
              <Suspense fallback={<div>...Loading</div>}>
                <Main />
              </Suspense>
            }
          />
      </Routes>
    </Router>
  );
}

export type ReactLazyFactory<T = any> = () => Promise<{ default: ComponentType<T> }>;

export type ComponentPreloadTuple<T = any> = [
  component: LazyExoticComponent<ComponentType<T>>,
  preloadFn: () => void,
];

export function getLazyComponentAndPreload<T = any>(
  componentPath: string,
): ComponentPreloadTuple<T>;
export function getLazyComponentAndPreload<T = any>(
  factory: ReactLazyFactory<T>,
): ComponentPreloadTuple<T>;
export function getLazyComponentAndPreload<T = any>(
  input: string | ReactLazyFactory<T>,
): ComponentPreloadTuple<T> {
  const factory = () => (typeof input === 'string' ? import(input) : input());
  return [lazy(factory), factory];
}

 

 

React 빌드 용량 최적화 - Vite rollupOptions manualChunks

하나로 빌드 되는 큰 파일을 작게 나누어 필요한 파일을 필요한 때 불러와 렌더링 속도 개선 1. manualChunks 모든 코드를 미리 로드하는 대신 필요에 따라 작은 청크로 분할하는 기능으로 초기 로드

arkhyeon.tistory.com

 

728x90
반응형

'React' 카테고리의 다른 글

React Javascript WebSocket - Server 포함  (0) 2023.10.31
React 빌드 용량 최적화 - Vite rollupOptions manualChunks  (0) 2023.09.07
Compound Component 패턴  (0) 2023.07.12
React createPortal(Modal Component)  (0) 2023.07.11
React Route dom v6 하위 경로 이동 시 에도 인덱스 NavLink 활성화  (0) 2023.07.04
    'React' 카테고리의 다른 글
    • React Javascript WebSocket - Server 포함
    • React 빌드 용량 최적화 - Vite rollupOptions manualChunks
    • Compound Component 패턴
    • React createPortal(Modal Component)
    arkhyeon
    arkhyeon

    티스토리툴바