본문 바로가기
React

React에서 Webpack 및 Babel 최적화하기

by 굿센스굿 2024. 12. 17.
반응형

 

React 애플리케이션의 성능과 로드 시간을 개선하려면 Webpack과 Babel을 효과적으로 최적화하는 것이 중요합니다. 이 글에서는 Webpack과 Babel의 기본 설정부터 최적화 전략까지 단계별로 설명하겠습니다.

1. Webpack 및 Babel의 역할 이해하기

Webpack

Webpack은 자바스크립트 애플리케이션의 모듈 번들러로, 모든 자원을 하나의 파일 또는 여러 파일로 병합해 최적화된 형태로 배포할 수 있습니다. 주요 기능은 다음과 같습니다:

  • 코드 분할(Code Splitting)
  • 자원 최적화(이미지, CSS 등)
  • 로더(Loader)를 통한 변환 지원

Babel

Babel은 최신 자바스크립트 코드를 이전 버전의 브라우저에서도 동작하도록 변환하는 트랜스파일러입니다. React 애플리케이션에서 JSX를 변환하고 최신 ES6+ 문법을 ES5로 변환하는 데 사용됩니다.


2. Webpack과 Babel 기본 설정

필수 패키지 설치

React 프로젝트에서 Webpack과 Babel을 사용하려면 다음 패키지를 설치해야 합니다:

npm install webpack webpack-cli webpack-dev-server babel-loader @babel/core @babel/preset-env @babel/preset-react html-webpack-plugin --save-dev

Webpack 설정

webpack.config.js 파일을 생성하고 기본 설정을 구성합니다:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
  devServer: {
    static: './dist',
    port: 3000,
    hot: true,
  },
  resolve: {
    extensions: ['.js', '.jsx'],
  },
  mode: 'development',
};

Babel 설정

babel.config.json 파일을 생성하고 다음과 같이 구성합니다:

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react"
  ]
}

3. Webpack 최적화

코드 분할 (Code Splitting)

코드 분할을 통해 초기 로드 시간을 줄이고 필요한 모듈만 로드할 수 있습니다. Webpack의 optimization.splitChunks를 사용합니다:

module.exports = {
  // ... 기존 설정
  optimization: {
    splitChunks: {
      chunks: 'all',
    },
  },
};

캐싱 활성화

output.filename에 고유한 해시를 추가하여 브라우저 캐싱을 활용합니다:

output: {
  path: path.resolve(__dirname, 'dist'),
  filename: '[name].[contenthash].js',
  clean: true,
},

이미지 및 자원 최적화

image-webpack-loader를 사용하여 이미지 파일을 최적화합니다:

npm install image-webpack-loader --save-dev

Webpack 설정에 로더 추가:

{
  test: /\.(png|jpe?g|gif|svg)$/i,
  use: [
    {
      loader: 'file-loader',
      options: {
        name: '[path][name].[ext]',
      },
    },
    'image-webpack-loader',
  ],
}

4. Babel 최적화

Babel 플러그인 추가

@babel/plugin-transform-runtime를 설치하여 코드 중복을 줄입니다:

npm install @babel/plugin-transform-runtime --save-dev

babel.config.json에 플러그인 추가:

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react"
  ],
  "plugins": [
    "@babel/plugin-transform-runtime"
  ]
}

폴리필 최적화

Babel 7 이상에서는 @babel/preset-envuseBuiltIns 옵션을 설정하여 필요한 폴리필만 포함시킵니다:

{
  "presets": [
    ["@babel/preset-env", { "useBuiltIns": "entry", "corejs": 3 }],
    "@babel/preset-react"
  ]
}

core-js를 설치합니다:

npm install core-js

5. 개발 및 프로덕션 환경 분리

Webpack 설정을 개발과 프로덕션 환경으로 분리하여 최적화할 수 있습니다. 이를 위해 webpack-merge를 사용합니다:

npm install webpack-merge --save-dev

공통 설정

webpack.common.js:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash].js',
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: 'babel-loader',
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
  resolve: {
    extensions: ['.js', '.jsx'],
  },
};

개발 설정

webpack.dev.js:

const { merge } = require('webpack-merge');
const common = require('./webpack.common');

module.exports = merge(common, {
  mode: 'development',
  devServer: {
    static: './dist',
    port: 3000,
    hot: true,
  },
});

프로덕션 설정

webpack.prod.js:

const { merge } = require('webpack-merge');
const common = require('./webpack.common');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = merge(common, {
  mode: 'production',
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          compress: {
            drop_console: true,
          },
        },
      }),
    ],
  },
});

결론

Webpack과 Babel의 최적화는 React 애플리케이션의 성능 향상에 필수적입니다. 위에서 설명한 방법을 따라 Webpack의 설정을 세분화하고 Babel의 변환 과정을 최적화하여 더 빠르고 효율적인 애플리케이션을 구축해 보세요!

반응형