babel-transpiling&polyfilling.md

๐Ÿก

Babel

https://babeljs.io/
ํ”Œ๋Ÿฌ๊ทธ์ธ : https://babeljs.io/docs/en/plugins
ํ”„๋ฆฌ์…‹ : https://babeljs.io/docs/en/presets

Babel์ด๋ž€?

  • Babel์€ ์ตœ์‹  JavaScript ๊ตฌ๋ฌธ์„ ํ˜ธํ™˜๋˜๋Š” ์ด์ „ ๋ฒ„์ „์˜ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. (ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง)
  • ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ด์ „ ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ”„๋ฆฌ์…‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ & ํ”„๋ฆฌ์…‹

๋ฐ”๋ฒจ์€ JavaScript ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ”„๋ฆฌ์…‹์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ(plugins) : ํŠน์ • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด "class properties"๋ฅผ ์ง€์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๊ฑฐ๋‚˜ "decorators"๋ฅผ ์ง€์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์€ ์ถ”๊ฐ€์ ์ธ ์„ค์ •์„ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ฆฌ์…‹(presets) : ์ด๊ฒƒ๋“ค์€ ํŠน์ • ๋ฒ„์ „์˜ JavaScript๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์‹  ๋ฒ„์ „์˜ JavaScript์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ํ”„๋ฆฌ์…‹์ด ์žˆ๊ฑฐ๋‚˜, JavaScript ๋ฒ„์ „ ES2015์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ํ”„๋ฆฌ์…‹์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ฆฌ์…‹์€ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

| ์ข…๋ฅ˜ | ๋‚ด์šฉ | ์˜ˆ์‹œ | | --- | --- | --- | | ํ”Œ๋Ÿฌ๊ทธ์ธ | ํŠน์ • ๋‹จ์ผ js ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ (์ฝ”๋“œ ์ž์ฒด๋ฅผ ES5๋กœ ๋ณ€ํ™˜ํ•จ) | const โ‡’ var, class properties | | ํ”„๋ฆฌ์…‹ | ํŠน์ • ๋ฒ„์ „์˜ JavaScript๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์„ ์ง€์›, ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ง‘ํ•ฉ | promise, async & await |


1. Parcel๊ณผ Babel

๐Ÿ‘‰ ์ •ํ™•ํ•œ config๊ณผ, ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
parcel์€ ๊ธฐ๋ณธ๊ฐ’์„ ํ† ๋Œ€๋กœ ์ž๋™์œผ๋กœ babel์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, .babelrc ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ž์„ธํ•œ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • .babelrc
{
  "presets": ["@babel/preset-env"]
}
  • package.json
{
  "name": "my-project",
  "dependencies": {
    "@babel/preset-env": "^7.12.1"
  },
  "babel": {
    "presets": [
      "@babel/preset-env"
    ]
  }
}

2. Webpack๊ณผ Babel

๐Ÿ‘‰ Babel์€ ์ตœ์‹  JavaScript ์ฝ”๋“œ๋ฅผ ์ด์ „ ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ €์™€ ํ˜ธํ™˜๋˜๋Š” JavaScript๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด, ๊ตฌ์กฐ ๋ถ„ํ•ด ๋“ฑ ์ƒˆ๋กœ์šด JavaScript ๊ธฐ๋Šฅ์„ ์ด์ „ ๋ฒ„์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Webpack์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ JavaScript ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฌถ์–ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€ํ˜•์‹œ์ผœ์•ผ ํ• ์ง€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค๋งํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ๋ณ€ํ˜•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Webpack์—์„œ Babel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ฒซ์งธ๋กœ "@babel/core"์™€ "@babel/preset-env"์™€ ๊ฐ™์€ Babel ๋กœ๋”๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Webpack์„ Babel ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด webpack.config.js ํŒŒ์ผ์— ๋ชจ๋“ˆ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“  JavaScript ํŒŒ์ผ์„ Babel ๋กœ๋”๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • webpack.config.js : webpack์—์„œ babel์„ ์„ค์ •ํ•˜๋Š” ์˜ˆ์‹œ
module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"]
          }
        }
      }
    ]
  }

์ด๊ฒƒ์€ Webpack์— .js ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ํŒŒ์ผ(node_modules ํด๋” ์ œ์™ธ)์— ๋Œ€ํ•ด "babel-loader"๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ ๊ฐ์ฒด๋Š” ๋กœ๋”์— ์ „๋‹ฌ๋˜๋ฉฐ "@babel/preset-env" ํ”„๋ฆฌ์…‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ํ™˜๊ฒฝ์— ๋งž๋Š” ํ•„์š”ํ•œ ๋ณ€ํ™˜์„ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ›„, ์ฝ”๋“œ์—์„œ ์ตœ์‹  JavaScript ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, webpack์€ babel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜์—ฌ ์ด์ „ ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ํ˜ธํ™˜๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.


Polyfilling vs Transpiling

  • ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ชจ๋˜ JS ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

Polyfilling vs Transpiling ๊ฐœ์š”

๐Ÿ‘‰ ํด๋ฆฌํ•„๋ง๊ณผ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์€ ๋ชจ๋‘ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜„๋Œ€ JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๊ธฐ์ˆ ์€ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง (Transpiling) : ํ˜„๋Œ€ JavaScript ์ฝ”๋“œ๋ฅผ ์ด์ „ ๋ฒ„์ „์˜ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์‹  ๋ฒ„์ „์˜ JavaScript (ES6)๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ด์ „ ๋ฒ„์ „์˜ JavaScript (ES5)์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Babel๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

ํด๋ฆฌํ•„๋ง (Polyfilling) : ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ˜„๋Œ€ JavaScript ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” JavaScript ์ฝ”๋“œ(ํด๋ฆฌํ•„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์„ ๋ชจ์‚ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ์š”์•ฝํ•˜์ž๋ฉด, ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์€ ์ฝ”๋“œ๋ฅผ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ˜๋ฉด, ํด๋ฆฌํ•„๋ง์€ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์— ์—†๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ˜„๋Œ€ JavaScript ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.

| ๊ธฐ์ˆ  | ์˜์–ด | ES6 ์ฝ”๋“œ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ• | | --- | --- | --- | | ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง | transpilling | ES5๋กœ ๋ณ€ํ™˜ | | ํด๋ฆฌํ•„๋ง | polyfilling | ๋ชจ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ |

๋ฐ”๋ฒจ์€ Polyfilling ๋„๊ตฌ ์ธ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด Transpiling ๋„๊ตฌ ์ธ๊ฐ€์š”? ๐Ÿค”

๐Ÿ‘‰ Babel์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

ํ˜„๋Œ€ JavaScript ์ฝ”๋“œ๋ฅผ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ „ ๋ฒ„์ „์˜ JavaScript๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ฆฌํ•„๋ง๋„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Babel์€ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„์ง ์ง€์›๋˜์ง€ ์•Š๋Š” ECMAScript ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋Šฅ์˜ ๋ˆ„๋ฝ๋œ ๊ตฌํ˜„์„ JavaScript ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Babel์€ ํ•„์š”์— ๋”ฐ๋ผ ํด๋ฆฌํ•„๋ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ๋„๊ตฌ๋ผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

polyfilling์ด๋ž€? ๐Ÿ˜€

  • ES5์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์žฌ๊ตฌํ˜„ํ•˜์—ฌ ๋ฒˆ๋“ค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ex) promise, async & await
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์€ ES6 ์ด์ „์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.(์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ)
    • ๋”ฐ๋ผ์„œ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์„ ๋ชจ์‚ฌํ•˜์—ฌ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํด๋ฆฌํ•„๋ง polyfilling์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

core-js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” polyfill
  • npm i core-js
import "core-js";

ํŠธ๋ฆฌ์‰์ดํ‚น ์˜ˆ์‹œ

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ํƒ์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ–ˆ์„ ๋–„
import "core-js/features/array/find";
import "core-js/features/promise";
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
    • dist : npm\dist\index.8cfc62b9.js
},{"lodash-es":"bXNwz","core-js/modules/esnext.promise.try.js":"9Mfk9"}],"bXNwz":[function(require,module,exports) {
  • ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (30061 โ‡’ 24803์ค„)

image