1. Babel์ด๋?
Babel์ ์๋ฐ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ(JavaScript Compiler) ๋ก, ์ต์ ECMAScript(ES6+) ์ฝ๋๊ฐ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ์ ์์ ์ผ๋ก ์คํ๋๋๋ก ๋ณํํด์ฃผ๋ ๋๊ตฌ๋ค.
2. Babel์ด ํ์ํ ์ด์
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊พธ์คํ ๋ฐ์ ํ๋ฉฐ ์๋ก์ด ๋ฌธ๋ฒ(์: let, const, async/await, ํ์ดํ ํจ์ ๋ฑ)์ด ์ถ๊ฐ๋จ. ํ์ง๋ง ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ์ต์ ๋ฌธ๋ฒ์ ์ง์ํ์ง ์์. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Babel์ด ํ์ํจ.
Babel์ ์ฃผ์ ์ญํ :
โ
์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ๋์ ๊ฐ๋ฅํ๋๋ก ๋ณํ
โ
JSX(React์์ ์ฌ์ฉ) ๋ฐ TypeScript ์ฝ๋๋ ๋ณํ ๊ฐ๋ฅ
โ
์ฝ๋ ์ต์ ํ ๋ฐ ํ๋ฌ๊ทธ์ธ ํ์ฅ์ ํตํ ๊ฐ๋ฐ ํ๊ฒฝ ๊ฐ์
3. Babel์ ํต์ฌ ๊ฐ๋
(1) ํธ๋์คํ์ผ๋ง(Transpiling)
Babel์ ์ต์ ๋ฌธ๋ฒ์ ๊ตฌ๋ฌธ์ ์ผ๋ก ๋ณํ(transpile) ํจ. ์ฆ, ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ์ต์ ์ฝ๋๋ฅผ ์ด์ ๋ฒ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํจ.
๐ก ์์ : ES6 ํ์ดํ ํจ์ ๋ณํ
Before (ES6 ์ฝ๋)
const greet = (name) => `Hello, ${name}!`;
After (Babel ๋ณํ ํ ์ฝ๋)
"use strict";
var greet = function(name) {
return "Hello, " + name + "!";
};
์ด์ฒ๋ผ ์ต์ ๋ฌธ๋ฒ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ์ฝ๋๋ก ๋ณํํจ.
(2) Babel Presets (ํ๋ฆฌ์ )
Babel์ ํน์ ๋ฌธ๋ฒ์ ๋ณํํ๊ธฐ ์ํด ํ๋ฆฌ์ (preset) ์ ์ฌ์ฉํจ.
- @babel/preset-env: ์ต์ ES6+ ์ฝ๋๋ฅผ ๋ธ๋ผ์ฐ์ ์ง์ ๋ฒ์์ ๋ง์ถฐ ๋ณํ
- @babel/preset-react: JSX ๋ฌธ๋ฒ์ ๋ณํ
- @babel/preset-typescript: TypeScript ๋ฌธ๋ฒ์ ๋ณํ
4. Babel ์ค์น ๋ฐ ์ฌ์ฉ๋ฒ
(1) Babel ์ค์น
Babel์ ์ฌ์ฉํ๋ ค๋ฉด @babel/core, @babel/cli, @babel/preset-env ๋ฑ์ ์ค์นํด์ผ ํจ.
npm init -y # package.json ์์ฑ
npm install --save-dev @babel/core @babel/cli @babel/preset-env
(2) Babel ์ค์ ํ์ผ ์์ฑ
ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ .babelrc ํ์ผ์ ๋ง๋ค๊ณ ์๋ ๋ด์ฉ์ ์ถ๊ฐํจ.
{
"presets": ["@babel/preset-env"]
}
์ ์ค์ ์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๋ณํํ๋๋ก Babel์ ์ง์ํ๋ ์ญํ ์ ํจ.
(3) Babel ์คํ
๋ณํํ ํ์ผ(script.js)์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์คํํ๋ฉด ๋ณํ๋ ์ฝ๋๊ฐ ์์ฑ๋จ.
npx babel script.js --out-file script-compiled.js
์ด์ script-compiled.js ํ์ผ์ด ๋ณํ๋ ์ฝ๋๋ก ์ ์ฅ๋จ.
5. Babel + Webpack ์ฐ๋
Webpack๊ณผ ํจ๊ป Babel์ ์ฌ์ฉํ๋ฉด, ๊ฐ๋ฐ ํ๊ฒฝ์์ ์๋์ผ๋ก ์ต์ ๋ฌธ๋ฒ์ ๋ณํํ ์ ์์.
(1) Babel ๊ด๋ จ ํจํค์ง ์ถ๊ฐ
npm install --save-dev babel-loader @babel/core @babel/preset-env webpack webpack-cli
(2) webpack.config.js ์ค์
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
},
],
},
mode: 'development',
};
์ด์ Webpack์ด .js ํ์ผ์ ๋ฒ๋ค๋งํ ๋ Babel์ ์ฌ์ฉํ์ฌ ๋ณํํจ.
6. Babel๊ณผ TypeScript
Babel์ TypeScript ์ฝ๋๋ ๋ณํํ ์ ์์.
npm install --save-dev @babel/preset-typescript
.babelrc ์ค์ ์ TypeScript ํ๋ฆฌ์ ์ถ๊ฐ
{
"presets": ["@babel/preset-env", "@babel/preset-typescript"]
}
์ด์ Babel์ ์ฌ์ฉํด TypeScript ์ฝ๋๋ ๋ณํ ๊ฐ๋ฅํจ.
7. Babel์ ํ๊ณ์ ๋์
ํ๊ณ
- Babel์ ์ต์ ๋ฌธ๋ฒ์ ๋ณํํ์ง๋ง ์๋ก์ด ๋ด์ฅ ๊ฐ์ฒด(์: Promise, Set)๋ ๋ณํํ์ง ์์ → Polyfill ํ์
- ์ผ๋ถ ๋ณํ๋ ์ฝ๋๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์
๋์
- SWC: Babel๋ณด๋ค ๋น ๋ฅด๊ฒ ์ฝ๋ ๋ณํ ๊ฐ๋ฅ
- esbuild: ๋ฒ๋ค๋ง๊ณผ ํธ๋์คํ์ผ๋ง์ ๋์์ ์ํ
8. ๊ฒฐ๋ก
Babel์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์์๋ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์คํ๋ ์ ์๋๋ก ๋์์ฃผ๋ ํ์์ ์ธ ๋๊ตฌ์. ํนํ Webpack๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ต์ ์น ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํจ.