icon안동민 개발노트

Webpack 기초


 Webpack은 현대 자바스크립트 애플리케이션을 위한 강력한 모듈 번들러입니다.

 복잡한 의존성 관계를 가진 여러 파일들을 하나 또는 여러 개의 최적화된 번들로 만들어주는 도구로, 웹 개발의 복잡성을 관리하는 데 중요한 역할을 합니다.

Webpack의 핵심 개념

  1. Entry : 의존성 그래프의 시작점
  2. Output : 번들된 결과물의 저장 위치
  3. Loaders : 다양한 유형의 파일을 모듈로 변환
  4. Plugins : 번들 최적화, 자산 관리 등 추가 작업 수행
  5. Mode : 개발 또는 프로덕션 모드 설정

 기본 설정 예시 (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'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ],
  mode: 'development'
};

주요 Loader

  1. babel-loader : ES6+ 코드를 ES5로 변환
{
  test: /\.js$/,
  use: 'babel-loader',
  exclude: /node_modules/
}
  1. css-loader & style-loader : CSS 파일 처리
{
  test: /\.css$/,
  use: ['style-loader', 'css-loader']
}
  1. file-loader : 이미지, 폰트 등의 파일 처리
{
  test: /\.(png|jpg|gif)$/,
  use: 'file-loader'
}

자주 사용되는 Plugin

  1. HtmlWebpackPlugin : HTML 파일 생성 및 번들 주입
new HtmlWebpackPlugin({
  template: './src/index.html'
})
  1. MiniCssExtractPlugin : CSS를 별도 파일로 추출
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 
new MiniCssExtractPlugin({
  filename: '[name].css'
})

개발 vs 프로덕션 설정

 개발 환경

  • 빠른 빌드 시간
  • 소스맵 제공
  • 핫 모듈 교체 (HMR)

 프로덕션 환경

  • 코드 최소화 및 압축
  • 최적화된 에셋 관리
  • 해시를 이용한 캐싱

 프로덕션 최적화 예시

const TerserPlugin = require('terser-webpack-plugin');
 
module.exports = {
  mode: 'production',
  optimization: {
    minimizer: [new TerserPlugin()],
  },
};

Code Splitting 및 Lazy Loading

 Code Splitting은 애플리케이션을 여러 청크로 나누는 기술입니다.

import('./module').then(module => {
  // 모듈 사용
});

 Lazy Loading과 결합하면 필요한 시점에 코드를 로드할 수 있어 초기 로딩 시간을 줄일 수 있습니다.

Webpack Dev Server

 개발 서버 설정

module.exports = {
  devServer: {
    contentBase: './dist',
    hot: true
  }
};

 실행 : webpack-dev-server

 개발 생산성 향상

  • 자동 리로딩
  • 빠른 컴파일
  • HMR 지원

Tree Shaking

 사용하지 않는 코드 제거 기술

  1. ES6 모듈 사용
  2. package.json"sideEffects": false 설정
  3. 프로덕션 모드 사용

성능 최적화

  1. 캐싱
output: {
  filename: '[name].[contenthash].js'
}
  1. 병렬 처리
const ThreadsPlugin = require('threads-plugin');
 
plugins: [
  new ThreadsPlugin()
]
  1. 번들 분석 : webpack-bundle-analyzer 플러그인 사용

Webpack vs 다른 빌드 도구

 1. Rollup

  • 장점 : 작은 번들 크기, ES 모듈에 최적화
  • 적합 : 라이브러리 개발

 2. Parcel

  • 장점 : 설정 없는 사용, 빠른 빌드 시간
  • 적합 : 소규모 프로젝트, 빠른 프로토타이핑

 Webpack은 대규모, 복잡한 애플리케이션에 가장 적합하며, 높은 유연성과 강력한 기능을 제공합니다.

 Webpack은 현대 웹 개발에서 필수적인 도구로 자리잡았습니다. 복잡한 자바스크립트 애플리케이션의 의존성을 관리하고, 다양한 리소스를 효율적으로 번들링하는 Webpack의 능력은 대규모 프로젝트 관리를 크게 간소화합니다.

 Webpack의 핵심 개념인 Entry, Output, Loaders, Plugins, Mode는 각각 중요한 역할을 합니다. Entry point는 애플리케이션의 시작점을 정의하고, Output은 번들된 파일의 저장 위치를 지정합니다. Loaders는 다양한 유형의 파일(자바스크립트, CSS, 이미지 등)을 처리할 수 있게 해주며, Plugins는 번들 최적화, HTML 파일 생성 등 추가적인 기능을 제공합니다. Mode 설정은 개발 또는 프로덕션 환경에 맞는 최적화를 자동으로 적용합니다.

 주요 Loader들은 각각 특정 유형의 파일을 처리합니다. 예를 들어, babel-loader는 최신 자바스크립트 코드를 구버전 브라우저에서도 실행 가능한 코드로 변환하고, css-loader와 style-loader는 CSS 파일을 자바스크립트 모듈로 변환하여 DOM에 스타일을 주입합니다. file-loader는 이미지나 폰트 같은 파일을 처리하여 번들에 포함시킵니다.

 Plugin은 Webpack의 기능을 확장합니다. HtmlWebpackPlugin은 HTML 파일을 자동으로 생성하고 번들된 자바스크립트를 주입합니다. MiniCssExtractPlugin은 CSS를 별도의 파일로 추출하여 성능을 개선합니다.

 개발 환경과 프로덕션 환경에서의 Webpack 설정은 다릅니다. 개발 환경에서는 빠른 빌드와 디버깅을 위한 설정이 중요하고, 프로덕션 환경에서는 코드 최소화, 최적화, 캐싱 전략 등이 중요합니다.

 Code Splitting과 Lazy Loading은 대규모 애플리케이션의 성능을 크게 개선할 수 있는 기술입니다. 필요한 코드만 로드함으로써 초기 로딩 시간을 줄이고 전체적인 성능을 향상시킬 수 있습니다.

 Webpack Dev Server는 개발 과정을 크게 간소화합니다. 자동 리로딩과 핫 모듈 교체(HMR) 기능은 개발자의 생산성을 크게 향상시킵니다.

 Tree Shaking은 사용하지 않는 코드를 제거하여 번들 크기를 줄이는 중요한 최적화 기술입니다. ES6 모듈 시스템과 결합하여 효과적으로 동작합니다.

 성능 최적화를 위해 Webpack은 다양한 기법을 제공합니다. 캐싱을 통해 빌드 시간을 줄이고, 병렬 처리로 대규모 프로젝트의 빌드 속도를 개선할 수 있습니다. webpack-bundle-analyzer 같은 도구를 사용하면 번들의 구성을 시각적으로 분석하여 최적화 포인트를 찾을 수 있습니다.

 Webpack 외에도 Rollup, Parcel 등의 빌드 도구가 있습니다. Rollup은 작은 번들 크기와 ES 모듈에 대한 최적화로 라이브러리 개발에 적합하고, Parcel은 설정이 거의 필요 없어 빠른 프로토타이핑에 유용합니다. 하지만 Webpack은 대규모, 복잡한 애플리케이션에 가장 적합하며, 높은 유연성과 강력한 기능을 제공합니다.

 결론적으로, Webpack은 현대 웹 개발의 복잡성을 관리하는 데 필수적인 도구입니다. 다양한 리소스를 효율적으로 관리하고, 최적화된 번들을 생성하며, 개발 생산성을 향상시키는 Webpack의 기능은 대규모 웹 프로젝트에서 특히 중요합니다. 다만, 프로젝트의 규모와 요구사항에 따라 적절한 빌드 도구를 선택하는 것이 중요하며, Webpack의 강력한 기능을 효과적으로 활용하기 위해서는 지속적인 학습과 최적화 노력이 필요합니다.