React 번들링
번들링이란?
여러 제품이나 코드, 프로그램을 묶어서 패키지로 제공하는 행위, 웹 애플리케이션을 제공하기 위한 파일 묶음
번들링에는 다양한 방법이 있습니다. 대표적으로 Webpack, Vite 등이 있죠
Webpack
Webpack 이란 여러 개의 파일을 하나의 파일로 합쳐주는 모듈 번들러
모듈 번들러
- HTML, CSS, JS 등의 자원을 전부 각각의 모듈로 보고 이를 조합해 하나의 묶음으로 번들링하는 도구
- 변수들의 스코프 문제 해결
- 각 자원을 호출할 떄 생겨나는 네트워크 쪽의 코스트도 신경써야 하기에 등장
등장 배경
- 웹 앱의 빠른 로딩 속도와 높은 성능을 위해서 필요한 파일들을 묶어 제공
- 두개의 다른 js 파일에서 같은 변수를 사용할 경우 충돌
빌드와 번들링
- 빌드
- 개발이 완료된 앱을 배포하기 위해 하나의 폴더로 구성하여 준비하는 작업
- 번들링
- 파일을 묶는 작업, 모듈간의 의존성 관계를 파악해 그룹화하는 작업
Webpack 핵심개념
module.exports = {
target: ["web", "es5"],
entry: "./src/script.js",
output: {
path: path.resolve(__dirname, "docs"),
filename: "app.bundle.js",
clean: true
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
new MiniCssExtractPlugin(),
],
optimization: {
minimizer: [
new CssMinimizerPlugin(),
]
}
};
Target
웹팩은 다양한 환경과 target을 컴파일한다.
- target의 기본값은 web
- esX 를 넣으면 지정된 ECMAScript 버전으로 컴파일
Entry
개발자가 작성한 코드의 시작점
- 리액트의 경우 index.js 에서 HTML 엘리먼트 하나에 리액트 코드를 적용하는것 부터 시작
- Entry 속성은 Entry point 라고 한다.
- Webpack 은 Entry point 를 기반으로 직간접적 의존하는 다른 모듈과 라이브러리를 찾아낼 수 있음
Output
생성된 번들을 내보낼 위치와 이 파일의 이름을 지정하는 방법을 웹팩에 알려주는 역할
Loaders
loader를 사용하면 웹팩이 다른 유형의 파일을 처리하거나, 유효한 모듈로 변환해 애플리케이션에 사용하거나 디펜던시 그래프에 추가할 수 있다.
Plugins
번들을 최적화하거나 애셋을 관리하고, 또는 환경변수 주입 등 광범위한 작업을 수행한다.
- require 을 통해 플러그인 요청
Mode
Browser Compatibility
Vite
빠르고 만능, Esbuild와 Rollup의 장점을 합쳤다.
- ES 모듈 시스템을 사용하여 필요한 모듈만 로드하고, 핫모듈 리플레이스먼트 (HMR) 성능이 뛰어나 빠른 개발 서버 속도를 자랑
특징
- 빠른 개발 서버 : 모듈을 ESM 형식으로 제공해, 필요한 모듈만 즉시 로드
- HMR : 코드 변경 사항을 즉시 반영하여 브라우저 새로고침 없이도 UI 업데이트 가능
- 빠른 번들링 : Esbuild를 사용해 번들링 속도 향상
흔히 리액트 프로젝트를 만드는데 create-react-app 혹은 vite 로 생성하게 되는데 이 둘의 차이가 극명하다.
CRA vs Vite
항목 | Create React App (CRA) | Vite |
---|---|---|
번들링 도구 | Webpack | ESBuild 또는 Rollup |
빌드 속도 | 상대적으로 느림 | 매우 빠름 (ESBuild 기반) |
개발 서버 성능 | 느린 초기 빌드와 Hot Module Replacement(HMR) 속도 | 빠른 초기 빌드와 즉각적인 HMR |
설치 및 구성 | 자동화된 설정, 시작하기 쉬움 | 간단한 설정, 플러그인 기반으로 높은 확장성 제공 |
출력 번들 크기 | 기본적으로 최적화가 부족할 수 있음 | 작은 번들 크기, Tree Shaking 및 코드 분할 기본 제공 |
플러그인 지원 | 제한적 (Webpack 플러그인에 의존) | 풍부한 플러그인 생태계 |
ESM 지원 | 제한적 (CommonJS 중심) | 기본적으로 ES Module 지원 |
구성 유연성 | 제한적 (eject를 해야 커스텀 가능) | 유연한 설정 파일 (vite.config.js)로 커스텀 가능 |
로드 시간 | 번들 파일 크기에 따라 느릴 수 있음 | ESBuild 기반으로 빠른 로드 시간 |
SSR(서버 사이드 렌더링) | 직접 지원하지 않음 | 내장된 SSR 지원 |
사용 사례 | 기존 React 프로젝트에서 간편한 시작을 원할 때 | 빠른 개발 환경과 최적화된 번들링이 필요한 프로젝트 |
커뮤니티 | 더 많은 사용 사례와 기존 자료 | 빠르게 성장하는 커뮤니티 |
호환성 | 오래된 브라우저 및 라이브러리와 높은 호환성 | 최신 브라우저 중심, 구형 브라우저와의 호환성은 Polyfill 필요 |
결론
CRA는 설정 없이 바로 사용할 수 있으며, React의 공식 지원 도구이지만, 대규모 프로젝트에서는 빌드 속도가 느려질 수 있고, 설정을 변경하려면 eject 명령이 필요하는 단점이 있고,
Vite는 매우 빠른 개발 서버와 빌드 성능을 제공하며, 설정 파일을 통해 유연하게 설정을 변경할 수 있고, 다양한 모던 프레임워크를 지원하는 동시에 빠르게 성장하는 도구다.
둘 중의 프로젝트에 맞는 번들링 방식을 적용하면 된다.