2022.07.25(Mon)
[TIL] Day62
[SEB FE] Day63
: ์ฌ์ฉ์์๊ฒ ์น์ฑ์ ์ ๊ณตํ๊ธฐ ์ํ ํ์ผ ๋ฌถ์ ๐ ๋ชจ๋ ๊ฐ ์์กด์ฑ ๊ด๊ณ ํ์ ํ ๊ทธ๋ฃนํํ๋ ์์
: ์ฌ๋ฌ ํ์ผ โ ํ๋ ํ์ผ๋ก ํฉ์ณ์ฃผ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ก, ํ์ฌ Front-end ์ฑ ๋ฐฐํฌ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ!
โจย Webpack ํ์ํ Best ์ด์ ๋? ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅธ ๋ก๋ฉ ์๋ & ๋์ ์ฑ๋ฅ์ ์ํด!
โฐย ๋ชจ๋ ๋ฒ๋ค๋ฌ
: ๊ฐ๊ฐ์ ๋ชจ๋(HTML, CSS, JS ๋ฑ์ ์์)์ ์กฐํฉํด์ ํ๋์ ๋ฌถ์์ผ๋ก ๋ฒ๋ค๋ง(๋น๋)ํ๋ ๋๊ตฌ
โฐย Build
: ๊ฐ๋ฐ ์๋ฃ ์ฑ ๋ฐฐํฌ๋ฅผ ์ํด ํ๋์ ํด๋๋ก ๊ตฌ์ฑํ์ฌ ์ค๋นํ๋ ์์
Target
: Browser Compatibility
์ ์ฐ๊ด๋ ์์ฑ. [default-web
]
Entry
(= Entry point
): ์์ฑ ์ฝ๋ ์์์ !
./src/index.js
]Output
: ์์ฑ๋ ๋ฒ๋ค์ ๋ด๋ณด๋ผ ์์น & ํ์ผ ์ด๋ฆ ์ง์ ๋ฐฉ๋ฒ์ webpack์ ์๋ ค์ฃผ๋ ์ญํ
./dist/main.js
./dist
path
์์ฑ ์ฌ์ฉ์์ path
๋ชจ๋ ์ฌ์ฉํด์ผ ํจLoader
: webpack์ JS, JSON ํ์ผ๋ง ์ดํด! โ Loader ์ฌ์ฉ์ ๋ค๋ฅธ ์ ํ ํ์ผ ์ฒ๋ฆฌ ๊ฐ๋ฅ
test
: ๋ณํ์ด ํ์ํ ํ์ผ๋ค ์๋ณ์ ์ํ ์์ฑuse
: ๋ณํ ์ํ์ ์ฌ์ฉ๋๋ Loader
๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ฑexclude
: Babel
๋ก ์ปดํ์ผํ์ง ์์ ํ์ผ / ํด๋ ์ง์ include
: ๋ฐ๋์ ์ปดํ์ผํด์ผ ํ ํ์ผ / ํด๋ ์ง์ Plugins
: ๋ฒ๋ค ์ต์ ํ / asset ๊ด๋ฆฌ / ํ๊ฒฝ๋ณ์ ์ฃผ์
๋ฑ ๊ด๋ฒ์ํ ์์
์ํ ๊ฐ๋ฅ
a. require()
๋ฅผ ํตํด ๋จผ์ ํ๋ฌ๊ทธ์ธ ์์ฒญํ๊ธฐ
b. plugins
๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ์ ํ๋ ํ๋ฌ๊ทธ์ธ ์ถ๊ฐํ๊ธฐ
new
์ฐ์ฐ์๋ก ํธ์ถ โ Plugin Instance ์์ฑํด์ค์ผ ํจ!
html-webpack-plugin
: ์์ฑ๋ ๋ชจ๋ ๋ฒ๋ค ์๋ ์ฝ์
โ ์ฑ์ฉ HTML ํ์ผ ์์ฑ
mini-css-extract-plugin
: CSS ๋ณ๋ ํ์ผ ์ถ์ถ โ CSS ํฌํจํ๋ JS ํ์ผ ๋น CSS ํ์ผ ์์ฑํด์ฃผ๊ฒ๋ ์ง์
Optimization
: ์ ํํ ํญ๋ชฉ์ ๋ฐ๋ผ ์ต์ ํ ์คํ
minimize
: TerserPlugin
/ optimization.minimize
์ ๋ช
์๋ pluginsminimizer
: TerserPlugin
์ธ์คํด์ค ์ ๊ณตํด์ ์ฌ์ ์ ๊ฐ๋ฅagora-states-reference์ ์ ์ฉํด๋ณด๊ธฐ ๐
Directory
์์ฑ
npm init -y
script.js
ํ์ผ ์์ฑ
a. data.js ์ฆ, ๋ฐ์ดํฐ ํ์ผ ์ฝ๋ ๋ง์ง๋ง์ module.exports = agoraStatesDiscussions;
์ฝ๋ ์ถ๊ฐ
b. script.js์์ const agoraStatesDiscussions = require("./data.js");
์ฝ๋ ์ถ๊ฐํด์ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ!
Webpack
์ค์น
$ npm install -D webpack webpack-cli
Webpack config
ํ์ผ ์์ฑ
// webpack.config.js
const path = require('path');
module.exports = {
entry: './script.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app.bundle.js',
},
}
๋ฒ๋ค๋งํ๊ธฐ
$ npm webpack
npm run build
์ค์
// package.json
"scripts": {
"build": "webpack", // ์๊ธฐ ์ฝ๋ ์ถ๊ฐ!
"test": "echo \"Error: no test specified\" && exit 1"
},
index.html ํ์ผ ์ฝ๋ ์์
<!-- index.html -->
<script src="data.js"></script>
<script src="script.js"></script>
<!-- ๊ธฐ์กด์ ์ ์ฝ๋๋ ์ง์ฐ๊ณ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ฒ๋ค ํ์ผ๊ณผ ์ฐ๊ฒฐํด์ฃผ๊ธฐ! -->
<script src="app.bundle.js"></script>
style-loader
, css-loader
์ค์น โ css style ์ ์ฉ
$ npm i -D css-loader style-loader
// webpack.config.js rules ์ถ๊ฐ!
module: {
rules: [
{
// ํ์ผ๋ช
์ด .css๋ก ๋๋๋ ๋ชจ๋ ํ์ผ์ ์ ์ฉ
test: /\.css$/, // .css๋ก ํ์ผ๋ช
์ด ๋๋๋ ๋ชจ๋ ํ์ผ์ ์ ์ฉ
use: ["style-loader", "css-loader"], // ๋ฐฐ์ด ๋ด์์ <- ์์ผ๋ก ์ ์ฉ
exclude: /node_modules/, // loader๊ฐ node_modules ๋ด์ฉ๋ ์ฒ๋ฆฌํ๋ฏ๋ก ์ ์ ์ธํด์ผ ํจ
},
],
},
// script.js
// css ํ์ผ ์ฐ๊ฒฐํด์ฃผ๊ธฐ
require("./style.css");
// ์ดํ index.html์ <link rel="stylesheet" href="../style.css"> ์ฝ๋ ์์ ๋ style ์ ์ ์ฉ๋จ!
html-webpack-plugin
์ค์น
$ npm i -D html-webpack-plugin
// ์ต์ข
webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./script.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "app.bundle.js",
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
exclude: /node_modules/,
},
],
},
// html-webpack-plugin ์ ์ฉ ๋ถ๋ถ
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "index.html"),
}),
],
};
๋ง์ง๋ง์ผ๋ก npm run build
๋ค์ ํด์ฃผ๋ฉด ๋~!
Github ๋ ํฌ์งํ ๋ฆฌ ์์ฑ ํ dist ํด๋ ์ด๋ฆ์ docs๋ก ๋ณ๊ฒฝ ํ,
app.bundle.js
& index.html
๋ ํ์ผ๋ง ์
๋ก๋ ํ github page์ ๋ฐฐํฌํ๋ฉด ๋ฐ์ดํฐ๊น์ง ์ ๋์ด!!
โจย ๋ฐฐํฌ ์ฑ๊ณต ๐ย https://beanxx.github.io/fe-sprint-webpack/