기능별로 모듈화한 JS파일들을 묶어준다는 뜻.
여러 개 파일(html,css,js,jpg,pnp 등)을 하나로 묶는 모듈 번들러
대형 작업으로 인해 JS파일이 증가하면서 각 변수들의 스코프 문제, 각 자원(html,css,js 등)을 호출할 때 생기는 네트워크 쪽 코스트 문제.
이에 대한 대응방안으로 시작점(ex. React 앱의 index.js)으로부터 의존성을 가지는 모듈을 모두 추적해서 하나로 만드는 모듈 번들러가 등장.
웹 앱의 빠른 로딩 속도, 높은 성능
웹팩으로 같은 타입의 파일들을 한 대 묶어서 요청/응답 받으므로 네트워크 코스트 절감
Webpack loader를 사용하면 ES6의 문법들을 ES5로 번환해주는 babel-loader를 사용할 수 있음.
Vue의 경우 vue-loader를,
scss 경우는 css 파일로 변환해주는 scss-loader 등의 loader도 사용할 수 있기에 각자가 선택해 개발할 수 있음
Webpack4 버전 이상부터 Develoment, Production 두 가지 모드를 지원.
Production 모드의 경우, 코드 난독화, 압축, 최적화(Tree Shaking) 작업 지원
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(),
]
}
};
다양한 환경 컴파일 가능하게 함
시작점
//기본 값
entry: "./src/index.js",
//지정 값
entry: "./src/script.js",
번들 내보낼 위치path, 번들 파일명filename 지정방법을 웹팩에 알려줌
const path = require('path');
module.exports = {
...
output: {
path: path.resolve(__dirname, "docs"), // 절대 경로로 설정 해야 한다.
filename: "app.bundle.js",
clean: true // 번들링할때마다 dist폴더 정리하기
},
};
JavaScript, JSON이 아닌 파일을 불러오는 역할
웹팩은 기본적으로 JS, JSON파일만 이해한다.
그러나 Loaders 사용 시, 웹팩이 다른 유형 파일을 처리하거나, 유효한 모듈로 변환해 앱에 사용하거나 dependency 그래프에 추가할 수 있음
module.exports = {
...
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
exclude: /node_modules/,
},
],
},
};
번들 최적화, 에셋 관리, 환경변수 주입 등 광범위한 작업 수행 가능
require()
로 플러그인 먼저 요청plugins
배열에 사용하고자 하는 플러그인을 추가html-webpack-plugin
mini-css-extract-plugin
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(),
],
};
웹팩 버전4부터 선택항목에 따른 최적화 가능
minimize
minimizer
module.exports = {
...
optimization: {
minimizer: [
new CssMinimizerPlugin(),
]
}
};