일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JS
- 코딩테스트
- 자바
- 자바문제풀이
- webpack
- @media
- 변수
- node
- frontend
- 코드업
- react
- cleancode
- 그럼에도불구하고
- java
- 그럼에도 불구하고
- JavaScript
- CSS
- github
- coding
- media query
- node.js
- 반응형 페이지
- Servlet
- HTML
- 프론트엔드
- git
- max-width
- redux
- TypeScript
- react-router-dom
- Today
- Total
그럼에도 불구하고
[Webpack] 내 프로젝트에 적용시킨 webpack.config.js 공부 본문
시작!
목차
📌 webpack.config.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | var path = require("path"); var webpack = require("webpack"); var HtmlWebpackPlugin = require("html-webpack-plugin"); var CopyWebpackPlugin = require("copy-webpack-plugin"); module.exports = { mode: "production", entry: { main: "./js/index/app.js", additional: [ "./js/index/choiceTip.js", "./js/index/clothesSlider.js", "./js/index/getYoutube.js", "./js/index/scroll.js", ], myClothes: [ "./js/myClothes/app.js", "./js/myClothes/colorSet.js", "./js/myClothes/scroll.js", "./js/myClothes/uploadImage.js", ], }, output: { filename: "[name].bundle.js", path: path.resolve(__dirname, "dist"), clean: true, }, module: { rules: [ { test: /\.js$/, exclude: /(node_modules|pages)/, use: { loader: "babel-loader", }, }, { test: /\.css$/, use: [{ loader: "style-loader" }, { loader: "css-loader" }], }, { test: /\.scss$/, use: [ { loader: "style-loader" }, { loader: "css-loader" }, { loader: "sass-loader" }, ], }, { test: /\.(png|jpe?g|gif)$/, loader: "file-loader", options: { name: "[name].[ext]", outputPath: "./images", }, }, ], }, plugins: [ new HtmlWebpackPlugin({ filename: "index.html", template: "./index.html", excludeChunks: ["myClothes"], // myClothes.js를 index.html에 적용하지 않음 }), new HtmlWebpackPlugin({ filename: "views/myClothes.html", template: "./views/myClothes.html", chunks: ["myClothes"], // myClothes.js와 연결 }), new CopyWebpackPlugin({ patterns: [ { from: "css", to: "css" }, { from: "scss", to: "scss" }, { from: "images", to: "images"}, { from: "images", to: "images"}, { from: "font", to: "font"}, ], }), ], }; | cs |
⭐️ 1. 모드 설정
mode 매개 변수는 다음 3가지 값 중 하나를 사용할 수 있다.
mode: "production",
mode 값 | 설명 |
development | 개발 모드 |
production | 배포 모드 (기본 값) |
none | 기본 최적화 옵션 설정 해제 |
"production" 모드는 Webpack 모듈 번들링 과정에서 자체적으로 코드를 최적화하여 용량을 줄일 수 있다.
⭐️ 2. 엔트리 설정
entry : 애플리케이션의 진입점 (entry point)를 설정한다. 나는 "main", "additional", "myClothes" 세 가지 엔트리 포인트를 정의하였다. 이는 각각에 해당하는 JavaScript 파일이 엔트리로 사용된다.
entry: {
main: "./js/index/app.js",
additional: [
"./js/index/choiceTip.js",
"./js/index/clothesSlider.js",
"./js/index/getYoutube.js",
"./js/index/scroll.js",
],
myClothes: [
"./js/myClothes/app.js",
"./js/myClothes/colorSet.js",
"./js/myClothes/scroll.js",
"./js/myClothes/uploadImage.js",
],
},
⭐️ 3. 출력 설정
output : 웹팩이 생성하는 번들 파일의 이름과 경로를 설정한다. 번들 파일의 이름은 [name].bundle.js 형식으로 설정하였고 path는 dist 폴더로 설정하였다. clean을 true로 설정함으로써 빌드 시 이전의 번들 파일을 자동으로 제거한다.
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "dist"),
clean: true,
},
⭐️ 4. 모듈 설정
module : 소스 코드에서 사용되는 모듈들의 처리 방법을 설정한다.
rules : 각각의 규칙을 정의하여 특정 유형의 파일들을 처리한다.
여기서는 JavaScript 파일을 'babel-loader'를 사용하여 변환하고, CSS 파일은 style-loader와 css-loader를 사용하여 로드하며, SCSS 파일은 'sass-loader'를 사용하여 처리한다.
마지막으로 이미지 파일은 'file-loader'를 사용하여 로드하고, 지정된 경로에 복사한다.
📌 loader 설치 명령어
npm install -D css-loader
npm install -D sass-loader
npm install -D file-loader
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|pages)/,
use: {
loader: "babel-loader",
},
},
{
test: /\.css$/,
use: [{ loader: "style-loader" }, { loader: "css-loader" }],
},
{
test: /\.scss$/,
use: [
{ loader: "style-loader" },
{ loader: "css-loader" },
{ loader: "sass-loader" },
],
},
{
test: /\.(png|jpe?g|gif)$/,
loader: "file-loader",
options: {
name: "[name].[ext]",
outputPath: "./images",
},
},
],
},
⭐️ 5. 플러그인 설정
plugins: 웹팩의 플러그인들을 설정한다. 플러그인은 번들링 과정에서 추가적인 작업을 수행하거나 기능을 확장하는 데 사용한다.
나는 HtmlWebpackPlugin을 사용하여 HTML 파일을 생성하고, CopyWebpackPlugin을 사용하여 정적 파일(이미지, CSS, SCSS, 폰트 등)을 복사하였다.
var HtmlWebpackPlugin = require("html-webpack-plugin");
var CopyWebpackPlugin = require("copy-webpack-plugin");
plugins: [
new HtmlWebpackPlugin({
filename: "index.html",
template: "./index.html",
excludeChunks: ["myClothes"], // myClothes.js를 index.html에 적용하지 않음
}),
new HtmlWebpackPlugin({
filename: "views/myClothes.html",
template: "./views/myClothes.html",
chunks: ["myClothes"], // myClothes.js와 연결
}),
new CopyWebpackPlugin({
patterns: [
{ from: "css", to: "css" },
{ from: "scss", to: "scss" },
{ from: "images", to: "images"},
{ from: "images", to: "images"},
{ from: "font", to: "font"},
],
}),
],
💡 HtmlWebpackPlugin
filename : 내가 설정할 html 파일의 이름
template: 설치될 html 파일의 경로
chunks: 내가 적용시킬 엔트리 설정
excludeChunks: 제외시킬 엔트리 설정
💡 CopyWebpackPlugin
from : 기존 프로젝트 내 파일 or 폴더
to : 내가 지정한 경로 ( 나는 dist ) 내에 만들어질 파일 or 폴더 이름
'이모저모 > Bundler' 카테고리의 다른 글
[Bundler] 그래서 Webpack 있는데 Vite 왜 쓴다고? ( 번들러부터 익히기 ) (0) | 2023.10.21 |
---|---|
[Vite] Vite에서 Proxy 설정하기 with Cross origin & CORS Error (0) | 2023.09.30 |
[Vite] Vite란? ( 사용하면 리액트 10배 빨라짐 ) (2) | 2023.06.27 |
[Webpack] 소스 맵(Source Map)이란? (0) | 2023.05.20 |
[Webpack] Webpack Dev Server란? (0) | 2023.05.20 |