๐ Reference
: copilot ์ ์๋

WebPack์
๋ชจ๋ ๋ฒ๋ค๋ฌ(Module Bundler)์ ๋๋ค. WebPack์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ํ๋์ ํ์ผ๋ก ํฉ์ณ์ฃผ๋ ์ญํ ์ ์ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํ๋์ ๋ฒ๋ค๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๐ก ๋ชจ๋ ๋ฒ๋ค๋ฌ(Module Bundler)๋?
: ์ฌ๋ฌ ๊ฐ์ JS ํ์ผ์ ํ๋์ ๋ฒ๋ค ํ์ผ๋ก ๊ฒฐํฉํ๊ณ , ํ์ํ ๋ชจ๋๋ค์ ๋ก๋ํ ์ ์๋๋ก ํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค. ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ์์(HTML, CSS, JS, ์ด๋ฏธ์ง ๋ฑ)์ ๋ชจ๋ ๊ฐ๊ฐ์ ๋ชจ๋๋ก ๋ณด๊ณ ์ด๋ฅผ ์กฐํฉํด์ ๋ณํฉ๋ ํ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋์ถํด๋ด๋ ๋๊ตฌ์ ๋๋ค.
โ ์ค๋ณต๋ ์ด๋ฆ์ผ๋ก ์ธํ ์ถฉ๋์ ๋ฐฉ์ง, ํ์ผ ์ ์ก ์๋ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ.
: Webpack์ ํ์คํ๋ ๋ชจ๋ํ ๊ธฐ๋ฒ์ด ๋ฑ์ฅํ ES2015๋ถํฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ ์ด์ ์๋ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ฐ์ ธ์์ง๋ง, Webpack์ ์ฌ์ฉํ๋ฉด import/export ๊ตฌ๋ฌธ์ ํตํด ๋ชจ๋์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
: Webpack์ ๊ฐ ๋ชจ๋์ ๋
๋ฆฝ์ ์ธ ์คํ ์์ญ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ค์ฝํ(์ฝ๊ฒ ์ค๋ช
ํ๋ฉด, ์ ์ญ ๋ณ์ ํน์ ์ง์ญ๋ณ์์ ๊ฐ์ด ๋ณ์๊ฐ ์ ํจํ ๋ฒ์๋ฅผ ์๋ฏธํ๋ค.) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ก ์ธํด ๋ค์ํ ๋ณ์ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์์กด์ฑ ๊ด๋ฆฌ๋ ํธ๋ฆฌํ๊ฒ ํ ์ ์์ต๋๋ค.
: Webpack์ ์์์ (Entry point)์ผ๋ก๋ถํฐ ์์กด์ ์ธ ๋ชจ๋์ ์ฐพ์ ํ๋์ ๋ฒ๋ค ํ์ผ๋ก ๋ง๋ญ๋๋ค. ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฌผ์ Output์ด๋ผ๊ณ ํฉ๋๋ค.
: Webpack์ npm์ ํตํด ์ค์นํ ์ ์์ผ๋ฉฐ CLI๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋งจ๋๋ผ์ธ์์ ์คํํ ์ ์์ต๋๋ค.
// test.js
export function sum(x, y){
return x + y;
}
// app.js
import * as test from "./test.js";
console.log(test.sum(1, 2));
Webpack์ ์์ ๊ฐ์ ๋ชจ๋ํ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ฒ๋ค๋งํ ์ ์์ต๋๋ค. ์นํฉ์ ์ฌ์ฉํ๋ฉด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ๋ชจ๋ ๊ด๋ฆฌ๋ฅผ ํธ๋ฆฌํ๊ฒ ํ ์ ์์ต๋๋ค.
Babel์ ํ์ฌ ๋ฐ ์ด์ ๋ธ๋ผ์ฐ์ ๋๋ ํ๊ฒฝ์์
ECMAScript 2015+ (ES6 ์ด์)์ฝ๋๋ฅผ ์ด์ ๋ฒ์ ์ JavaScript๋ก ๋ณํํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ ํด์ฒด์ธ์ ๋๋ค.
Babel์ JS ๊ฐ๋ฐ์๋ค์ด ํญ์ ์ต์ ๋ฌธ๋ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฝ๋ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์ ๋๋ค. Babel์ ์ฌ์ฉํ๋ฉด ES6 ์ด์์ ์ต์ ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ ์ฝ๋๋ฅผ ES5 ์ดํ์ ์์ ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ ๊ฒ์ฒ๋ผ ์์ค ์ฝ๋ ๋ด์ ํํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
โ ์์ ๊ฐ์ด ํํ๊ฐ ๋ฐ๋ ์ฝ๋๋ ์ต์ ๋ฌธ๋ฒ์ ์ง์ํ๋ ์คํ ํ๊ฒฝ ๋ฟ๋ง ์๋๋ผ ์์ง ์ต์ ๋ฌธ๋ค์ด ์ ์ฉ๋์ง ์์ ์คํ ํ๊ฒฝ์์๋ ๋ฌธ์ ์์ด ์๋ํฉ๋๋ค.
: Babel์ ES6 ์ด์์ ๋ฌธ๋ฒ์ ์ง์ํ์ง ์๋ ํ๊ฒฝ์์๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ๋ณํํฉ๋๋ค.
: Babel์ ES6 ์ด์์ ์ต์ ๋ฌธ๋ฒ ๋ฟ๋ง ์๋๋ผ TypeScript๋ React์ JSX๋ก ์์ฑ๋ ์ฝ๋๋ฅผ JavaScript๋ก ๋ณํํ ์ ์์ต๋๋ค.
: Babel์ ํ๋ฌ๊ทธ์ธ๊ณผ ํ๋ฆฌ์ ์ ํตํด ๋ฌธ๋ฒ ๋ณํ ๊ท์น์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก์ ํธ๋ณ ์ํ๋ ๊ท์น์ ์ ์ฉํ๊ฑฐ๋ ๋ค์ํ ๊ท์น์ ํ ๋ฒ์ ์ ์ฉํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ์ @babel/core , @babel/cli ํจํค์ง๋ฅผ ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ์ค์นํฉ๋๋ค.
์ ์ฒด ์ค์ ํ์ผ(project-wide)์ ์๋์ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
babel.config.js ํ์ผ์ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์ ์์ฑํฉ๋๋ค.// babel.config.js
const presets = ['@babel/preset-react'];
const plugins = [
['@babel/plugin-transform-template-literals', { loose : true }]
];
module.exports = { presets, plugins };
// ํด๋น ์ค์ ์ ๋ฆฌ์กํธ ํ๋ฆฌ์
์ ์ฌ์ฉํ๋ฉฐ, ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด ํ๋ฌ๊ทธ์ธ์ loose ์ต์
์ ๋ฃ์์ต๋๋ค.
์ง์ญ ์ค์ ํ์ผ(file-relative)์ ์๋์ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
.babelrc ํ์ผ์ ํ๋ก์ ํธ ๋ด ํด๋น ํ์ผ์ ์ปดํ์ผํ ์ฝ๋์ ๋์ผํ ๊ฒฝ๋ก์ ์์ฑํฉ๋๋ค.// .babelrc
{
"plugins" : [
"@babel/plugin-transform-arrow-functions",
"@babel/plugin-transform-template-literals"
]
}
// ์ง์ญ ์ค์ ํ์ผ์ ํ๋ฌ๊ทธ์ธ์ ๋ํด์๋ง ์ค์ ํ๋ฉฐ, ๋์ผํ ๊ฒฝ๋ก์ ์๋ ์ฝ๋ ํ์ผ์ ์ ์ฉ๋ฉ๋๋ค.
์ปดํ์ผ
src ํด๋์ ์ฝ๋๋ฅผ dist ํด๋๋ก ์ปดํ์ผํ๋ ์ฝ๋์
๋๋ค.npx babel src --out-dir dist
์ง์ญ ์ค์ ํ์ผ์ ์ ์ฒด ์ค์ ํ์ผ์ ๋ฎ์ด์์ฐ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ฉฐ, ๋์ผํ ํ๋ฌ๊ทธ์ธ์ด๋ ํ๋ฆฌ์ ์ ๋ํ ์ค์ ์ด ์๋ค๋ฉด ์ง์ญ ์ค์ ํ์ผ์ด ์ฐ์ ๋ฉ๋๋ค. ์ด์ ๊ฐ์ด ์ค์ ํ์ผ์ ์ ์ฐํ๊ฒ ํ์ฉํ์ฌ Babel์ ์ฌ์ฉํฉ๋๋ค.