ABOUT ME

Today
Yesterday
Total
  • [React] 코드 분할
    codeStates front-end/React 2023. 3. 23. 18:41
    반응형

     

     

    목차

     

     

    📌  React 심화

     

     

     

    📍 코드 분할(Code Spliting)

     

    React는 HTML 웹 페이지에 JS를 추가해야 하기 때문에 번들링을 진행한다.

    그러나  JS코드가 점점 무거워지기 때문에 실행 속도가 느려지게 된다. 이를 방지하기 위해

    해결방법은 번들을 물리적으로 나누는 것이다.

     

     

    번들 분할 혹은 줄이는 법

     

    번들링이 진행되면 npm을 통해 서드파티 라이브러리가 포함하게 된다.

    🤷🏼 서드파티(Third Party) 라이브러리란?  개인 개발자나 프로젝트 팀, 혹은 업체등에서 개발하는 라이브러리, 즉 제 3자 라이브러리

    그러나 번들링 시 이 라이브러리는 많은 공간을 차지하기 때문에, 따로 따로 불러서 사용할 수 있어야 한다.

     

    /* 이렇게 lodash 라이브러리를 전체를 불러와서 그 안에 들은 메소드를 꺼내 쓰는 것은 비효율적입니다.*/
    import _ from 'lodash';
    
    ...
    
    _.find([]);
    
    /* 이렇게 lodash의 메소드 중 하나를 불러와 쓰는 것이 앱의 성능에 더 좋습니다.*/
    import find from 'lodash/find';
    
    find([]);

     

     

     

    🔗  React에서의 코드 분할

     

    사용하지 않은 컴포넌트까지 한 번에 불러오려면 첫 화면 렌더링 시간 소요가 길어진다,.

    이를 해결하기 위해 코드 분할 개념이 도입되었다.

     

     

    Static Import

     

    코드 파일의 가장 최상위에서 import지시자를 사용해 사용하고자하는 라이브러리 및 파일을 불러오는 방법

     

    /* 기존에는 파일의 최상위에서 import 지시자를 이용해 라이브러리 및 파일을 불러왔습니다. */
    import moduleA from "library";
    
    form.addEventListener("submit", e => {
      e.preventDefault();
      someFunction();
    });
    
    const someFunction = () => {
      /* 그리고 코드 중간에서 불러온 파일을 사용했습니다. */
    }

     

     

    dynamic import

     

    현재 구분 분석 및 컴파일해야 하는 스크립트의 양을 최소화하기 위해 dynamic import 구문을 지원

     

    form.addEventListener("submit", e => {
      e.preventDefault();
    	/* 동적 불러오기는 이런 식으로 코드의 중간에 불러올 수 있게 됩니다. */
      import('library.moduleA')
        .then(module => module.default)
        .then(someFunction())
        .catch(handleError());
    });
    
    const someFunction = () => {
        /* moduleA를 여기서 사용합니다. */
    }

     

     

     

    🔗  React.lazy()

     

    React.lazy 함수를 사용하면 dynamic import를 사용해 컴포넌트를 렌더링 가능하다.

    React는 React.lazy를 통해 컴포넌트를 동적으로 import를 할 수 있기 때문에 이를 사용하면 초기 렌더링

    지연시간을 어느정도 줄일 수 있게 되었다.

     

    import Component from './Component';
    
    //React.lazy로 감싼 컴포넌트는 단독으로 쓰일 수는 없고, React.suspense 컴포넌트의 하위에서 렌더링을 해야 한다.
    /* React.lazy로 dynamic import를 감쌉니다. */
    const Component = React.lazy(() => import('./Component'));

     

     

    🔗  React.Suspense

     

    lazy를 통해 import 하게 되면 해당 path로 이동하는 과정에서 로딩시간이 걸린다.

    Suspense는 아직 렌더링이 준비되지 않은 컴포넌트가 있을 때 로딩 화면을 보여주고. 로딩이 완료되면 렌더링 화면을 보여주는 기능

     

    /* suspense 기능을 사용하기 위해서는 import 해와야 합니다. */
    import { Suspense } from 'react';
    
    const OtherComponent = React.lazy(() => import('./OtherComponent'));
    const AnotherComponent = React.lazy(() => import('./AnotherComponent'));
    
    function MyComponent() {
      return (
        <div>
    			{/* 이런 식으로 React.lazy로 감싼 컴포넌트를 Suspense 컴포넌트의 하위에 렌더링합니다. */}
          <Suspense fallback={<div>Loading...</div>}>
    				{/* Suspense 컴포넌트 하위에 여러 개의 lazy 컴포넌트를 렌더링시킬 수 있습니다. */}
            <OtherComponent />
    				<AnotherComponent />
          </Suspense>
        </div>
      );
    }

     

     

    🔗  React.lazy와 Suspense의 적용 

     

    코드 분할은 도입 결정이 까다롭기 때문에, 중간 보다는 웹 페이지를 불러오고 진입하는 Route 에 두 기능을 적용시키는 게 좋다.

     

    import { Suspense, lazy } from 'react';
    import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
    
    const Home = lazy(() => import('./routes/Home'));
    const About = lazy(() => import('./routes/About'));
    
    const App = () => (
      <Router>
        <Suspense fallback={<div>Loading...</div>}>
          <Routes>
            <Route path="/" element={<Home />} />
            <Route path="/about" element={<About />} />
          </Routes>
        </Suspense>
      </Router>
    );

     

    반응형

    댓글

Designed by Tistory.