빌드가 번들링을 포함하는 개념
빌드 시 번들링도 진행!
프론트엔드 개발자에게 번들링이란?
작성한 HTML, CSS , JS 그대로 전송하면 특별한 상황에 문제가 생길 수 있다.
webpack은 2022년 프론트엔드 애플리케이션 배포를 위해서 가장 많이 사용하는 번들러.
- 공식 문서도 변역이 되어 있다.
- https://webpack.kr/
모던 웹으포 발전하며 JS 코드의 양이 절대적으로 증가했고, 대규모 의존성 트리를 가지고 있는 대형 웹 애플리케이션이 등장하므로써 세분화된 모듈 파일이 폭발적으로 증가.
- 모듈 단위의 파일들을 호출 해 브라우저에 띄워야하는데, JS 언어의 특성에 때라 발생하기 쉬운 각 변수들의 스코프 문제를 해결해야 하고, 각 자원을 호출할 때에 생겨나는 네트워크 쪽의 코스트도 신경 써줘야 한다.
- 이런 복잡성에 대응하기 위해 하나의 시작점으로부터 의존성을 가지는 모듈을 모두 추적하여 하나의 결과물을 만들어 내는 모듈 번들러 등장

npm run build 실행 시 React build 작업이 진행되고, index.html 파일에 압축되어 배포에 최적화된 상태 제공무겁다 라고 표현하는데, 이것이 무거우면 무거울 수록 웹 페이지의 로딩 속도와 성능은 저하.Webpack이 없다면..
각 자원들을 일일히 서버에 요청해 얻어와야 하지만,Webpack이있다면 같은 타입의 파일들은 묶어서 요청 및 응답을 받을 수 있기 때문에 네트워크 코스트가 획기적으로 줄어듬.
- 웹 팩 공식 문서의 핵심 개념
- Entry
- Output
- Loaders
- Plugins
- Mode
- Browser Compatibility
webpack의 config 예시
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(),
]
}
};
N을 넣으면 지정된 ECMAScript 버전으로 컴파일// 브라우저와 동일한 환경에서 사용하기 위해 컴파일
// es5 버전으로 컴파일 하도록 지정
module.exports = {
target: ["web", "es5"],
};
//기본 값
module.exports = {
...
entry: "./src/index.js",
};
//지정 값
module.exports = {
...
entry: "./src/script.js",
};
// 기본 값은 ./src/index.js이지만
//webpack 설정에서 이런 식으로 Entry 속성을 설정하여 다른
//(또는 여러 entry point)를 지정할 수 있습니다.
Output 속성은 생성된 번들을 내보낼 위치와 이 파일의 이름을 지정하는 방법을 webpack에 알려주는 역할
const path = require('path');
module.exports = {
...
output: {
path: path.resolve(__dirname, "docs"), // 절대 경로로 설정을 해야 합니다.
filename: "app.bundle.js",
clean: true
},
};
// 기본 출력 파일의 경우에는 ./dist/main.js로 , 생성된 기타 파일의 경우에는 ./dist 폴더로 설정
// . 위의 예제에서는 output.filename과 output.path 속성을 사용하여 webpack에 번들의 이름과 내보낼 위치를 알려주고 있다.
// path 속성을 사용할 때는 path 모듈을 사용해야만 한다.
module.exports = {
...
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
exclude: /node_modules/,
},
],
},
};
상위 수준에서 loader는 webpack 설정에 몇 가지 속성을 가진다.
🤔 test와 use 속성은 필수 속성
Plugins를 사용하면 번들을 최적화하거나 에셋을 관리하고, 또는 환경변수 주입 등의 광범위한 작업을 수행할 수 있게 된다.
const webpack = require('webpack');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
...
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
new MiniCssExtractPlugin(),
],
};
// html-webpack-plugin 은 생성된 모든 번들을 자동으로 삽입하여 애플리케이션용 HTML 파일을 생성해줍니다.
// mini-css-extract-plugin은 CSS를 별도의 파일로 추출해 CSS를 포함하는 JS 파일 당 CSS 파일을 작성해주게끔 지원합니다.
module.exports = {
...
optimization: {
minimizer: [
new CssMinimizerPlugin(),
]
}
};
최적화하기 위해 다양한 옵션이 지원이 되는데, 대표적으로 minimize와 minimizer 등을 사용