최신 프런트엔드 프레임워크에서 가장 많이 사용되는 모듈 번들러이다.
웹 어플리케이션을 구성하는 자원(HTML, CSS, JS, Image 등)을 모두 각각의 모듈로 보고 이를 조합해서 병합된 하나의 결과물을 만드는 도구를 의미
프로그래밍 관점에서 특정 기능을 갖는 작은 코드 단위를 의미
function sum(a, b) { //모듈
return a + b;
}
function substract(a, b) { //모듈
return a - b;
}
const pi = 3.14;
export { sum, substract, pi }
하나의 파일로 병합 및 압축해주는 동작
❗️번들링 = 빌드 = 변환
npm init -y
npm install webpack webpack-cli --save-dev
install → i(축약) : 설치(install)
--save-dev → -D(축약) : 개발용 설치(devDependencies)
webpack.config.js 파일을 생성한다.
웹팩 명령어를 실행했을 때 해당 파일에 있는 설정들을 자동으로 조정한다.
webpack.config.js
const path = require('path')
module.exports = {
entry : './src/index.js',
output :{
filename : 'main.js',
path : path.resolve(__dirname, "dist")//폴더를 의미
}
}
path모듈
- 노드에서 제공하는 것이다.
- 파일이나 폴더의 경로 작업을 위한 루트를 제공한다.
entry
- 파일을 시작해서 사용하는 모듈을 모두 파악한다.
output
- 최종 파일을 내보내는 옵션이다.
package.json
{
"name": "webpack-study",
"version": "1.0.0",
"description": "프론트엔드 개발을 위한 웹팩 설정",
"main": "index.js",
"scripts": {
"build" : "webpack",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1"
}
}
scripts 객체에 "build" : "webpack"
을 추가한다.
그리고 터미널에 아래 명령어를 작성해준다.
npm run build
그러면 dist 폴더가 생생된다.
결론 : 두개의 파일을 합쳐서 하나의 파일로 만들어주는게 웹팩의 역할이다.
dist 폴더를 배포할 때 사용하게 될 것이다. 하지만 위 사진에서 dist폴더 안에 js파일 밖에 없다. 즉, index.html파일도 함께 들어 있어야 된다. 그래야 dist 폴더만 배포해도 완벽해 지는 것이다.
npm i html-webpack-plugin
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry : "./src/index.js",
output : {
filename : "main.js",
path : path.resolve(__dirname, "dist"),
},
plugins : [new HtmlWebpackPlugin()],
}
index.html 파일 생성된다.
❗️하지만, 원래 생성한 html과 기존 html이 다르다. 그렇기 때문에 다시 webpack.config.js 리셋팅 해야 된다.
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry : "./src/index.js",
output : {
filename : "main.js",
path : path.resolve(__dirname, "dist"),
},
plugins : [new HtmlWebpackPlugin({}
template : './index.html' //추가
)],
}
template
기존에 만들어 두었던 파일을 이용해서 html을 만들어 준다. 그러면 기존 html과 동일해 진다.
개발 할 때 서버를 쉽게 띄어주는 역할을 한다.
npm i webpack-dev-server -D
devServer : {
static : {
directory : path.resolve(__dirname,"dist")
},
port : 8080
}
webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require("html-webpack-plugin");
//노드에서 제공하는 path 모듈을 활용한다.
//파일이나 폴더의 경로 작업을 위한 루트를 제공한다.
module.exports = {
entry : './src/index.js', //entry시작 파일 요기서 시작해서 사용하는 모듈들을 모두 파악
output :{
//output 만들어지는 최종 파일을 내보내는 옵션이다.
filename : 'main.js',
path : path.resolve(__dirname, "dist")//폴더를 의미
},
plugins : [new HtmlWebpackPlugin({
template : './index.html' //옵션 template : 기존에 만들어 두었던 파일을 이용해서 html을 만들어 준다.
})],
devServer : {
static : {
directory : path.resolve(__dirname,"dist")
},
port : 8080,
}
}
"start" : "webpack serve --open
추가
{
"name": "webpack-study",
"version": "1.0.0",
"description": "프론트엔드 개발을 위한 웹팩 설정",
"main": "index.js",
"scripts": {
"start" : "webpack serve --open", //추가
"build": "webpack",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
},
"dependencies": {
"html-webpack-plugin": "^5.5.0"
}
}
npm start
❗️에러가 발생한다.
원인
모드 옵션이 없어서 프로덕션으로 나타났다는 문제점이다.
webpack-dev-server는 이름 그대로 개발모드에서 사용가능
해결방법
mode를 development 명시해야 된다.
start 속성에다 --mode=development
추가
{
"name": "webpack-study",
"version": "1.0.0",
"description": "프론트엔드 개발을 위한 웹팩 설정",
"main": "index.js",
"scripts": {
"start" : "webpack serve --open --mode=development",
"build": "webpack",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
},
"dependencies": {
"html-webpack-plugin": "^5.5.0"
}
}
수정해주면 정상적으로 8080포트에서 작동한다.
❗️start, test는 실행할 때 run을 제외시키고 작성해도 된다.
build속성에 --mode=production
추가
{
"name": "webpack-study",
"version": "1.0.0",
"description": "프론트엔드 개발을 위한 웹팩 설정",
"main": "index.js",
"scripts": {
"start" : "webpack serve --open --mode=development",
"build": "webpack --mode=production",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
},
"dependencies": {
"html-webpack-plugin": "^5.5.0"
}
}
npm i -D style-loader css-loader
css-loader는 css파일을 읽어준다.
style-loader는 css를 스타일 태그로 만들어 주어 헤드 내부에 넣어 준다.
html은 plugins은 css는 module로 작성해야 한다.
use에 들어가는 배열은 뒤에서 부터 적용된다. 그래서 css-loader로 읽고 style-loader로 넣어준다.
const path = require('path');
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry : './src/index.js',
output : {
filename : 'main.js',
path : path.resolve(__dirname, "dist")
},
module : {
rules : [
{
test : /\.css$/,
use : ["style-loader","css-loader"]
}
]
},
plugins : [new HtmlWebpackPlugin({
})],
devServer : {
static : {
directory : path.resolve(__dirname, "dist")
},
port : 8080
}
}
CSS external 방식
npm i -D mini-css-extract-plugin
new MiniCssExtractPlugin({filename : 'common.css'})
추가
const path = require('path');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
entry : './src/index.js',
output :{
filename : 'main.js',
path : path.resolve(__dirname, "dist")
},
module : {
rules : [
{
test : /\.css$/,
use : [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
plugins : [
new HtmlWebpackPlugin({
template : './index.html'
}),
new MiniCssExtractPlugin({
filename : 'common.css'
}) // 추가
],
devServer : {
static : {
directory : path.resolve(__dirname, "dist")
},
port : 8080,
}
}
결과 : external link가 생성된다.
npm run build
common.css 생성
npm i -D file-loader
import { hello, add } from "./util"
import "./style.css";
import "./header.css";
import logo from "./images/naver.jpg"
const text = hello("<h1>나는 코딩앙마!!!</h1>");
const num = add(1, 2);
const img = `<img src="${logo}" alt="코딩앙마" />`;
document.getElementById('root').innerHTML = img + text + num;
❗️이 파일을 처리할 수 있는 로더가 없다는 에러 메시지이다.
webpack.config.js
module : {
rules : [
{
test : /\.jpg$/,
use : ["file-loader"],
} // 추가
]
}