리액트 라우터 v4 와 코드 스플리팅

리액트는 알다시피 한번에 모든 페이지 정보가 스크립트로 들어감.
그러다보니 방문하지 않을 페이지의 코드까지 로드하니 비효율적일 때가 있다.

해당 페이지로 라우팅되었을 때만 그 페이지 코드를 불러오게 해보자.

사용된 모듈은 react, react-dom, react-router-dom 이다.
리액트 라우터는 v4다.

app.js (html에서 불러오는 코드 파일이다.)

import React, { PropTypes, Component} from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter , Route, Switch, Link } from 'react-router-dom';
import AsyncComponent from './lib/asyncRoute';
const Comp1 = AsyncComponent( () => import('./Comp'));
const Comp2 = AsyncComponent( () => import('./Comp2'));


class App extends Component{
      constructor(props){
            super(props);
      }
      render(){
            return(
                  <div>
                         <ul>
                               <li><Link to={`/`}>링크1</Link></li>
                               <li><Link to={`/2`}>링크2</Link></li>
                         </ul>
                        <Route exact path="/" component ={ Comp1 }/>
                        <Route path="/2" component ={ Comp2 }/>
                  </div>
            )
      }
}

ReactDOM.render(
      <BrowserRouter >
      <App/>
      </BrowserRouter>,
      document.getElementById('app')
);

여기에 보면 ./lib/asyncRoute 를 불러와서 외부 파일 비동기 호출할 수 있게 만들었다.

./lib/asyncRoute.js

import React from 'react';
export default function AsyncComponent(getComponent){
      return class AsyncComponent extends React.Component {
            static Component = null;
            state = { Component : AsyncComponent.Component };

            componentWillMount () {
                  if ( !this.state.Component ){
                        getComponent().then( ( { default : Component } ) => {
                              AsyncComponent.Component = Component;
                              this.setState( { Component })
                        })
                  }
            }
            render () {
                  const { Component } = this.state;
                  if ( Component ) {
                        return <Component { ...this.props } />
                  }
                  return null;
            }
      }
}

 

이렇게 파일 만들어 놓고 app.js에 보면 알겠지만 Route의 component = { Comp1 } 은 변수로 정의한 위 asyncRoute.js 의 함수를 실행해서 반환받는다.

webpack3로 build 할 때 webpack.config.js 는 http://bongsunga.com/blog/3575 를 참고하면 된다.

TOP