React로 개발할 때, 코드 변경 사항을 확인하려면 수동으로 빌드를 반복해야 하고, 이는 시간이 많이 소요되는 작업입니다. 이러한 반복적인 작업을 자동화하여 시간을 단축하기 위해 webpack-dev-server와 hot reload를 설정합니다.
webpack-dev-server를 설치하고 개발 환경에서 서버를 실행합니다.hot reload 설정을 통해 변경된 내용을 자동으로 반영할 수 있도록 합니다.먼저, react-refresh-webpack-plugin을 설치하여 React 컴포넌트의 hot reload를 지원합니다.
npm install -D @pmmmwh/react-refresh-webpack-plugin react-refresh
npm install -D webpack-dev-server
package.json의 scripts 항목을 다음과 같이 수정하여 webpack-dev-server를 사용한 개발 환경 명령어를 추가합니다.
"scripts": {
"dev": "webpack serve --env development"
}
참고: webpack-cli v4 이상 버전에서는 webpack-dev-server 실행 명령어가 webpack-dev-server에서 webpack serve로 변경되었습니다.
webpack.config.js 파일에서 hot reload 및 개발 서버를 설정합니다.
const path = require('path'); // path 모듈 import 추가
const RefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = {
mode: 'development', // mode 설정 추가
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/, // node_modules 제외
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: ['react-refresh/babel'], // react-refresh 플러그인 추가
},
},
},
],
},
plugins: [
new RefreshWebpackPlugin(), // react-refresh 플러그인 추가
],
devServer: {
devMiddleware: { publicPath: '/dist' }, // 빌드 결과물 위치 설정
static: { directory: path.resolve(__dirname, 'src') }, // 정적 파일 경로 설정 (예: 'src')
hot: true, // hot reload 활성화
liveReload: false, // liveReload 설정 (옵션)
port: 3000, // 개발 서버 포트 설정 (선택 사항)
},
};
Hot Reload
react-refresh 플러그인을 활용하여 컴포넌트 상태를 유지하며 리로딩이 가능합니다.Live Reload
liveReload 옵션을 false로 설정하면, 전체 페이지 새로고침 없이 hot reload만 적용됩니다.devServer: {
devMiddleware: { publicPath: '/dist' },
static: { directory: path.resolve(__dirname, 'src') }, // 정적 파일 경로 예시
hot: true, // hot reload 활성화
liveReload: false, // liveReload 비활성화 (hot reload 적용을 위해)
},
webpack-dev-server는 빌드 결과물을 실제 디스크에 저장하는 대신 메모리에 저장하여, 개발 서버를 빠르게 제공하고 파일 변경 시 바로 반영될 수 있도록 합니다.
Hot reload를 적용했음에도 불구하고 페이지가 새로고침 된다면, liveReload 옵션을 false로 설정하여 해결할 수 있습니다.
devServer: {
devMiddleware: { publicPath: '/dist' },
static: { directory: path.resolve(__dirname, 'src') }, // 정적 파일 경로 예시
hot: true, // hot reload 활성화
liveReload: false, // liveReload 비활성화 (hot reload 적용을 위해)
},