5-2. 리액트 핫 로더 (react-hot-loader) 적용하기

개발을 좀 더 원할하게 하기 위해서, 프로젝트에 리액트 핫 로더를 적용하겠습니다.

$ yarn add react-hot-loader@next

그 다음엔, webpack 설정을 변경해야하니, eject 스크립트를 실행하세요.

$ yarn eject

이제 config 디렉토리의 webpack.config.dev.js 파일을 수정하겠습니다. react-hot-loader 를 적용 할 때에는 웹팩 설정에서 두가지 작업을 해주어야합니다. 첫번째는 babel 플러그인 추가이며, 두번째는 엔트리에 react-hot-loader/patch 를 삽입하는 것 입니다.

babel 플러그인 추가하기

config/webpack.config.dev.js - babel-loader

      {
        test: /\.(js|jsx)$/,
        include: paths.appSrc,
        loader: require.resolve('babel-loader'),
        options: {
          plugins: ['react-hot-loader/babel'],
          // This is a feature of `babel-loader` for webpack (not Babel itself).
          // It enables caching results in ./node_modules/.cache/babel-loader/
          // directory for faster rebuilds.
          cacheDirectory: true,
        },
      },

엔트리에 react-hot-loader 삽입하기

config/webpack.config.dev.js - entry

  entry: [
    require.resolve('react-dev-utils/webpackHotDevClient'),
    require.resolve('./polyfills'),
    require.resolve('react-error-overlay'),
    'react-hot-loader/patch',
    paths.appIndexJs,
  ],

설정을 마친다음엔 개발서버를 재실행하세요.

프로젝트 엔트리 파일에서 리액트 핫 로더 적용하기

리액트 핫 로더를 적용하려면 엔트리 파일에서 AppContainer 를 통하여 Root 컴포넌트를 적용해야하며, module.hot 관련 코드를 작성해야 합니다. 엔트리 파일을 다음과 같이 수정하세요.

src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Root from './Root';
import registerServiceWorker from './registerServiceWorker';
import './index.css';
import configureStore from 'redux/configureStore';
import { AppContainer } from 'react-hot-loader';

const store = configureStore();

const render = Component => {
    ReactDOM.render(
        <AppContainer>
            <Component store={store}/>
        </AppContainer>,
        document.getElementById('root')
    );
};

render(Root);

if(module.hot) {
    module.hot.accept('./Root', () => render(Root));
}

registerServiceWorker();

리덕스에서 모듈 핫 로딩하기

코드 핫 리로딩이 진행 될 때, 리덕스 관련 코드도 지원이 되도록 하려면 모듈을 불러오는 곳에서도 코드를 조금 수정해주어야합니다. configureStore.js 파일을 다음과 같이 수정하세요.

src/redux/configureStore.js

import { createStore } from 'redux';

import modules from './modules';

// Todo: 미들웨어 적용
const configureStore = (initialState) => {
    const store = createStore(modules, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());

    // hot-reloading 를 위한 코드
    if(module.hot) {
        module.hot.accept('./modules', () => {
            const nextRootReducer = require('./modules').default;
            store.replaceReducer(nextRootReducer);
        });
    }

    return store;
}

export default configureStore;

이제 react-hot-loader 가 적용되었습니다! 이제 코드가 변경될 때마다 페이지가 새로고침없이 업데이트 됩니다. 사용하면서 주의하실 점은, 만약에 컴포넌트의 메소드중 async/await 을 사용한 메소드를 수정하였더라면, 그 때는 임의로 새로고침을 해주세요.`

results matching ""

    No results matching ""