- 다른 JS 파일에서 같은 이름의 전역 변수가 하나라도 사용될 경우 변수 간 충돌
- 클라이언트의 통신 환경에 따라 초기 웹 페이지 로딩이 길어짐
![]()
- 초기 로딩이 길어질수록 사용자 이탈률이 급증함
- 모던 웹으로 발전하면서 JavaScript 코드 양 증가 및 대규모 의존성 트리를 가진 웹 어플리케이션 등장
- 세분화된 모듈 파일이 폭팔적으로 증가
- 배포를 위해서 변수 스코프, 변수 충돌, 네트워크 요청 코스트 등의 문제를 고려해야 했음
- ES6에서 ESModule을 통해 모듈을 지원했으나 잘 동작하지 않는 브라우저도 존재했음
- 이에 번들링이라는 우회로서 번들러가 등장
빌드는 개발이 완료된 앱을 배포하기 위해 하나의 폴더(directory)로 구성하여 준비하는 작업을 말합니다.
번들링은 말 그대로 묶음의 개념입니다. 파일을 묶는 작업 그 자체를 말하며 파일은 의존적 관계에 있는 파일들(import, export) 그 자체 혹은 내부적으로 포함 되어 있는 모듈을 의미합니다. 정확히 말하면 모듈 간의 의존성 관계를 파악해 그룹화 하는 작업이라고 볼 수 있습니다.
module.exports = {
target: ["web", "es5"],
};
//기본 값
module.exports = {
...
entry: "./src/index.js",
};
//지정 값
module.exports = {
...
entry: "./src/script.js",
};
const path = require('path');
module.exports = {
...
output: {
path: path.resolve(__dirname, "docs"), // 절대 경로로 설정
filename: "app.bundle.js",
clean: true
},
};
//...
entry: {main: './script.js'},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].bundle.js', // entry에 설정한 이름에 따라 동적으로 생성
clean: true,
},
'[name].bundle.js'
같이 지정시 entry에 설정한 경로에 따라 작명된다. module.exports = {
...
module: {
rules: [
{
test: /\.css$/, // 필수속성
use: [MiniCssExtractPlugin.loader, "css-loader"], // 필수속성
exclude: /node_modules/,
},
],
},
};
test: 변환이 필요한 파일들을 식별하기 위한 속성
use: 변환을 수행하는데 사용되는 로더를 가리키는 속성
exclude: 바벨로 컴파일하지 않을 파일이나 폴더를 지정. (반대로 include 속성을 이용해 반드시 컴파일해야 할 파일이나 폴더 지정 가능)
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(),
],
};
module.exports = {
...
optimization: {
minimizer: [
new CssMinimizerPlugin(),
]
}
};
minimize : TerserPlugin 또는 optimization.minimize에 명시된 plugins로 bundle 파일을 최소화(=압축)시키는 작업 여부를 결정
minimizer : defualt minimizer을 커스텀된 TerserPlugin 인스턴스를 제공해서 재정의
module.exports = {
mode: 'none',
entry: '',
// ...
}
- none : 모드 설정 안함
- development : 개발 모드
- production : 배포 모드
// package.json
//...
"scripts": {
// 작동모드를 설정한다.
"bundle": "webpack --mode=development", // 개발자 모드
"production": "webpack --mode=production", // 배포 모드
"dev": "webpack serve", // webpack-dev-server를 실행한다.
},
// webpack.config.js
//...
target: ['web', 'es5'], // ES6를 지원하지 않는 브라우저에서 실행 가능하게 설정
devServer: { // dev 서버를 설정
port: 9000,
},
추가로 웹팩 번들링을 간단하게 해볼 수 있는 좋은 페이지를 공유한다
웹팩 핸드북으로 이동