์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- custom hook
- js
- DP
- Redux toolkit
- Node.js
- ๋ฐฑ์ค
- icecandidate
- ์นด์นด์ค
- TypeScript
- ์๋ฐ์คํฌ๋ฆฝํธ
- ์๊ณ ๋ฆฌ์ฆ
- ์ด๋ถํ์
- ๊ณผ์ ํ ์คํธ
- ํ๋ก๊ทธ๋๋จธ์ค
- React
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- svgํ์ผ ๋ค๋ฃจ๊ธฐ
- ์ด๋ฏธ์ง ์์
- ๋๋๊ทธ ์ด๋ฒคํธ
- ๋ธ๋ฃจํธํฌ์ค
- ์ฝ๋ ํฌ๋ฉง
- JavaScript
- ์ฝ๋ฉํ ์คํธ
- ๋์ ๊ณํ๋ฒ
- ๋ถ์คํธ์บ ํ์น๋ชจ๋ฐ์ผ
- router v6
- ๋ฆฌ๋์ค ํดํท
- ์ฝํ
- ๋ถ์คํธ์ปจํผ๋ฐ์ค
- ์นด์นด์ค์ฑ์ฉ
- Today
- Total
๐ฅ dev-ruby
[๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ] babel๊ณผ Webpack ๋ณธ๋ฌธ
์น ํ๋ก์ ํธ๋ฅผ ์๋ก ์์ํ๊ธฐ ์ํด์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ์์ ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํ๋ ์ผ๋ถํฐ ์์ํด์ผ ํ๋ค.
์ฒ์์๋ CRA(create-react-app)์ผ๋ก ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํ์ง๋ง "CRA ์์ด ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํด๋ณด๊ธฐ" ๊ณต๋ถ๋ฅผ ํ๊ธฐ ์ํด ์์ฑํด๋ณธ๋ค.
1. package.json ์์ฑ
์ฒซ ๋ฒ์งธ๋ package.json ํ์ผ๋ถํฐ ์์ฑํด์ผํ๋ค.
npm init -y ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ package.json๋ฅผ ์์ฑํ์. yarn init -y ์ ์ฌ์ฉํด๋ ๋๋ค.
์์ธํ ๋ด์ฉ์ npm init docs์์ ํ์ธํ์.
npm init -y ๋ก ์์ฑ๋ ํ์ผ์ ์๋์ ๊ฐ๋ค.
//package.json
{
"name": "babel-webpack-practice",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
์ด์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ์ฌ๋๊ฐ๋ฉด ๋๋ค.
2. babel ์ค์น
babel ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ธฐ ์ํด์ npm install [์ค์นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ] ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์.
์ฐ์ ์ค์นํด์ผ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ @babel/core, @babel/cli์ด๋ค.
@babel/core ๋ babel์ด ํธ๋์คํ์ผ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ ์ด๊ณ ,
@babel/cli ๋ CLI(Command Line Interface, git bash๋ cmd ๊ฐ์ ๊ฑฐ์)์์ babel์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ ์ด๋ค.
๋๋ npm install --save-dev @babel/core @babel/cli ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
--save-dev(์ค์ฌ์ -D) ๋ช ๋ น์ด๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ๋ฐ๋จ๊ณ์์๋ง ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
-D ๋ช
๋ น์ด๋ฅผ ์ฐ์ง ์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ฉด package.json์ dependencies ๊ฐ์ฒด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ์ด ์ถ๊ฐ๋๋ค. ์ด ํจํค์ง๊ฐ ๋ฐฐํฌ๋์ด์ ์ค์น๋์ ๋ dependencies ๊ฐ์ฒด์ ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๊ฐ์ด ์ค์น๋๋ค.
-D ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ฉด devDependencies ๊ฐ์ฒด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ๋๊ณ , ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ฐฐํฌ๋ ํจํค์ง์ ํฌํจ๋์ง ์๋๋ค.
babel์ ์์ ES ๋ฌธ๋ฒ์ด ์ฌ์ฉ๋ jsํ์ผ์ ํ์ ES ๋ฌธ๋ฒ์ธ jsํ์ผ๋ก ๋ณํ์์ผ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ๋จ๊ณ์์๋ง ์ฌ์ฉํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ -D ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ค์นํ์.
// pacakage.json
{
"name": "babel-webpack-practice",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/cli": "^7.16.8",
"@babel/core": "^7.16.12"
}
}
์ด๋ ๊ฒ devDependencies์ ์ค์นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ๋์๋ค.
ํ์ง๋ง ์ด๊ฒ๋ง์ผ๋ก babel์ ์ฌ์ฉํ ์๋ ์๊ณ plugin์ด ํ์ํ๋ค.
2-1. plugin๊ณผ preset
babel์ plugin์ ์ค์ ๋ก ์ฝ๋๋ฅผ ๋ณํ์ํค๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ค.
babel plugin Docs๋ฅผ ๋ณด๋ฉด plugin์ด ์ธ์ธํ๊ฒ ๋๋์ด์ ธ ์์ด ์ค์นํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋กญ๊ณ , ๋ด๊ฐ ํ์ํ plugin์ ํ๋ํ๋ ์ฐพ๋ ๊ฒ๋ ํ๋ค๋ค.
(์๋ฅผ ๋ค๋ฉด, ๋ด๊ฐ ES6์ ํ์ดํ ํจ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ฅผ ๋ณํ์ํค๊ธฐ ์ํด @babel/plugin-transform-arrow-functions ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์น๊ฐ ํ์ํ๊ณ ,
๋ธ๋ญ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด @babel/plugin-transform-block-scoping ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์น๊ฐ ํ์ํ๋ค.)
๊ทธ๋์ preset์ด ๋ฑ์ฅํ๊ฒ ๋๋ค.
preset์ ๋ชฉ์ ์ ๋ฐ๋ผ plugin๋ค์ ๋ชจ์๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
preset๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ๊ทธ ์ค์์๋ @babel/preset-env ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ targets ์ต์
์ ์ด์ฉํด์ ์ด๋ค ๋ธ๋ผ์ฐ์ ์๋ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์์ฃผ ์ฐ์ธ๋ค.
๊ทธ๋ผ @babel/preset-env์ ์ค์นํด์ ์ฌ์ฉํด๋ณด์!
// babel.config.js
const presets = [
[
"@babel/preset-env",
{
targets: {
chrome: "87",
},
useBuiltIns: "usage",
corejs: "3.6.4",
},
],
];
module.exports = { presets };
์ต์
์ค, useBuiltIns๋ polyfill์ ์ฌ์ฉํ ๊ฒ์ธ์ง ์๋์ง๋ฅผ ์ ํํ ์ ์๋ ์ต์
์ด๋ค.
useBuiltIns ์ต์
์ "usage" | "entry" | false ์ค ํ๋๋ฅผ ์ ํํ ์ ์๊ณ default๋ false๋ค.
"usage"๋ ๋ด ์ฝ๋๋ฅผ ๋ถ์ํด์ ํ์ํ polyfill plugin๋ง์ ์ ์ฉ์ํจ๋ค.
"entry"๋ targets ๋ธ๋ผ์ฐ์ ์ ํ์ํ polyfill plugin์ ๋ชจ๋ ์ ์ฉ์ํจ๋ค.
false๋ polyfill์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๋ป์ด๋ค.
corejs ์ต์
์ polyfill์ ์ฌ์ฉํ ๋ ์ฝ์
๋๋ corejs์ ๋ฒ์ ์ ์ ํํ๋ ์ต์
์ด๋ค.
useBuiltIns ์ต์
์ด ํ์ฑํ๋์ด ์์ ๋ ์ ์ฉ๊ฐ๋ฅํ๋ค.
2, 3 ํน์ { version: 2 | 3, proposals: boolean } ์ค ํ๋๋ฅผ ์ ํํ ์ ์๊ณ default๋ 2๋ค.
2๋ ์
๋ฐ์ดํธ๊ฐ ์ค๋จ๋์ด์ 3์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
@babel/preset-env์ ์ต์ ๋ค๊ณผ ์์ธํ ์ ๋ณด๋ @babel/preset-env Docs์์ ํ์ธํ์.
์ด๋ ๊ฒ preset ์ต์
๋ฐฐ์ด์ module.exports ํด์ฃผ๋ฉด preset ์ ์ฉ์ด ์๋ฃ๋๋ค.
3. webpack
webpack์ entryํ์ผ์ ์ง์ ํด์ entryํ์ผ์ด ์์กด์ฑ์ ๋๊ณ ์๋ ๋ชจ๋๋ค์ ๋ชจ๋ ํ๋๋ก ๋ฌถ์ด๋ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์ด์ ๋ฒ๋ค๋งํ jsํ์ผ์ ๋ง๋ ๋ค.
// src/index.js
const pow = function (a) {
const result = a * a;
return result;
};
console.log(pow(3));
๊ทธ๋ฆฌ๊ณ webpack.config.js ํ์ผ์ ๋ง๋ค์ด์ ์ต์ ์ ์ค์ ํ๋ค.
// webpack.config.js
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist/js"),
filename: "bundle.js",
},
devtool: "inline-source-map",
mode: "development",
};
entry ์ต์ ์ ๋ฒ๋ค๋ง์ ์์์ ์ด ๋ ํ์ผ์ ์ค์ ํ๋ ์ต์ ์ด๋ค. ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ํํ๋ก ์ฌ๋ฌ ๊ฐ์ entry๋ฅผ ์ง์ ํ ์๋ ์๋ค.
output ์ต์
์ ๋ฒ๋ค๋ง์ด ์๋ฃ๋ ํ์ผ์ ๋ํ ์ต์
์ด๋ค.
output.path๋ ๋ฒ๋ค๋ง๋ ํ์ผ์ด ์ ์ฅ๋ ์์น์ด๊ณ , output.filename์ ๋ฒ๋ค๋ง๋ ํ์ผ์ ์ด๋ฆ์ด๋ค.
(์์ ์์์์๋ dist/js/bundle.js ๊ฒฝ๋ก๋ก ํ์ผ์ด ์์ฑ๋ ๊ฒ์ด๋ค.)
devtool ์ต์
์๋ ์ฌ๋ฌ ์ข
๋ฅ์ source-map ์ค ํ๋๋ฅผ ์
๋ ฅํ ์ ์๋ค. source-map์ ๋ฒ๋ค๋ง ๋ ์ฝ๋์ ์๋ณธ ์์น๋ฅผ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
์๋ ์ฌ์ง์ ๋งจ ์ค๋ฅธ์ชฝ์ ๋ณด๋ฉด index.js:6์ด๋ผ๊ณ ์จ์๋๋ฐ, index.js ํ์ผ์ 6๋ฒ์งธ ์ค์์ ์ฝ์์ ์คํ๋์์ ์ ์ ์๋ค.
๋ญ .. ์ด๋ฐ ์ญํ ์ ํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ก ๊ฐ๋ฐํ๋ฉด์ ๋ง์ด ์ฐธ๊ณ ํ๋ ๊ฒ๋ค์ธ๋ฐ, ์ด๋ ๊ฒ ํ๊ฒฝ ๊ตฌ์ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์๋ ์์์ ๋๋๋ค.
mode์ต์
์ "production" | "development" ๋ ๊ฐ์ง ์ต์
์ด ์๋ค. ๋ชฉ์ ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์ต์ ํ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ค.
์ด์ npx webpack ๋ช ๋ น์ด๋ก webpack์ ์คํํ์.
๊ทธ๋ผ dist/js/bundle.js ์ด ์์ฑ๋๋ค.
bundle.js๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด index.html ์ ๋ง๋ค์ด์ bundle.js๋ฅผ script๋ก ๋ถ๋ฌ์จ๋ค.
// index.html
<!DOCTYPE html>
<html>
<body>
<script src="./dist/js/bundle.js"></script>
</body>
</html>
๊ทธ๋ฆฌ๊ณ index.html์ ๋ธ๋ผ์ฐ์ ์ ๋์ ๋ณด๋ฉด (๊ทธ๋ฅ ํด๋ฆญํด์ ๋์) ์์ ์ฌ์ง์ฒ๋ผ ์ฝ์์ 9๊ฐ ์ฐํ๊ฒ ๋๋ค.
source-map ๋๋ถ์ ์ด console.log๊ฐ index.js:6์์ ๋ฐ์ํ๋ค๋ ๊ฒ๋ ์ ์ ์๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ webpack์ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ด๋ค. ์ด์ webpack์ ์์ฒญ๋ ๊ธฐ๋ฅ๋ค์ ๋ํด ์์๋ณด์.
3-1. loader
webpack์ entry ํ์ผ์ด ์์กด์ฑ์ ๋๊ณ ์๋ ๋ชจ๋ ๊ฒ์ ๋ชจ๋๋ก ๋ฐ์๋ค์ฌ ๋ฌถ์ด๋ธ๋ค.
๋ด๊ฐ React๋ฅผ ์ฐ๊ณ ์๊ณ , app ์ปดํฌ๋ํธ๊ฐ css๋ scss๋ฅผ importํ๊ฑฐ๋ ํน์ TypeScript๋ฅผ ์ฌ์ฉํด์ js๊ฐ ์๋ ts๋ tsx๋ฅผ ์ฌ์ฉํ๋ค๋ฉด?
๊ถ๊ธํด์ก์ผ๋ css ํ์ผ์ entry๋ก ์ง์ ํด์ webpack์ ์ฌ์ฉํด๋ณด์.
/* src/css/main.css */
@import url("./background.css");
/* src/css/background.css */
body {
background-color: thistle;
}
์๋๋ webpack.config.js ์ค์ ์ด๋ค. entry์ ./src/css/main.css ๋ฅผ ์ถ๊ฐํด์คฌ๋ค.
// webpack.config.js
const path = require("path");
module.exports = {
entry: ["./src/js/main.js", "./src/css/main.css"],
output: {
path: path.resolve(__dirname, "dist/js"),
filename: "bundle.js",
},
devtool: "source-map",
mode: "development",
};
์ด ์ํ์์ webpack์ ์๋์ํค๋ฉด ์๋ฌ๊ฐ ๋๋ค. ์ด ์ ํ์ ํ์ผ์ ์ฒ๋ฆฌํ๋ ค๋ฉด loader๊ฐ ํ์ํ ๊ฒ์ด๋ฉฐ, ํ์ฌ ์ด ํ์ผ์ ๋ํ loader๊ฐ ์ค์ ๋์ด์์ง ์๋ค๋ ์ค๋ช ๊ณผ ํจ๊ป.
3-1-1. css loader
๊ทธ๋ผ css์๋ ์ด๋ค loader๊ฐ ํ์ํ ๊น? css๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ css-loader์ style-loader๊ฐ ํ์ํ๋ค.
npm install -D css-loader style-loader ๋ก ์ค์นํ ๋ค ์ ์ฉํด๋ณด์.
// webpack.config.js
const path = require("path");
module.exports = {
entry: ["./src/js/main.js", "./src/css/main.css"],
output: {
path: path.resolve(__dirname, "dist/js"),
filename: "bundle.js",
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
devtool: "source-map",
mode: "development",
};
loader๋ฅผ ์ ์ฉํ๋ ค๋ฉด module ๊ฐ์ฒด์์ rules ๋ฐฐ์ด์ ๋์ด์ผํ๋ค. rules ๋ฐฐ์ด ์์๋ ๊ฐ์ฒด๋ค์ด ๋ค์ด์๊ณ , ๊ฐ์ฒด๋ ํ์์ ์ผ๋ก test์ use๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
test๋ loader๋ฅผ ์ ์ฉ์ํฌ ํ์ผ ํ์ฅ์์ ์ ๊ทํํ์์ด๊ณ ,
use๋ test ํ์ฅ์๋ช
์ ๊ฐ์ง ํ์ผ์ ์ ์ฉ์ํฌ loader๋ค.
use๋ ๋ฐฐ์ด์ ์ฌ์ฉํด์ ํ๋ ์ด์์ loader๋ฅผ ์ ์ฉ์ํฌ ์ ์๊ณ , ๋ฐฐ์ด์ ์ค๋ฅธ์ชฝ์ ์๋ loader๋ถํฐ ์ ์ฉ๋๋ค.
๊ฒฐ๊ตญ, ์ด ์ต์
์ .css๋ก ๋๋๋ ํ์ผ์ 1. css-loader 2. style-loader ์์๋ก loader๋ฅผ ์ ์ฉ์ํค๊ฒ ๋ค๋ ๋ป์ด๋ค.
css-loader๋ css ์คํ์ผ์ํธ๋ฅผ JS๋ก ๋ณํ์์ผ์ฃผ๊ณ , style-loader๋ JS๋ก ๋ณํ๋ css ์คํ์ผ์ํธ๋ฅผ DOM์ ๋์ ์ผ๋ก ์ถ๊ฐ์์ผ์ค๋ค.
์ด์ ๋ค์ webpack์ ์คํ์ํจ๋ค. (npx webpack)
๊ทธ๋ผ ๋ฐฐ๊ฒฝํ๋ฉด ์์์ด ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
3-1-2. babel loader
์ด์ webpack์ผ๋ก ๋ฌถ์ด๋ผ ๋ js์ babel์ ์ ์ฉ์ํค๊ธฐ ์ํด babel-loader๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค.
// webpack.config.js
const path = require("path");
module.exports = {
entry: ["./src/index.js", "./src/css/main.css"],
output: {
path: path.resolve(__dirname, "dist/js"),
filename: "bundle.js",
},
module: {
rules: [{
test: /\.js$/,
use: [
{
loader: "babel-loader",
options: {
presets: [
[
"@babel/preset-env",
{
useBuiltIns: "usage",
corejs: "3.6.4",
targets: {
chrome: "87",
},
},
],
],
},
},
],
exclude: /node_modules/,
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
devtool: "inline-source-map",
mode: "development",
};
rules ๋ฐฐ์ด์ ์ ๊ฐ์ฒด๊ฐ ์๊ฒผ๋ค.
1. ๋จผ์ test๋ .js ํ์ผ ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ๋ค์ ๋์์ผ๋ก ํ๊ณ ์๋ค.
2. use๋ css-loader๋ฅผ ์ฌ์ฉํ ๋์๋ ๋ค๋ฅธ ํํ๋ค. use ๋ฐฐ์ด์์ ๊ฐ์ฒด๊ฐ ๋ค์ด์๋ค. ์ด๊ฒ์ babel-loader์ option์ ์ค์ ํ๊ธฐ ์ํด์๋ค.
์ด ๊ฐ์ฒด๋ฅผ ์ดํด๋ณด๋ฉด,
3. loader์๋ ์ ์ฉํ loader์ธ "babel-loader"๊ฐ ๋ค์ด์๋ค.
4. options๋ babel-loader์ ์ต์
์ ๋ด๋ ๊ฐ์ฒด๋ค. presets ๋ฐฐ์ด์ ์ฌ์ฉํ preset๋ค์ ์
๋ ฅํ๋ค.
๋๋ @babel/preset-env๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
์ด์ธ์๋ plugin๊ณผ preset-env์ polyfill ๊ธฐ๋ฅ๋ ์ค์ ํ ์๋ ์๋ค.
5. exclude๋ webpack์ ๋ฒ๋ค์์ ์ ์ธํ ํด๋๋ ํ์ผ์ด๋ค.
node_modules ํด๋์๋ ์ ์ญ ์ ๋ฐฑ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋ค์ด์๊ธฐ ๋๋ฌธ์ ๋ณดํต node_modules๋ .js ํ์ฅ์์ ์ ์ฉ์ํฌ loader์์ ์ ์ธ์ํจ๋ค.
webpack loaders Docs์์ ๋ ์์ธํ ์ดํด๋ณผ ์ ์๋ค.
3-2. plugin
plugin์ webpack์ ํธ์์ฑ์ ๋์ฌ์ค๋ค. ๊ทธ ์ค์์ ํธ๋ฆฌํ๋ค๊ณ ์๊ฐ๋๋ ๊ฒ ๋ช ๊ฐ๋ง ์ ์ฉ์์ผ ๋ณด์.
3-2-1. HtmlWebpackPlugin
HtmlWebpackPlugin์ webpack์ ์คํํ ๋ค ๋ฒ๋ค๋ง ๋ jsํ์ผ์ ํฌํจํ html์ ์๋์ผ๋ก ์์ฑํด์ค๋ค.
์ด์ ์ bundle.js ํ์ผ์ webpack์ผ๋ก ์์ฑํ ๋ค, index.html ํ์ผ์ ์ง์ ๋ง๋ค์ด์ bundle.js๋ฅผ ํฌํจ์์ผฐ๋ค. ์ด ๊ณผ์ ์ ์๋์ผ๋ก ํด์ฃผ๋ ๊ฒ์ด๋ค.
npm install -D html-webpack-plugin ๋ช ๋ น์ด๋ก ์ค์นํ ๋ค ์ ์ฉ์ํจ๋ค.
// webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: ["./src/index.js", "./src/css/main.css"],
output: {
path: path.resolve(__dirname, "dist/js"),
filename: "bundle.js",
},
module: {
rules: [{
test: /\.js$/,
use: [
{
loader: "babel-loader",
options: {
presets: [
[
"@babel/preset-env",
{
useBuiltIns: "usage",
corejs: "3.6.4",
targets: {
chrome: "87",
},
},
],
],
},
},
],
exclude: /node_modules/,
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
plugins: [new HtmlWebpackPlugin()],
devtool: "inline-source-map",
mode: "development",
};
๋๋ฒ์งธ ์ค์
๊ณผ plugins ๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
์ด์ ๋ npx webpack์ ์คํ์์ผ์ฃผ๋ฉด, output ๊ฒฝ๋ก ์์ index.htm ์ด ์๋์ผ๋ก ์์ฑ๋๋ค.
HtmlWebpackPlugin Docs์์ ์ต์
์ ๋ํด ์์ธํ ๋ณผ ์ ์๋ค.
3-2-2 CleanWebpackPlugin
webpack์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด์ ์ ๋ฒ๋ค๋งํ๋ ๊ฒฐ๊ณผ๋ฌผ์ด ๊ณ์ ๋จ์์์ด ๋ถํธํ ๋๊ฐ ์๋ค.
CleanWebpacPlugin์ ์๋ก ๋ฒ๋ค๋งํ์ ๋ ์ด์ ์ ๋ฒ๋ค๋งํ ๊ฒฐ๊ณผ๋ฌผ์ ์์ ์ค๋ค.
3-3. WebpackDevServer
๋ฐฉ๊ธ webpack์ผ๋ก ์ค์ต์ ํ๋ฉด์ ๊ณ์ ๋ฐ๋ณต์ค์ธ ๊ฒ์ด ์๋ค.
- webpack.config.js ์ค์ ์์
- webpack์ ์คํ
- ๋ฒ๋ค๋ jsํ์ผ์ index.html์ ์ ์ฉ์ํจ ํ ํ์ธ
์ด ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณต์ค์ด๋ค.
๋ถํธํจ์ ๊ฐ์ ํ๊ธฐ ์ํด webpack ์์ฒด์์ ์ค์๊ฐ์ผ๋ก ์ฝ๋์ ๋ณ๊ฒฝ์ ๋ฐ์ํด์ฃผ๋ WebpackDevServer๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค.
WebpackDevServer Docs์์ ์์ธํ ์ค๋ช ์ ๋ณด๋๋ก ํ์!
์ฌ๊ธฐ๊น์ง babel, webpack ์ ๋ํด ์์๋ดค๋ค.
์ ๋ง ๊ฐ๋ฐ์ ์ฝ์ง์๋ค..ใ ์ด๋ฐ๊ฑฐ ํ๋ ํ๋ ๊ณต๋ถํ ๊ฒ ๋๋ฌด ๋ง์ ๊ฒ ๊ฐ๋ค.