๋ฒ๋ค๋ง์ด๋?
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ๋ฒ๋ค๋ง์ ์ฌ์ฉ์๊ฐ ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ ์ ์๋๋ก ์ฉ๋์ ์ค์ด๊ฑฐ๋ ํ์ผ์ ์ต์ํํ์ฌ ์ ์ ์๊ฒ ์ ๋ฌํ๋ ๊ณผ์ ์ด๋ค. => ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌํ๊ธฐ ์ํด ๋ฒ๋ค๋ง์ด ๊ผญ ํ์ํ๋ค.
Webpack
์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ํ๋์ ํ์ผ๋ก ํฉ์ณ์ฃผ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ*์ด๊ณ , ํ์ฌ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ์ํด์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฒ๋ค๋ฌ์ด๋ค.
* ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ HTML, CSS, JS ๋ฑ์ ์์์ ์ ๋ถ ๊ฐ๊ฐ์ ๋ชจ๋๋ก ๋ณด๊ณ ์ด๋ฅผ ์กฐํฉํด ํ๋์ ๋ฌถ์์ผ๋ก ๋ฒ๋ค๋งํ๋ ๋๊ตฌ์ด๋ค.
Webpack์์์ ๋ชจ๋์ JS์ ๋ชจ๋์๋ง ๊ตญํํ์ง ์๊ณ , HTML, CSS, .jpg, .png ๊ฐ์ ์ด๋ฏธ์ง ํ์ผ๋ ์ ๋ถ ํฌํจํ ํฌ๊ด์ ์ธ ๊ฐ๋ ์ด๋ค.
Webpack์ ์ฃผ์ ๊ตฌ์ฑ ์์์ธ ๋ก๋(loader)๋ฅผ ํตํด ๋ค์ํ ํ์ผ๋ ๋ฒ๋ค๋ง ๊ฐ๋ฅํ๋ค.
Webpack์ ํ์์ฑ
โฅ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅธ ๋ก๋ฉ ์๋์ ๋์ ์ฑ๋ฅ์ ์ํด์
์นํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ์ฝ๋์ ์์ด ๋ง์ผ๋ฉด ์น ํ์ด์ง์ ๋ก๋ฉ ์๋์ ์ฑ๋ฅ์ด ์ ํ๋๋๋ฐ, ์ด๋ ์ ์ ์ ์ดํ๋ฅ ์ด ์ง๊ฒฐ๋ ๋ฌธ์ ์ด๋ค.
๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ์์ฒญํ๋ ํ์ผ์ ์ซ์๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ค.
Webpack์ ์ฅ์
1. Webpack์ด ์์ผ๋ฉด ๊ฐ ์์๋ค์ ์ผ์ผํ ์๋ฒ์ ์์ฒญํด์ ์ป์ด์์ผ ํ์ง๋ง, Webpack์ด ์์ผ๋ฉด ๊ฐ์ ํ์ ์ ํ์ผ๋ค์ ๋ฌถ์ด์ ์์ฒญ ๋ฐ ์๋ต์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ์ฝ์คํธ๊ฐ ํ๊ธฐ์ ์ผ๋ก ์ค์ด๋ ๋ค.
2. Webpack loader๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ์ง ์๋ JavaScript ES6์ ๋ฌธ๋ฒ๋ค์ ES5๋ก ๋ฒํํด์ฃผ๋ babel-loader๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ์ต์ ์ ๊ฐ๋ฐ ๋ฐฉ์์ ์ ํํด์ ๊ฐ๋ฐํ ์ ์๊ฒ ์ง์ํ๋ค.
3. Production ๋ชจ๋๋ก ๋ฒ๋ค๋ง์ ์งํํ ๊ฒฝ์ฐ, ์ฝ๋ ๋๋ ํ, ์์ถ, ์ต์ ํ(Tree Shaking) ์์ ์ ์ง์ํ, ์์ฉํ ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์๊ฐ ๋๋ผ๊ธฐ์ ๋์ฑ ์พ์ ํ ํ๊ฒฝ ๋ฐ ๋ณด์๊น์ง ์ ๊ฒฝ์ฐ๋ฉด์ ๋ ธ์ถ์ํฌ ์ ์๋ค.
Webpack์ ํต์ฌ ๊ฐ๋
- Entry
- Output
- Loaders
- Plugins
- Browser Compatibility
webpack์ config ํ์ผ ์์
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
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
target์ ๊ธฐ๋ณธ๊ฐ์ web
โ๏ธ Entry(Entry point) = webpack์ด ๋ด๋ถ์ ๋ํ๋์ ๊ทธ๋ํ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํด์ผ ํ๋ ๋ชจ๋
๊ธฐ๋ณธ ๊ฐ์ ./src/index.js์ด์ง๋ง webpack ์ค์ ์์ Entry ์์ฑ์ ์ค์ ํ์ฌ ๋ค๋ฅธ (๋๋ ์ฌ๋ฌ entry point)๋ฅผ ์ง์ ํ ์ ์๋ค.
โ๏ธ Output(์ถ๋ ฅ) = ์์ฑ๋ ๋ฒ๋ค์ ๋ด๋ณด๋ผ ์์น์ ์ด ํ์ผ์ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ webpack์ ์๋ ค์ฃผ๋ ์ญํ
๊ธฐ๋ณธ ์ถ๋ ฅ ํ์ผ์ ๊ฒฝ์ฐ์๋ ./dist/main.js๋ก , ์์ฑ๋ ๊ธฐํ ํ์ผ์ ๊ฒฝ์ฐ์๋ ./dist ํด๋๋ก ์ค์ ๋๋ค.
path ์์ฑ์ ์ฌ์ฉํ ๋๋ path ๋ชจ๋์ ์ฌ์ฉํด์ผ ํ๊ณ , ์ ๋ ๊ฒฝ๋ก๋ก ์ค์ ํด์ผ ํ๋ค.
โ๏ธ Loader(๋ก๋) = Webpack์ด ๋ค๋ฅธ ์ ํ์ ํ์ผ์ ์ฒ๋ฆฌํ๊ฑฐ๋, ๊ทธ๋ค์ ์ ํจํ ๋ชจ๋๋ก ๋ณํํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ํ๋์ ๊ทธ๋ํ์ ์ถ๊ฐํ ์ ์๋ค.
- test: ๋ณํ์ด ํ์ํ ํ์ผ๋ค์ ์๋ณํ๊ธฐ ์ํ ํ์ ์์ฑ
- use: ๋ณํ์ ์ํํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ก๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ ์์ฑ
- exclude: ๋ฐ๋ฒจ๋ก ์ปดํ์ผํ์ง ์์ ํ์ผ์ด๋ ํด๋๋ฅผ ์ง์ .
- include : ๋ฐ๋์ ์ปดํ์ผํด์ผ ํ ํ์ผ์ด๋ ํด๋ ์ง์ .
์์ฑ์ ๋ฃ์ด ๊ท์น์ ์ ํ๊ธฐ ์ํด์๋ module.rules ์๋์ ์ ์ํด์ผ ํ๋ค.
โ๏ธ Plugins(ํ๋ฌ๊ทธ์ธ) = ๋ฒ๋ค์ ์ต์ ํํ๊ฑฐ๋ ์์ ์ ๊ด๋ฆฌํ๊ณ , ๋๋ ํ๊ฒฝ๋ณ์ ์ฃผ์ ๋ฑ์ ๊ด๋ฒ์ํ ์์ ์ ์ํํ ์ ์๊ฒ ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ require()๋ฅผ ํตํด ํ๋ฌ๊ทธ์ธ์ ๋จผ์ ์์ฒญํด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ํ๋ฌ๊ทธ์ธ์ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ๋๋ก ์ค์ ํ ์ ์๊ธฐ ๋๋ฌธ๋ฐ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ํธ์ถํด์ ํ๋ฌ๊ทธ์ธ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
- html-webpack-plugin ์ ์์ฑ๋ ๋ชจ๋ ๋ฒ๋ค์ ์๋์ผ๋ก ์ฝ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ HTML ํ์ผ์ ์์ฑํด์ค๋ค.
- mini-css-extract-plugin์ CSS๋ฅผ ๋ณ๋์ ํ์ผ๋ก ์ถ์ถํด CSS๋ฅผ ํฌํจํ๋ JS ํ์ผ ๋น CSS ํ์ผ์ ์์ฑํด์ฃผ๊ฒ๋ ์ง์ํ๋ค.
โ๏ธ Optimization(์ต์ ํ)
- minimize : TerserPlugin ๋๋ optimization.minimize์ ๋ช ์๋ plugins๋ก bundle ํ์ผ์ ์ต์ํ(=์์ถ)์ํค๋ ์์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์
- minimizer : defualt minimizer์ ์ปค์คํ ๋ TerserPlugin ์ธ์คํด์ค๋ฅผ ์ ๊ณตํด์ ์ฌ์ ์
โ๏ธ ํ ๋์ ์ ๋ฆฌ
entry ํ์ผ์ด ํ์ํ ๋ชจ๋ ๊ฒ์
bundler์ธ webpack์ด ๋ชจ์์ ๋ฒ๋ค๋ง์ ๊ฒฐ๊ณผ๋ฌผ์
output ๊ฒฝ๋ก๋ก ์ฐ์ถํ๋ค.
loader JS, JSON์ด ์๋ ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
plugin ๊ทธ ์ธ ๋ค์ํ ์์ ์ ํ ์ ์๊ฒ ํ๋ค. (html-webpack-plugin์ ๋ฒ๋ค๋ง ๊ณผ์ ์ค html ํ์ผ์ ์์ ์ด ์ํ๋ ํํ๋ก ๊ฐ๊ณตํ์ฌ ๋ฒ๋ค์ ํฌํจํ ์ ์๊ฒ ๋๋๋ค.)
์นํฉ์ ์ด์ฉํ์ฌ ๋น๋ํ๋ ๋ฐฉ๋ฒ
1. npm init ํ๊ธฐ
npm init -y
2. ์๋์ผ๋ก ์๋ ๋ด์ฉ์ package.json ํ์ผ ์์ฑ๋จ
{
"name": "fe-sprint-webpack-tutorial",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": ""
}
3. ์นํฉ ์ค์นํ๊ธฐ
npm install -D webpack webpack-cli
4. ์นํฉ config ํ์ผ ์์ฑํ๊ธฐ
webpack.config.js ํ์ผ์ entry์ output ์ ๋ณด๋ฅผ ์๋์ ๊ฐ์ด ์ ๋๋ค.
// webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'), // './dist'์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฆฌํดํฉ๋๋ค.
filename: 'app.bundle.js',
},
};
5. ๋ฒ๋ค๋งํ๊ธฐ
npx webpack
dist/app.bundle.js ํ์ผ์ ์๋์ ๋น์ทํ ์ด์ํ ์ฝ๋๋ฅผ ๋ณด๊ณ ์์ผ๋ฉด ์ฑ๊ณต!!!
webpack์ ์ฌ์ฉ์๊ฐ ํ๋ก ํธ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ์ ๋ฌ๋ฐ์ ์ ์๊ฒ ์ฝ๋๋ฅผ ์ต์ํ(minifiy)ํ๋ค. ์ด๋ ๊ฒ minifyํ ์ฝ๋๋ ์ ์์ ์ผ๋ก ํธ์งํ๊ธฐ ์ด๋ ต๋ค.
6. npm run build ์ค์ ํ๊ธฐ
๋ ํธ๋ฆฌํ๊ฒ ๊ฐ๋ฐํ์!!
์ด์ npm run build ์คํฌ๋ฆฝํธ๋ก ์ธ์ ๋ ๋ฒ๋ค๋ง์ ํ ์ ์๋ค.
{
"name": "fe-sprint-webpack-tutorial",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "webpack", // here
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"devDependencies": {
"webpack": "^5.73.0",
"webpack-cli": "^4.10.0"
}
}
7. ๋ง์ฝ js ํ์ผ์ ์์ ํ๋ค๋ฉด, dist์ app.bundle.js์ ์ ์ฉ๋์ง ์์๊ธฐ ๋๋ฌธ์, ๋ค์ npm run build ๋ช ๋ น์ด๋ก ๋ฒ๋ค๋ง์ ์งํํด์ผํ๋ค.
8. css ํ์ผ ์ถ๊ฐํ๋ค๋ฉด, ์ ์ ํ ๋ก๋๊ฐ ํ์ํ๋ค.
style-loader, css-loader ๋ก๋ ์ค์นํ๊ณ webpack.config.js ํ์ผ ์กฐ์ ํ๊ธฐ
npm i -D css-loader style-loader
// webpack.config.js
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "app.bundle.js",
},
module: {
rules: [
{
// ํ์ผ๋ช
์ด .css๋ก ๋๋๋ ๋ชจ๋ ํ์ผ์ ์ ์ฉ
test: /\.css$/,
// ๋ฐฐ์ด ๋ง์ง๋ง ์์๋ถํฐ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์์ผ๋ก ์ ์ฉ
// ๋จผ์ css-loader๊ฐ ์ ์ฉ๋๊ณ , styled-loader๊ฐ ์ ์ฉ๋์ด์ผ ํ๋ค.
// ์์ ์ฃผ์!
use: ["style-loader", "css-loader"],
// loader๊ฐ node_modules ์์ ์๋ ๋ด์ฉ๋ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
// node_modules๋ ์ ์ธํด์ผ ํฉ๋๋ค
exclude: /node_modules/,
},
],
},
};
9. npm run build ๋ช ๋ น์ ํตํด ๋ฒ๋ค๋ง์ด ์ ๋์๋์ง ํ์ธํ๊ธฐ
VS Code์ Format Document ๊ธฐ๋ฅ(alt + shift + F)๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๋ณผ ์ ์๋ค.
dist/index.html ํ์ผ์ ์ด์ด๋ณด๋ฉด style ์์๊ฐ ์์ฑ๋๊ณ ์์ฑํ CSS๊ฐ ๋ด๊ฒจ์๋ ๋ชจ์ต์ ํ์ธํ์ค ์ ์๋ค.
์ด์ <link rel="stylesheet" href="style.css"> ์ฝ๋๋ ์ญ์ ํด๋ ๋๋ค.
10. HTML๋ ๋ฒ๋ค์ ํฌํจํ๋ ์์ ํ๊ธฐ / ๋ฐ๋ก ์์ฑํด์คฌ๋ dist/index.html์ src ๋๋ ํฐ๋ฆฌ๋ก ์ฎ๊ธฐ๊ธฐ
11. html-webpack-plugin ์ ์ค์นํ๊ณ , webpack.config.js ํ์ผ์ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ ์ฉํ๊ธฐ. ๊ทธ ํ npm run build ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ธฐ
npm i -D html-webpack-plugin
const path = require("path");
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "app.bundle.js",
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
exclude: /node_modules/,
},
],
},
plugins: [new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html")
})]
};
src/index.html ํ์ผ์ ๋ฒ๋ค๋งํ์ฌ dist/index.html ํ์ผ์ ์๋ก ์์ฑํ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ซ์นํฉ์ ์ด์ฉํด์ ๋ฒ๋ค๋ง ํ ํ github page ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๋ฐฐํฌํ ํ์ด์ง
https://hellohailie.github.io/background_color_change_app/
์ฐธ๊ณ )
๊นํ ๋ฐฐํฌ