SOPT 37기 WEB 파트 호기심스 스터디 내용 정리 아티클입니다
리액트에서 번들러(Bundler)는 애플리케이션 개발에 필수적인 도구로,
최종 사용자에게 배포하기 위해 프로젝트의 모든 소스 코드와 에셋을 효율적으로 하나 또는 몇 개의 파일로 묶어주는 역할을 합니다.
그럼 번들러의 주요 역할에 대해 알아보곘습니다.
의존성 해결 및 모듈 병합 (Bundling)
역할: 리액트 프로젝트는 여러 개의 JavaScript, CSS, 이미지, 그리고 node_modules의 라이브러리 등 수많은 모듈로 구성되며 번들러는 이 파일들을 추적하여 모든 의존성을 파악합니다.
기능: 분리된 모듈들을 브라우저가 로드할 수 있는 단일 파일(번들)로 합칩니다. 이는 브라우저가 수많은 개별 HTTP 요청을 보내는 대신, 몇 개의 요청만으로 모든 코드를 로드하게 하여 초기 로딩 속도를 크게 개선합니다.
코드 변환
역할: 최신 리액트 코드, JSX (JavaScript XML) 문법, ES6+ 문법, TypeScript 등을 사용합니다.
하지만 모든 브라우저가 이 최신 문법을 완벽하게 지원하지 않을 수 있습니다.
기능: 번들러는 최신 문법으로 작성된 코드를 모든 브라우저에서 호환 가능한 표준 JavaScript 형태로 변환해줍니다.
🚚 번들러를 쉽게 말하면 집을 이사하기 위해 이삿짐을 싸는데 짐들에는
컴포넌트 파일 (JavaScript/JSX) 짐,스타일 파일 (CSS/Sass) 짐,이미지/폰트 짐등이 있습니다.
그래서 이삿짐 센터에서 이 짐들을 새로운 집으로 옮기기 위해 하나 또는 여러개의 박스에 짐들을 담아 정리하는 과정(번들링)을 가지며 상자의 여유공간 낭비를 최소화하기 위해 최대한 촘촘하게 박스를 채웁니다(최적화 및 압축)
그리고 오래된 트럭에도 물건을 담을 수 있도록 짐들을 더 안전하게 변환(트랜스파일링)해줍니다.

Webpack은 오랫동안 JavaScript 생태계에서 가장 널리 사용되어 온 번들러입니다.
Webpack은 프로젝트의 모든 자산(JavaScript, CSS, 이미지 등)을 모듈로 취급하고,
이 모듈들의 의존성 그래프를 생성하여 브라우저가 로드할 수 있는 최적의 번들 파일로 묶어주는 도구입니다.
Entry
module.exports = {
entry: {
login: './src/LoginView.js',
main: './src/MainView.js'
}
}
Output
module.exports = {
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, './dist')
}
}
Loader
Plugin
esbuild는 최근 몇 년간 등장한 번들러로, Webpack의 느린 처리 속도 문제를 해결하기 위해 설계되었습니다.
빠른 속도

간결한 설계와 통합
기능 내장: 핵심 기능(트랜스파일링, 번들링, 축소화 등)을 자체적으로 내장하고 있어, 별도의 Babel 설정 파일이나 복잡한 webpack.config.js가 필요 없습니다.
쉬운 설정: 대부분의 기능을 커맨드라인 옵션이나 간단한 API로 설정할 수 있어, 빌드 환경 구성의 복잡성을 크게 낮춥니다.

Vite는 기존 번들러(Webpack, Rollup, Parcel 등)가 가진 근본적인 성능 문제를 해결하고, 브라우저의 새로운 기술을 활용하여 개발자의 생산성과 만족도를 극적으로 향상시키기 위해 등장했습니다.
긴 서버 구동 시간: 콜드 스타트 방식으로 개발 서버를 구동할 때, 모든 소스 코드에 대해 크롤링 및 빌드 작업을 마쳐야만 페이지를 제공할 수 있었습니다.
느린 소스 코드 갱신 시간: 소스 코드를 업데이트할 때마다 전체 또는 영향받는 파일들을 다시 번들링해야 했으며,
애플리케이션이 커질수록 갱신 시간이 선형적으로 증가했습니다. 이로 인해 HMR조차도 명확한 해결책이 되지 못했습니다.
그래서 vite는 애플리케이션의 모듈을 디펜던시와 소스 코드 두 가지 카테고리로 나누어 개발 서버의 시작 시간을 개선하였습니다.



Webpack (CRA) 총 빌드 시간: 3.082초 (3082ms)

Vite 빌드 시간 : 0.608초 (608ms)