리액트는 알다시피 한번에 모든 페이지 정보가 스크립트로 들어감.
그러다보니 방문하지 않을 페이지의 코드까지 로드하니 비효율적일 때가 있다.
해당 페이지로 라우팅되었을 때만 그 페이지 코드를 불러오게 해보자.
사용된 모듈은 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 를 참고하면 된다.