๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Frontend

๋ฐ”๋ฒจ(Babel) ์„ค์ •ํ•˜๊ธฐ

๋ฐ”๋ฒจ(Babel)์„ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

  • ๋ฐ”๋ฒจ์€  ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋กœ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, JSX ํฌํ•จ)๊ฐ€ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•˜๋„๋ก ๋ณ€ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.
  • ์‹คํ–‰์ด ์•ˆ๋˜๋Š” ๊ตฌ๋ฒ„์ „ ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํฌํ•  ๋•Œ์— ์˜ˆ์ „ ๋ฐฉ์‹์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐฐํฌํ•˜๋ ค๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ”๋ฒจ ๋นŒ๋“œ ๊ณผ์ •

  1. ํŒŒ์‹ฑ(Parsing): ์ฝ”๋“œ๋ฅผ ๋ถ„ํ•ดํ•˜๋Š” ๊ณผ์ •
  2. ๋ณ€ํ™˜(Transforming): ES6 -> ES5 ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •
  3. ์ถœ๋ ฅ(Printing): ๋ณ€๊ฒฝ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ณผ์ •

 

ํ”Œ๋Ÿฌ๊ทธ์ธ

  • ๋ฐ”๋ฒจ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฐ”๋ฒจ์ด ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ•  ์ง€์— ๋Œ€ํ•œ ๊ทœ์น™์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘ ๋งŒ๋“  ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ž˜ ๋งŒ๋“ค์–ด์ง„ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ex) .babelrc

{
  "plugins": ["transform-decorators-legacy", "transform-class-properties"]
}

 

 

ํ”„๋ฆฌ์…‹

ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ผ์ผ์ด ์„ค์ •ํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šด๋ฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ธํŠธ๋กœ ๋ชจ์•„ ๋†“์€ ๊ฒƒ์„ ํ”„๋ฆฌ์…‹์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋ฒจ์ด ์ œ๊ณตํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํ”„๋ฆฌ์…‹ 

  • @babel/preset-env
    • preset-env๋Š” ES5๋ฅผ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
  • @babel/preset-react
  • @babel/preset-typescript
  • @babel/preset-flow
    • preset-flow, preset-react, preset-typescript๋Š” flow, ๋ฆฌ์•กํŠธ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ฆฌ์…‹์ž…๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์†Œ์Šค์™€ ๊ฐ™์ด ํƒ€๊นƒ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ex) .babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "chrome": "72"
        }
      }
    ]
  ]
}

 

 

ํด๋ฆฌํ•„

ํด๋ฆฌํ•„์€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ(Promise ๊ฐ™์€ ๊ฐ์ฒด๋“ค์€ ES5์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

๋Ÿฐํƒ€์ž„์— ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋‚˜ ๊ธฐ๋Šฅ์„ ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด Object.FromEntries๋ฅผ caniuse์—์„œ ํ™•์ธํ•ด ๋ณด๋ฉด chrome 72 ๋ฒ„์ „์—์„œ๋Š” ์ง€์›์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

chrome 73 ๋ฒ„์ „ ์ด์ƒ๋ถ€ํ„ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ chrome 72 ๋ฒ„์ „์—์„œ๋Š” Object.FromEnties๋Š” function์ด ์•„๋‹ˆ๋ผ๋Š” ์—๋Ÿฌ ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

useBuiltIns ์˜ต์…˜

  • usage
    • ์‹ค์ œ ํ•„์š”ํ•œ ํด๋ฆฌํ•„์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค.
  • entry
    • ํƒ€๊นƒ ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ํŠน์ • ๋ชจ๋“ˆ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ฐธ๊ณ 

 

ex) .babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "chrome": "72" // ๋ชจ๋ฐ”์ผ์›น ์•ˆ๋“œ๋กœ์ด๋“œ ๋””๋ฐ”์ด์Šค ์ง€์›(๊ฐค๋Ÿญ์‹œ S8(v.8))
        },
        "useBuiltIns": "usage", // ํด๋ฆฌํ•„ ์‚ฌ์šฉ ๋ฐฉ์‹ (entry)
        "corejs": 3, // ํด๋ฆฌํ•„ ๋ฒ„์ „
        "shippedProposals": true
      }
    ]
  ]
}
import 'core-js/stable';
import 'regenerator-runtime/runtime';

์ฐธ๊ณ