์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ๋ ์
- JavaScript
- ์ํ
- css
- ์นํผ๋ธ๋ฆฌ์ฑ
- dmz๊ตฌ์ฑ
- html
- ์ค๋ผํด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ค๋ธ์
- dmz๋คํธ์ํฌ
- ํ์ด์ฌ
- ๋คํธ์ํฌdmz
- ์ ๋ฆฌํธ๋ฆฌํธ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๋ฐฉํ๋ฒฝdmz
- ์ฑ
- dmz๋
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๊ฐ๋ฐ
- ๋ฐฐ์์ ๋ฐฐ์
- Python
- ์นดํ๋๊ฐ
- database
- ๋๊ฐ
- Java
- ์ฝ๋ฉ
- ์๋ฐ
- ํ๋ก๊ทธ๋๋ฐ
- ํ์ฒ์ ๋ฆฌํธ๋ฆฌํธ
- Today
- Total
JiYoung Dev ๐ฅ
Webpack: ๊ฐ๋ ๊ณผ ์ค์ ๋ณธ๋ฌธ
๋ถํธ์บ ํ์์ React๋ฅผ ์ฒ์ ์ ํ์ ๋ CRA(react-create-app)์ ํตํด ์ฑ์ ๊ตฌ์ฑํ๊ณ ์คํํ์๋ค. ํ์ฌ์ ์ ์ฌํ ํ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋งก๊ฒ ๋๋ฉด์ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋์๋๋ฐ, CRA์ ๊ฒฝ์ฐ ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ธ์ ๋ณด๊ฒ ๋์๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ํ๋ก์ ํธ์์๋ CRA๊ฐ ์๋ ์ง์ Webpack์ ์ ์ฉํ์๋๋ฐ(CRA๊ฐ ์๋์ผ๋ก Webpack์ ์ ์ฉ), ๊ทธ ๊ณผ์ ์์ Webpack์ด ๋ฌด์์ธ์ง, ์ด๋ค ์ญํ ์ ํ๋์ง, ๊ฐ ์ค์ ์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
๐ Webpack์ด๋
Webpack์ ๋ชจ๋ Javascript ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ด๋ค.
Javascript๋ฅผ ์ํ ๋ชจ๋ ๋ฒ๋ค๋ฌ๊ฐ Webpack๋ง ์๋ ๊ฒ์ ์๋๋ค. ํ์ง๋ง ์ด๋ฒ ํฌ์คํ ์์๋ ๋ด๊ฐ ์ง์ ๋ค๋ค๋ณธ Webpack๋ง์ ์ค๋ช ํ๋ค.
๋ชจ๋ ๋ฒ๋ค๋ฌ(Module Bundler)
๋ถ๋ฆฌ๋ ์ฝ๋๋ฅผ ํ๋์ ํ์ผ๋ก ๋ณํฉํ๋ ๊ฐ๋ฐ ๋๊ตฌ ๊ฐ๊ฐ์ ๋ชจ๋๋ค์ ๋ํด ์์กด์ฑ ๊ด๊ณ๋ฅผ ํ์ ํ์ฌ ๊ทธ๋ฃจํํด์ฃผ๋ ๊ฒ
์ฆ, Javascript ๋ชจ๋์ ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๋ ๋จ์ผ Javascript ํ์ผ๋ก ๋ฌถ๋๋ฐ ์ฌ์ฉ๋๋ ๋๊ตฌ
CSS, ํฐํธ, ์ด๋ฏธ์ง, JS๋ฅผ ์ ์ ์ธ ํ์ผ๋ก ๋ณํํ๊ณ ํ๋๋ก ํฉ์ณ์ฃผ๋๋ฐ ์ฌ์ฉ
Webpack์ ์ฌ์ฉํ๋ ์ด์
๋ํ๊ธฐ์ ๊ณฑ์ ์ ์ํํ๋ ์ ํ๋ฆฌ์ผ์ด์ (.js)๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ์ฐ๋ฆฌ๋ ์ ์ง๊ด๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์์ ๊ฐ์ด ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ์๋ค.
index.html
<html>
<head>
<script src="src/sum.js"></script>
<script src="src/multiply.js"></script>
<script src="src/index.js"></script>
</head>
</html>
index.js
var totalMultiply = multiply(5, 3); //multiply.js
var totalSum = sum(5, 3); //sum.js
console.log('Product of 5 and 3 = ' + totalMultiply);
console.log('Sum of 5 and 3 = ' + totalSum);
muliply.js
var multiply = function (a, b) {
var total = 0;
for (var i = 0; i < b; i++) {
total = sum(a, total);
}
return total;
};
sum.js
var sum = function (a, b) {
return a + b;
};
์์ index.html์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
Product of 5 and 3 = 15 Sum of 5 and 3 = 8
์์ ์ฝ๋์์ ์ฐ๋ฆฌ๋ multiply.js์ index.js ๋ชจ๋๊ฐ sum.js์ ์์กดํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ง์ฝ index.html์์ index.js์ script ์ฝ๋๋ฅผ multiply.js ์ ํน์ sum.js ์์ ์์น์ํค๊ฒ๋๋ฉด ์๋ํ์ง ์๋๋ค.
๋ง์ฝ ํ์ฌ๋ณด๋ค ํจ์ฌ ๋ ํ์ฅ๋๊ณ ๋ ํฐ ํ๋ชจ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ํ๋ค๊ณ ์๊ฐํด ๋ดค์ ๋, ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ์์ญ ๊ฐ์ ์ข ์์ฑ์ด ์์ ์ ์์ผ๋ฉฐ, ๊ทธ ์ค ์ผ๋ถ๋ ์๋ก ์์กดํ๋ค. ์ด ์ง์๋ฅผ ์์ ๊ฐ์ด ์ ์งํ๋ ๊ฒ์ ์ฝ์ง ์์ ๊ฒ์ด๋ค.
๋ํ, ์ฌ๊ธฐ์ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ค๋ฅธ ์ฝ๋๊ฐ ๋ณ์๋ฅผ ๋ฎ์ด ์ธ ์ํ๋ ์๊ณ , ์ด๋ก ์ธํด ์ฐพ๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋ ์์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด์.
index.html
<!DOCTYPE html>
<html>
<head> </head>
<body>
<script src="./src/math.js"></script>
<script src="./src/app.js"></script>
</body>
</html>
main.js
function sum(x, y) {
return x + y;
}
app.js
sum(1, 2);
console.log(sum(1, 2)); // 3
sum.js
var sum = function (a, b) {
return a + b;
};
์์ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ์ฑ๋์์ ๋ ๋ฌธ์ ๋ sum์ด ์ ์ญ ์ค์ฝํ์ ๋ ธ์ถ๋๋ฉด ๋ฐ์ํ๋ค.
sum = 1;
sum(3,4) //Uncaught TypeError: sum is not a function;
๋ง์ฝ ์ ์ญ์ผ๋ก sum์ 1์ ์๋กญ๊ฒ ํ ๋นํ๋ค๋ฉด ์ด์ sum์ด๋ผ๋ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ ์ํฉ์ด ๋์ด๋ฒ๋ฆฐ๋ค.
Webpack์ ์ด๋ฌํ ์ข ์์ฑ์ ๋ชจ๋๋ก ๋ณํํ์ฌ ๊ด๋ฆฌํ๋ฉฐ, ์ด ๋ชจ๋์ ๋ฒ๋ค๋งํ์ฌ ๋ชจ๋ ์ข ์์ฑ์ ๋จ์ผ ํ์ผ๋ก ๋์ด ์ฌ ์ ์๋ค.
๐ Webpack ์ค์
Webpack.config.(c/m)js
webpack.config.js ํ์ผ์ ์ต์๋จ์ ์์นํ์ฌ Webpack์ด ์คํ๋ ๋ ์ฐธ์กฐํ๋ ์ค์ ํ์ผ์ด๋ค.
์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ฉด์ ๋ด๊ฐ ์ฌ์ฉํ ์ค์ ํ์ผ์ด๋ค. ํ์ฌ ๋ด๊ฐ ๋ง๋ ํ๋ก์ ํธ๋ ECMAscript ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ webpack.config.mjs ํ์ผ๋ก ์์ฑํ์๋ค.
import Dotenv from "dotenv-webpack";
import HtmlWebpackPlugin from "html-webpack-plugin";
import path from "path";
export default {
name: "app_webpack_name",
mode: "development",
resolve: {
extensions: [".js", ".jsx"],
alias: {
"@components": path.resolve(process.cwd(), "src/components"),
"@pages": path.resolve(process.cwd(), "src/pages"),
},
fallback: {
path: "path-browserify",
url: "url",
},
},
entry: {
app: path.resolve(process.cwd(), "src/index.js"),
},
output: {
path: path.resolve(process.cwd(), "dist"),
filename: "bundle.js",
publicPath: "/",
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
},
},
{
test: /\.s[ac]ss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html",
}),
new Dotenv({
path: "./.env.develop",
}),
],
devServer: {
historyApiFallback: true,
static: "./dist",
port: 3000,
open: true,
hot: true,
},
};
name
Webpack ์ค์ ์ ์ด๋ฆ
์ฃผ๋ก Webpack์ Multi-Compiler ์ค์ ์์ ์ฌ๋ฌ ์ค์ ํ์ผ์ ๊ตฌ๋ถํ๋๋ฐ ์ ์ฉ
mode
Webpack์ ๋ชจ๋ ์ค์
- development: ๋๋ฒ๊น ์ ์ํ ์ค์ (์ต์ ํ ๋ฏธ์ ์ฉ, ์์ค๋งต ์์ฑ)
- production: ์ต์ ํ๋ฅผ ์ ์ฉํด ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ๋์
- none: ๊ธฐ๋ณธ๊ฐ, ์ต์ ํ๋ ๋๋ฒ๊น ์์ด ๋น๋
Resolve
- extensions: ํ์ผ ํ์ฅ์๋ฅผ ์๋ตํ ์ ์๋๋ก ์ง์
- alias: ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๋จ์ถํ๊ธฐ ์ํด ๋ณ์นญ ์ง์
- fallback: Node.js ๋ชจ๋์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋์ฒด ๋ชจ๋์ ์ง์
- path-browserify: ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ Node.js์ path ๋ชจ๋์ ๋์ฒด
- url: ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ Node.js์ url ๋ชจ๋์ ๋์ฒด
entry
์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ฉฐ Webpack์ด ๋ฒ๋ค๋ง์ ์์ํ๋ ๊ณณ
Webpack์ entry point๊ฐ ์์กดํ๋ ๋ค๋ฅธ ๋ชจ๋๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฐพ์๋ธ๋ค.
output
output ์์ฑ์ ๋ฒ๋ค ๊ฒฐ๊ณผ๋ฌผ์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๊ณ ์ด๋ฆ์ ์ง์ ํ๋ ์ต์ ๋ฑ์ ์ถ๊ฐํ ์ ์๋ค.
- path: ๋ฒ๋ค๋ง๋ ๊ฒฐ๊ณผ๋ฌผ์ ์์น๋ฅผ ์ค์ ํ ์ ์๋ค.
- filename:๋ฒ๋ค๋ง๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ฆ์ ์ค์ ํ ์ ์๋ค.
- publicPath: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ ๊ธฐ๋ณธ URL ๊ฒฝ๋ก
Module Rules
- rules: ํ์ผ ์ ํ๋ณ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ ์
- test: ์ฒ๋ฆฌํ ํ์ผ ํ์ฅ์ ํจํด
- exclude: ์ ์ธํ ๋๋ ํ ๋ฆฌ
- use: ์ฌ์ฉํ ๋ก๋ ์ง์
loader
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํด์ํ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋ HTML, CSS ๋ฑ ์น ์์๋ค์ ๋ณํํ ์ ์๋๋ก ๋์์ค๋ค. ์์ฃผ ์ฌ์ฉ๋๋ ๋ก๋๋ babel-loader, css-loader, style-loader, file-loader ๋ฑ์ด ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Webpack์ Javascript ๋ฐ JSON ํ์ผ๋ง ํด์์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๋ก๋(loaders)๋ฅผ ์ฌ์ฉํ๋ฉด Webpack์ด ๋ค๋ฅธ ํฌ๋งท์ ํ์ผ์ ์ฒ๋ฆฌํ๊ณ , ์ด๋ฅผ ์ฑ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋๋ก ๋ณํํ ์ ์๋ค.
- test: loader๋ฅผ ์ ์ฉ์ํฌ ํ์ผ ์ ํ ๋ช ์(์ ๊ทํํ์)
- use: ํด๋น ํ์ผ์ ์ ์ฉํ loader ๋ช ์
- exclude: loader๋ฅผ ๋ฐฐ์ ์ํฌ ํ์ผ ๋ช ์
plugin
Webpack์ผ๋ก ๋ณํํ ํ์ผ์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๋ค. ํ๋ฌ๊ทธ์ธ์ ํด๋น ๊ฒฐ๊ณผ๋ฌผ์ ํํ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ์ญํ ์ ์ํํ๋ค.
- HtmlWebpackPlugin: ๋ฒ๋ค๋ง๋ JS ํ์ผ์ ์๋์ผ๋ก HTML ํ์ผ์ ์ฝ์
- template: ํ ํ๋ฆฟ์ผ๋ก ์ฌ์ฉํ HTML ํ์ผ ์ง์
- Dotenv: ํ๊ฒฝ๋ณ์ ๋ก๋
DevServer
Webpack ๊ฐ๋ฐ ์๋ฒ ์ค์
- historyApiFallback: SPA์์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ง์
- static: ์ ์ ํ์ผ์ ์ ๊ณตํ ๋๋ ํ ๋ฆฌ
- port: ๊ฐ๋ฐ ์๋ฒ๊ฐ ์ฌ์ฉํ ํฌํธ ๋ฒํธ
- open: ๊ฐ๋ฐ ์๋ฒ ์คํ ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋์ผ๋ก ์ด๋๋ก ์ค์
- hot: HMR(Hot Module Replacement) ํ์ฑํ. ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ ๋ณ๊ฒฝ๋ ๋ชจ๋์ ์ฆ์ ๋ฐ์
โค ์ฐธ๊ณ ์๋ฃ
https://tech.osci.kr/create-react-app-์์ด-๋ฐฐ์ฐ๋-webpack/
https://blog.ag-grid.com/webpack-tutorial-understanding-how-it-works/