React, Next, Redux/⚛ React.JS

Loadable Components를 통한 코드 스플리팅

DarrenKwonDev 2020. 7. 10. 17:58

React가 내장한 React.lazy와 Suspense를 쓰는 것이 좋다고 생각하지만 아직 까지도 SSR을 지원하지 않고 있다.

때문에 페이스북 측에서도 Loadable Components를 사용할 것을 권고 하고 있다.

 

 

 

공식 문서 : https://loadable-components.com/

github : https://github.com/gregberge/loadable-components

npm 주간 다운로드 수는 15만 정도 수준입니다.

 

 

설치

npm install @loadable/component

 

 

사용법

 

React.lazy와 사용법이 많이 비슷합니다만 Suspense를 쓰지 않고 곧바로 fallback 설정을 해줄 수 있는 점이 다릅니다.

// React.lazy
const SplitMe = React.lazy(() => import("./SplitMe"));

// loadable
const SplitMe = loadable(() => import("./SplitMe"), {
  fallback: <div>로딩중입니다</div>,
});

 

사용 방법은 다음과 같습니다. 너무 간단!

import React, { useState } from "react";
import "./App.css";
import loadable from "@loadable/component";

const SplitMe = loadable(() => import("./SplitMe"), {
  fallback: <div>로딩중입니다</div>,
});

function App() {
  const [visible, setvisible] = useState(false);
  return (
    <div>
      <button
        onClick={() => {
          setvisible(true);
        }}
      >
        가져오기
      </button>
      {visible ? <SplitMe /> : null}
    </div>
  );
}

export default App;

 

 

preload 구현하기

 

preload, 즉 미리 불러오는 것이 왜 필요하냐면, 컴포넌트를 보고 싶을 때 발생하는 이벤트에서 로딩을 시작하는 것보다. 그 전단계에서 미리 불러오는 것이 UX 적인 측면에서 편리하기 때문입니다.

 

예를 들어 로딩 버튼을 누르기 전, 마우스를 호버하는 시점부터 로딩을 시작하면 사용자 입장에서는 로딩이 빨리 된다고 생각하게 될 것입니다.

 

onMouseOver 속성에 preload 메서드만 사용해주면 끝!

 

const SplitMe = loadable(() => import("./SplitMe"), {
  fallback: <div>로딩중입니다</div>,
});

function App() {
  const [visible, setvisible] = useState(false);
  return (
    <div>
      <button
        onClick={() => {
          setvisible(true);
        }}
        onMouseOver={() => {
          SplitMe.preload();
        }}
      >
        가져오기
      </button>
      {visible ? <SplitMe /> : null}
    </div>
  );
}

 

 

 

 

 

futhermore

 

preload 기능 외에도 

 

timout

https://loadable-components.com/docs/timeout/

import loadable from '@loadable/component'
import { timeout } from 'promise-timeout'

// Wait a maximum of 2s before sending an error.
export const OtherComponent = loadable(() =>
  timeout(import('./OtherComponent'), 2000)
)

 

delay

https://loadable-components.com/docs/delay/

import loadable from '@loadable/component'
import pMinDelay from 'p-min-delay'
// Wait a minimum of 200ms before loading home.
export const OtherComponent = loadable(() =>
  pMinDelay(import('./OtherComponent'), 200)
)

 

등 많은 기능이 있습니다. 편하신 방법으로 사용하시면 됩니다.