📌 번들
: 사용자에게 웹 애플리케이션을 제공하기 위한 파일 묶음
📌 번들링의 필요성
1. 변수 간 충돌에 대처할 수 있다.
2. 코드를 최적화 할 수 있다.
3. 배포 코드를 읽기 어렵게 하여 개발을 할 줄 아는 사용자가 애플리케이션을 임의로 조작하지 못하게 한다.
📌 webpack
: 프론트엔드 애플리케이션 배포를 위해 가장 많이 사용되는 모듈 번들러
모듈 번들러
: HTML, CSS, Javascript 등의 자원을 전부 각각의 모듈로 보고 이를 조합해 하나의 묶음으로 번들링(빌드)하는 도구
모듈 번들러가 생긴 이유
모던 웹으로 발전하며 Javascript 코드의 양이 증가했고,
대규모 의존성 트리를 가지고 있는 대형 웹 애플리케이션이 등장하므로써 세분화된 모듈 파일도 증가했다.
그러면서 Javascript 각 변수들의 스코프 문제를 해결해야 하고,
각 자원을 호출할 때 생기는 네트워크의 코스트도 신경써야 했다.
이런 복잡함을 해결하기 위해 하나의 시작점으로부터 의존성을 가지는 모듈을 모두 추적하여 하나의 결과물을 만들어내는 모듈 번들러가 등장했다.
Webpack 장점
네트워크 코스트 감소
-> webpack❌ 각 자원을 일일히 서버에 요청해 얻어옴
-> webpack⭕ 같은 타입의 파일들은 묶어서 요청 및 응답을 받을 수 있음
개발자가 원하는 개발 방식 선택 가능
webpack loader를 사용하여 자동 변환 기능들을 사용할 수 있음
코드 난독화, 압축, 최적화 작업 지원
-> Webpack4 버전 이상부터 Production 모드로 번들링 진행할 경우 코드 난독화, 압축, 최적화 작업이 가능함
Webpack에서의 모듈
Webpack에서의 모듈은 Javascript의 모듈 뿐만 아니라 HTML, CSS, .jpg, .png 등과 같은 이미지 파일도 포함된 포괄적인 개념이다.
빌드와 번들링
빌드 : 개발이 완료된 앱을 배포하기 위해 하나의 폴더로 구성하여 준비하는 작업
번들링 : 파일을 묶는 작업 그 자체를 의미. 여기서의 파일은 의존적 관계에 있는 파일들(import, export) 그 자체, 혹은 내부적으로 포함되어 있는 모듈을 의미함. 요약하면 모듈 간의 의존성 관계를 파악해 그룹화 하는 작업.
웹팩의 핵심 개념
webpack.config.js 파일 예시
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
Webpack은 다양한 환경과 target을 컴파일한다.
기본 값 : web
module.exports = {
target: ["web", "es5"],
};
Entry
코드의 시작점
Entry 속성은 Entry point라고도 하며, webpack이 내부의 디펜던시 그래프를 생성하기 위해 사용해야하는 모듈이다.
기본 값 : ./src/index.js
//기본 값
module.exports = {
...
entry: "./src/index.js",
};
//지정 값
module.exports = {
...
entry: "./src/script.js",
};
Output
생성된 번들을 내보낼 위치와 이 파일의 이름을 지정하는 방법을 webpack에 알려주는 역할
const path = require('path');
module.exports = {
...
output: {
path: path.resolve(__dirname, "docs"), // 절대 경로로 설정을 해야 합니다.
filename: "app.bundle.js",
clean: true
},
};
output.filename
: 번들의 이름
output.path
: 내보낼 위치
output.clean
: 번들링 할 때마다 /dist 디렉터리 정리할 지 유무
Loader
Webpack은 기본적으로 Javascript와 JSAON 파일만 이해하기 때문에 loader를 사용하여 Webpack이 다른 유형의 파일을 처리하거나, 그들을 유효한 파일로 변환해 애플리케이션에 사용하거나 디펜던시 그래프에 추가할 수 있다.
module.exports = {
...
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
exclude: /node_modules/,
},
],
},
};
test (필수 속성)
: 변환이 필요한 파일들을 식별하기 위한 속성
use (필수 속성)
: 변환을 수행하는데 사용되는 로더를 가리키는 속성
exclude
: 바벨로 컴파일하지 않을 파일이나 폴더를 지정
include
: 반드시 컴파일해야 할 파일이나 폴더 지정
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(),
],
};
사용 전에 require()
를 통해 플러그인 먼저 요청 후 plugins 배열에 추가한다.
대부분의 플러그인은 사용자가 옵션을 통해 지정할 수 있다.
다른목적으로 플러그인을 여러 번 사용할 수 있기 때문에 new 연산자를 사용해 호출하여 플러그인의 인스턴스를 만든다.
Optimization(최적화)
Webpack 버전4부터는 선택한 항목에 따라 최적화를 진행한다.
module.exports = {
...
optimization: {
minimizer: [
new CssMinimizerPlugin(),
]
}
};
최적화하기 위해 다양한 옵션이 지원되는데, 대표적으로 minimize
와 minimizer
등을 사용한다.
위 예제에서는 mini-css-extract-plugin 에 관련된 번들을 최소화하도록 지시하고 있다.
minimize
:TerserPlugin
또는 optimization.minimize
에 명시된plugins로 bundle 파일을 최소화(=압축)시키는 작업 여부를 결정
minimizer
:default minimizer
를 커스텀된 TerserPlugin
인스턴스를 제공해서 재정의
'Codestates SEB FE 42기 > 정리노트' 카테고리의 다른 글
S4 unit10 | CI/CD란? Github Action으로 자동 파이프라인 구축 (0) | 2023.02.06 |
---|---|
S4 unit8 | Lighthouse로 최적화 하기 (0) | 2023.02.01 |
S3 unit6 | [네트워크] IP/IP Packet (0) | 2023.01.11 |
S3 unit6 | [네트워크] 회선교환 방식, 패킷교환 방식 (0) | 2023.01.11 |
S3 unit5 | [사용자 친화 웹] 웹 표준, semantic HTML, 자주 틀리는 마크업 (0) | 2023.01.04 |