์๋ ์นํฉ(WebPack)์ด ๋ญ์ผ?
๊ณผ์ ์์ Webpack์ด๋ Parcel๊ฐ์ ๋ฒ๋ค๋ฌ๋ฅผ ํ์ฉํ๋ผ๋ ์๊ตฌ์ฌํญ์ด ์ฃผ์ด์ก๋ค.
Webpack??? Parcel??? ๋ฒ๋ค๋ฌ??? ๊ทธ๊ฒ ๋ญ๋ฐ!!!
๐ง DFS์ ๊ณต๋ถ๋ฒ ์์ ๐ง
WebPack์ ์์๋ณด๊ธฐ ์ ์, ๋ฒ๋ค๋ฌ(Bundler)
๋ฅผ ์์์ผํ๋ค.
๋ฒ๋ค๋ฌ๋ ๋ฌด์์ผ๊น?
์ฝ๋๋ง ์์ฑํ๋ ๋ด๊ฐ ๋ชฐ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฌธ์ ์ ์ด ์์๋ค
๋ฉฐ์น ์ , ๋
ธ์
์ ํด๋ก ์ฝ๋ฉ์ ํ๋ ๋ด ํ๋ก์ ํธ์ ๋คํธ์ํฌ ์ํ์ด๋ค.
์นํฉ์ ๊ณต๋ถํ๊ธฐ ์ ๊น์ง๋ ์ด๊ฒ์ด ์ ๋ฌธ์ ์ธ์ง ์ธ์ง๋ฅผ ํ์ง ๋ชปํ๋ค.
ํ์ฌ ์ด๊ฒ์ ๋ฌธ์ ๋ ๋ฌด์์ผ๊น?
ํด๋ก ์ฝ๋ฉ์ ์ํด ๋๋ 7๊ฐ์ jsํ์ผ์ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋คํธ์ํฌ๋ฅผ ํตํด ์ด 7๊ฐ์ jsํ์ผ์ด ๋ถ๋ฌ์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋จ์ํ ํด๋ก ์ฝ๋ฉ์ด๊ธฐ ๋๋ฌธ์ 7๊ฐ๋ง์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ์ง๋ง,
ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ค๋ฉด jsํ์ผ์ ์์ญ ์๋ฐฑ๊ฐ๋ฅผ ๋์ด๊ฐ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋คํธ์ํฌ๋ ์ด๋ป๊ฒ ๋ ๊น?
๋น์ฐํ ์๋๋ ๋๋ ค์ง๊ณ ,
์ด ์๋น์ค๋ฅผ ์ด์ฉํ๋ ์ ์ ๋ ๋ถํธํจ์ ๊ฒช์ ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ด ๋ฒ๋ค๋ฌ(Bundler)
์ด๋ค.
๋ฒ๋ค๋ฌ๋ ์ด ๋ง์ jsํ์ผ๊ณผ cssํ์ผ ๋ฑ์ ํ๋๋ก ๋ฌถ์ด์ฃผ๋ ๋๊ตฌ์ด๋ค.
์ด๋ก์จ, ์ ๋ง์ HTTP ์์ฒญ ์๋ฅผ ์ค์ด๊ณ ,
ํ์ผ ํฌ๊ธฐ๋ฅผ ์ต์ํํ์ฌ ์น ํ์ด์ง์ ๋ก๋ฉ ์๋๋ฅผ ํฅ์์ํจ๋ค.
์ด ์ธ์๋ ์ฌ๋ฌ๊ฐ์ง ์ฅ์ ์ด ์๋ค.
1. ํ์ผ ํฌ๊ธฐ ์ต์ํ : js, css ๋ฑ์ ๋ง์ ํ์ผ์ ํ๋์ ํ์ผ ํฉ์น๋ค
2. ๋ชจ๋ ์์คํ
์ง์ : ๋ชจ๋๊ฐ์ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
3. ์ฝ๋ ์์ถ : ๋ถํ์ํ ๊ณต๋ฐฑ๊ณผ ์ฃผ์์ ์ ๊ฑฐํ์ฌ ํ์ผ์ ํฉ์น๋ค.
4. ํ์ฅ์ ๋ณํ : ๋ค์ํ ํ์์ ํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํด์ค๋ค.
OK ๋ฒ๋ค๋ฌ๋ ์์๊ฒ ๋ค.
๊ทธ๋ผ ์นํฉ(WebPack)
์ ๋ญ์ผ?
์นํฉ์ ๋ฐ๋ก ์ด ๋ฒ๋ค๋ฌ ์ค ํ๋์ด๋ค.
๋ฒ๋ค๋ฌ์๋ ์นํฉ ๋ง๊ณ ๋ ๋ค์ํ ๋๊ตฌ๋ค์ด ์๋ค.
์ด ์๋ง์ ๋๊ตฌ๋ค ์ค ์ฌ๋๋ค์ด ๋ง์ด ์ฐ๋ ์นํฉ์ ๋ํด ์์๋ณด์โ๏ธโ๏ธโ๏ธ
์นํฉ ๊ณต์ํํ์ด์ง์์ ์ค์ค๋ก๋ฅผ ๋ํ๋ด๋ ์ฌ์ง์ด๋ค.
๋ณด๋๋ฐ์ ๊ฐ์ด ์ฌ๋ฌ ํ์ผ๋ค์ ๋จ์ผ ํ์ผ๋ก ๋ฌถ์ด์ฃผ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ์นํฉ์ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น?
๋จผ์ npm init -y
๋ฅผ ํตํด ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ณ ,
npm i -D webpack webpack-cli
์ผ๋ก ์นํฉ์ ์ค์นํ์
(npm์ด ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์ด์ ๊ฒ์๋ฌผ์์ ํ์ธํ์!)
์ค์นํ๊ฒ ๋๋ค๋ฉด ๋๋!!!๐ฅ๐ฅ๐ฅ
๋ฑํ ๋ฐ๋ ๊ฒ์ด ์๋ ๋ชจ์ต์ ํ์ธํ ์ ์๋ค!
์นํฉ์ ์ค์ ํ๊ธฐ ์ํด์๋ ๋ด๊ฐ ์ง์ ์ค์ ํด์ผ ํ๋ค.
๋ฃจํธ ํด๋์ webpack.config.js
์ด๋ผ๋ ํ์ผ์ ์์ฑํ๋ค.
const path = require('path'); // ํ์ผ ์ค์ ์ ์ํํ๊ฒ ํ๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
module.exports = {
mode: 'development', // ์นํฉ ๋ชจ๋(development-๊ฐ๋ฐ์ฉ, production-์๋น์ค์ฉ, none)
entry: './src/main.js', // jsํ์ผ๋ค์ ๋ถ๋ฅด๋ ๋ฉ์ธ jsํ์ผ ๊ฒฝ๋ก
output: {
path: path.resolve(__dirname, 'public'), // ํฉ์ณ์ง jsํ์ผ์ด ์์นํ ํด๋
filename: 'index_bundle.js' // ํฉ์ณ์ง jsํ์ผ์ ์ด๋ฆ
}
}
์์ฑ ํ, ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ด์ ๋ npx webpack
๋ช
๋ น์ด๋ฅผ ํตํด ์นํฉ์ ์์ํ ์ ์๋ค.
ํ์ผ ์ด๋ฆ์ webpack.config.js
๋ผ๊ณ ์ค์ ํ์ง ์์๋ค๋ฉด,
npx webpack --config [ํ์ผ ์ด๋ฆ]
๋ช
๋ น์ด๋ฅผ ํตํด ์คํํด์ผํ๋ค.
๊ท์ฐฎ์ผ๋, ํ์ผ ์ด๋ฆ์ webpack.config.js
๋ก ์์ฑํ์.
(๋ชจ๋๋ณ๋ก ์นํฉ์ ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์์ผ๋ฏ๋ก, ์์ ๋ช
๋ น์ด๊ฐ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๋ฉด ์ข๋ค)
๊ทธ๋ ๋ค๋ฉด ์จ์~!!
๋ง๋ 7๊ฐ์ jsํ์ผ๋ค์ด ํ๋๋ก ๋ฌถ์ฌ์ง ๊ฒ์ ๋ณผ ์ ์๋ค๐
๊ทผ๋ฐ ์ .๊น.๋ง
์๊น๋ jsํ์ผ ๋ง๊ณ ๋ cssํ์ผ์ ํฌํจํด ๋ค๋ฅธ ํ์ผ๋ค๊น์ง ๋ฌถ์ด์ ํ๋๋ก ๋ง๋ค์ด์ค๋ค๋ฉฐ?
์ง๊ธ์ js๋ค๋ง ๋ฌถ์ฌ์์์?!?!
์ด ๋ฌธ์ ๋ ๋ฐ๋ก Loader
๋ผ๋ ๊ธฐ๋ฅ์ ํตํด ๋ฌถ์ด์ค ์ ์๋คโ๏ธ
loader์๋ ๋ค์ํ ํ์ผ๋ค์ ๋ฌถ์ ์ ์๋๋ฐ,
์ง๊ธ ์ด ๊ฒ์๋ฌผ์์๋ css๋ง ๋ค๋ฃจ๊ฒ ๋ค.
(์ถ๊ฐ์ ์ธ loader ๊ธฐ๋ฅ์ ์๊ธฐ์ ํ์ธํด๋ณด๋ฉด ๋ผ์ฉ๐)
css๋ฅผ ์ํด์๋ ๋ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผํ๋ค.
npm i -D css-loader style-loader
๋ช
๋ น์ด๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ์โ๏ธ
์ค์น ํ์๋, ์ฐ๋ฆฌ๊ฐ ์ค์ ํ๋ webpack.config.js
๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํ์.
const path = require("path"); // ํ์ผ ์ค์ ์ ์ํํ๊ฒ ํ๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
module.exports = {
entry: "./src/main.js", // jsํ์ผ๋ค์ ๋ถ๋ฅด๋ ๋ฉ์ธ jsํ์ผ ๊ฒฝ๋ก
output: {
path: path.resolve(__dirname, "public"), // ํฉ์ณ์ง jsํ์ผ์ด ์์นํ ํด๋
filename: "index_bundle.js", // ํฉ์ณ์ง jsํ์ผ์ ์ด๋ฆ
},
module: {
rules: [
{
test: /\.css$/, // ์ ๊ทํํ์์ ์ด์ฉํ์ฌ cssํ์ผ ์ฐพ๊ธฐ
use: ["style-loader", "css-loader"], // ์๋ ์ถ๊ฐ ์ค๋ช
},
],
},
};
module
์ด๋ผ๋ ์ค์ ์ด ์ถ๊ฐ ๋์๋ค.
module์์ test
๋ผ๋ ๊ณณ์์ cssํ์ผ๋ค์ ์ฐพ๊ณ ,
๊ทธ๊ฒ๋ค์ use๋ฅผ ํตํด ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๋๋ค.
๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ญํ ์
- css-loader: cssํ์ผ๋ค์ js์์ ์ฌ์ฉํ ์ ์๋๋ก jsํ์ผ๋ก ๋ง๋ค์ด์ค๋ค.
- style-loader: ๋ณํํ jsํ์ผ๋ค์ style ํ๊ทธ ์์ ๋ฃ์ด ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
์ด๊ฒ์ด ๊ตฌ๋ํ๊ฒ ๋๋ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
webpack.config.js
ํ์ผ์ ์ฝ๋๋ค.- module์
rules
๋ฅผ ์ฝ๋๋ค.test
๋ฅผ ์ฝ์ด ์์ ๋ด์ฉ๋ค์ ์คํํ๋ค.use
๋ฅผ ํตํด ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์คํ์ํจ๋ค.css-loader
๋ฅผ ํตํด cssํ์ผ๋ค์ jsํ์ผ๋ก ๋ณํํ๋ค.style-loader
๋ฅผ ํตํด js๋ก ๋ณํ๋ ํ์ผ์ styleํ๊ทธ์ ๋ฃ๋๋ค.
โป ์ฃผ์ ์ฌํญ : use๋ถ๋ถ์ style-loader๋ฅผ ์ ๊ณ , ๋ค์์ css-loader๋ฅผ ์ ์ ๊ฒ.
( ๊ฑฐ๊พธ๋ก ์ ์ผ๋ฉด ์ธ์์ ๋ชปํ๋๋ฐ ๊ทธ ์ด์ ๊ฐ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ ์์๋ก loader๊ฐ ์งํ๋๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ ๋ฐ๋๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ๋ค์...!! ์ด ์ด์ ๋ฅผ ๋ชฐ๋ผ์ ์ฐพ์๋ณด๋๋ผ ์ ๋ฅผ ์กฐ๊ธ ๋ง์ด ๋จน์์ต๋๋ค๐ฅน)
์ด๋ ๊ฒ ์ค์ ํ๊ฒ ๋๋ฉด ์จ์!!!
cssํ์ผ๋ index_bundels.jsํ์ผ์ ๋ค์ด๊ฐ HTTP์์ฒญ์ด ํ๋ ๋ ์ค์ด๋ค์์ต๋๋ค!!
ํ๋ํ๋ ์ค์ฌ๊ฐ๋ ๊ฒ์ด ์์ฃผ ์ฌ๋ฐ๊ณ ๋ง๐
์ด์ ์์ฃผ ์ฝ๊ฐ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ
์ ์ดํด๋ณด์.
jsํ์ผ์ ํ๋๋ก ๋ฌถ์ด์ผํ๋ ์ํฉ์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ,
๊ฐํน ๋ช ๊ฐ์ ํ์ผ๋ก ์ชผ๊ฐ์ผ ํ ์ ์๋ ์ํฉ์ด ์ฌ ์ ์๋ค.
const path = require('path');
module.exports = {
entry: { // ๊ฐ์ฒด๋ก ๋ณํํ ํ, filename์ ์ด๋ฆ์ผ๋ก ๋ค์ด๊ฐ ์ด๋ฆ์ ์ค์ ํ๊ณ ๊ฒฝ๋ก ์ง์
index: './src/main.js',
addIndex: './scr/subMenu.js',
}
output: {
path: path.resolve(__dirname, 'public'),
filename: '[name]_index_bundle.js', // [name]์ผ๋ก ํต์ผํ์ฌ ๋ค์ด๊ฐ
}
}
์ด ์ธ์๋ Plugin
์ด๋ผ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ผ๋,
๊ด์ฌ์ด ์๋ค๋ฉด ๊ณต์๋ฌธ์์์ ํ์ธํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๐
(์ถ๊ฐ๋ก ์๋ฉด ์ข์ ๋ด์ฉ : Code Splitting
lazy loading
)
์ฒ์์๋ ์นํฉ์ด๋ผ๋ ์ด๋ฆ๋ง ๋ค์ด๋ ๋ฒฝ์ด ๋๊ปด์ง๊ณ ,
๋ฌธํฑ์ด ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ
์ญ์ ํด๋ณด๋๊น ํด๋ณผ๋ง ํ ๊ฒ ๊ฐ๋ค๐คซ
์๋๋ ์ํด๋ณด๊ณ ๋ฌด์์ํ์ง ๋ง๊ณ ์ผ๋จ ํ ๋ฒ ํด๋ณด์!
์ด ์ธ์๋ ์๊ณ ์ถ์ ์ฃผ์ ๋ ๊ถ๊ธํ์ ์ ์์ผ์๋ค๋ฉด ๋ต๊ธ ๋ถํ๋๋ฆฝ๋๋ค:)
์ค๋๋ ์ด ๊ธ๋ก ์ธํด ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋์์ผ๋ฉด ํ๋ค ๐๐
์๋ชป๋ ๋ด์ฉ์ด ์๋ค๋ฉด ๋ต๊ธ ๋ถํ๋๋ฆฝ๋๋ค:)
์ถ์ฒ
Youtube ์ํ์ฝ๋ฉ
์ฝ์ด๋ณด๊ธฐ ์ข์ ๋ธ๋ก๊ทธ
๋ธ๋ก๊ทธ 1
์ธ์ฌ๋ ๊ธ์ ์ ๋ง์ ๋ง ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ฉํ๋ค๊ณ ๋๊ปด์ ธ์... ์ ์ฝ๊ณ ์ ๋ ์ธ์ฌ๋ ๊ธ ์ฝ์ ๊ฒ ํ ๋๋ก webpack ๋ ธ์ ์ ์ ๋ฆฌํด๋์์ต๋๋ค! ์ข์ ๊ธ ๊ฐ์ฌ๋๋ ค์~!!
์ฐ์! ๋ง์นจ ๊ถ๊ธํ๋ ๋ด์ฉ์ด๋ผ ์ฐพ์๋ณผ๊น~ ํ๊ณ ์๊ฐ๋ง ํ๊ณ ์์๋๋ฐ ์ด๋ฐ ๊ธ์ด.... ๊ฐ์ฌํฉ๋๋ค!