๐Ÿ“Œ babel

Babel์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์•„๋ž˜์˜ ์—ญํ• ์„ ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

  • ๊ตฌ๋ฌธ ๋ณ€ํ™˜
  • ๋Œ€์ƒ ํ™˜๊ฒฝ์— ๋ˆ„๋ฝ๋œ ํด๋ฆฌํ•„ ๊ธฐ๋Šฅ
  • ์†Œ์Šค ์ฝ”๋“œ ๋ณ€ํ™˜

Polyfill์ด๋ž€, ๊ตฌ๋ฉ๋‚œ ๋ฒฝ์„ ์ถฉ์ „ํ•ด์ฃผ๋Š” ์†œ์„ ๋งํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” babel์ด globalThis์™€ ๊ฐ™์ด ๋ชจ๋“  ๊ฒƒ์„ ์ปดํŒŒ์ผ ํ•ด์ฃผ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ด ๋•Œ, core-js๋ผ๋Š” ํด๋ฆฌํ•„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ vs ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ

  1. ์ปดํŒŒ์ผ๋Ÿฌ

ํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  1. ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ

ํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋น„์Šทํ•œ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์œ„ํ‚คํ”ผ๋””์•„์— ๋”ฐ๋ฅด๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ํฐ ๋ฒ”์ฃผ์— ์†ํ•ด์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์‚ฌ์šฉ

  1. ๋ณ„๋„์˜ build ์‹œ์Šคํ…œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— built-in์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

$npm i -D @babel/core @babel/cli @babel/preset-env

  1. babel ๊ตฌ์„ฑํŒŒ์ผ ์„ค์ •
1
2
3
4
5
6
7
8
9
10
11
12
13
// babel.config.js
module.exports = {
comments: false,
presets: [
[
"@babel/preset-env",
{
useBuiltIns: "usage",
corejs: "3.26.0",
},
],
],
};

useBuiltIns ์˜ต์…˜์€ ํด๋ฆฌํ•„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์„ฑํ•œ๋‹ค. usage ์˜ต์…˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด core-js 3๋ฒ„์ „์„ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค.

$npm i core-js@3

babel ๊ตฌ์„ฑํŒŒ์ผ์— target์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ target์€ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €๊นŒ์ง€ ํ˜ธํ™˜๋˜๋„๋ก ํ• ์ง€ ๋ฒ”์œ„๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๊ธฐ์ค€์ด ๋œ๋‹ค.

1
2
3
4
5
// .browserslistrc
> 0.25% in KR
last 2 versions
node > 16
ie 9-11

target์€ .browserslistrc ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค.

  • ie 11 : ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ 11๋งŒ
  • last 2 versions : ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ ๊ทธ ์ด์ „๋ฒ„์ „๊นŒ์ง€
  • last 2 node versions : node ์ตœ์‹ ๋ฒ„์ „๊ณผ ๊ทธ ์ด์ „๋ฒ„์ „๊นŒ์ง€
  • not dead : ์—…๋ฐ์ดํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€

์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์•„๋ž˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ 

https://browsersl.ist/

  1. package.json์— ๋ช…๋ น์–ด ๋“ฑ๋ก
1
2
3
4
5
6
7
8
9
// package.json
{
"scripts": {
...
"compile": "cross-var babel $npm_package_config_file_input -o $npm_package_config_file_output",
"compile:dir": "cross-var babel $npm_package_config_folder_input -d $npm_package_config_folder_output",
"watch:compile": "npm run compile -- --watch",
}
}

ํŒŒ์ผ์„ compile ํ•ด์ค„ ์ˆ˜ ์žˆ๊ณ  ํด๋”๋ฅผ compile ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
watch ์˜ต์…˜ ์ถ”๊ฐ€ํ•˜๋ฉด ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์–ด ์ €์žฅ๋  ๋•Œ๋งˆ๋‹ค compile ์ž๋™ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๐Ÿ“ ์†Œ๊ฐ

babel, webpack์€ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ œ๋Œ€๋กœ ์•Œ์•„๋‘๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ž์„ธํ•œ ์„ค์ •๋“ค์€ babel ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋„๋ก ํ•˜์ž.