๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript/๐Ÿ“– study

[11์ฃผ์ฐจ ์Šคํ„ฐ๋””]49์žฅ-Babel๊ณผ Webpack ์ด์š”ํ•œ ES6+/ES.NEXT ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์ถ•

by HomieKim 2022. 4. 8.

Babel๊ณผ WebPack์„ ์ด์šฉํ•œ ES6+/ES.NEXT ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•

  • ๋งค๋…„ ์ƒˆ๋กญ๊ฒŒ ๋„์ž…๋˜๋Š” ES6์ด์ƒ์˜ ๋ฒ„์ „(ES6+)๊ณผ ์ œ์•ˆ ๋‹จ๊ณ„์— ์žˆ๋Š” ES ์ œ์•ˆ ์‚ฌ์–‘(ES.NEXT)์€ ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ์ง€์›์œจ์ด ์ œ๊ฐ๊ฐ
  • ๋”ฐ๋ผ์„œ ์ตœ์‹  ์‚ฌ์–‘์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ชจ๋“ˆ ๋กœ๋”๋„ ํ•„์š”ํ•˜๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ESM ๋ณด๋‹ค ๋ณ„๋„์˜ ๋ชจ๋“ˆ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
    1. IE๋ฅผ ํฌํ•จํ•œ ๊ตฌํ˜„ ๋ธŒ๋ผ์šฐ์ €๋Š” ESM์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    2. ESM์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํŠธ๋žœ์Šค ํŒŒ์ผ๋ง์ด๋‚˜ ๋ฒˆ๋“ค๋ง์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ณ€ํ•จ ์—†์Œ
    3. ESM์ด ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ(bare import ๋“ฑ..)์ด ์กด์žฌ

Babel

  • Babel์€ ํŠธ๋žœ์Šค ํŒŒ์ผ๋ง ๋„๊ตฌ๋กœ ์ตœ์‹  ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” ES5์‚ฌ์–‘์˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ ํ•ด์ฃผ๋Š” ๋„๊ตฌ ์ž…๋‹ˆ๋‹ค.

์„ค์น˜

npm install --save-dev @bable/core @babel/cli

Babel ํ”„๋ฆฌ์…‹ ์„ค์น˜์™€ babel.config.json ์„ค์ •

  • @babel/preset-env ์„ค์น˜ : ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ชจ์•„ ๋‘” ๊ฒƒ
  • Babel์ด ์ œ๊ณตํ•˜๋Š” ๊ณต์‹ ํ”„๋ฆฌ์…‹(official preset)
    • @babel/preset-env
    • @babel/preset-flow
    • @babel/preset-react
    • @babel/preset-typescript
npm install --save-dev @babel/preset-env
  • ์„ค์น˜ํ›„ babel.config.json ํŒŒ์ผ ์ƒ์„ฑ
{
"presets": ["@babel/preset-env"]
}

ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง

  • ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ๋ช…๋ น์–ด package.json์— ๋“ฑ๋ก
"scripts": {
"bulid": "babel src/js -w -d dist/js"
},
  • src/js ํƒ€๊ฒŸ ํด๋”์— ์žˆ๋Š” ๋ชจ๋“  jsํŒŒ์ผ์„ ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•˜์—ฌ dist/jsํด๋”์— ์ €์žฅํ•˜๋Š” ๋ช…๋ น์–ด
    • -w ์˜ต์…˜ : --watch ์˜ต์…˜์˜ ์ถ•์•ฝ, ํƒ€๊นƒํด๋”์— ์žˆ๋Š” ๋ชจ๋“  js ํŒŒ์ผ๋“ค์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ
    • -d ์˜ต์…˜ : --out-dir ์˜ต์…˜์˜ ์ถ•์•ฝ, ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฌผ์ด ์ €์žฅ๋  ํด๋”๋ฅผ ์ง€์ •, ์ง€์ •๋œ ํด๋”๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ

Babel ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

  • ๋ฐ”๋ฒจ ํ™ˆํŽ˜์ด์ง€์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ
  • @babel/plugin-proposal-class-properties: public/private ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ด์คŒ

๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ชจ๋“ˆ ๋กœ๋”ฉ ํ…Œ์ŠคํŠธ

  • ๋ธŒ๋ผ์šฐ์ €๋Š” CommonJS ๋ฐฉ์‹์˜ require ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ์œผ๋กœ ๋ณ„๋„์˜ ์„ค์ •์—†์ด ์‹คํ–‰ํ•˜๋ฉด ์—๋Ÿฌ๋‚จ
  • ๋…ธ๋“œ ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์˜ ES6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก Babel์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜ Webpack์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

Webpack

  • Webpack์€ ์˜์กด ๊ด€๊ณ„์— ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, CSS, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋“ค์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋ง ํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ
  • Webpack์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜์กด ๋ชจ๋“ˆ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋ง ๋˜๋ฏ€๋กœ ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ๋”๊ฐ€ ํ•„์š” ์—†๋‹ค.
  • HTML ํŒŒ์ผ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ script ํƒœ๊ทธ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€๋„ ์‚ฌ๋ผ์ง„๋‹ค.

babel-loader ์„ค์น˜

  • Webpack์ด ๋ชจ๋“ˆ์„ ๋ฒˆ๋“ค๋งํ•  ๋•Œ Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ES6+/ES.NEXT ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ES5 ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•˜๋„๋ก babel-loader ์„ค์น˜.
npm install --save-dev babel-loader

webpack.config.js ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ

const path = require('path');
module.exports = {
entry: './src/js/main.js',
output:{
path: path.resolve(__dirname, 'dist'),
filename: 'js/bundle.js'
},
module: {
rules: [
{
test: /\.js$/,
include: [path.resolve(__dirname, "src/js")],
exclude: /node_modules/,
use:{
loader: "babel-loader",
options: {
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-proposal-class-properties']
}
}
}
]
},
devtool: 'source-map',
mode: 'development'
}

babel-polyfill ์„ค์น˜

  • Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์‹  ์‚ฌ์–‘์˜ ์ฝ”๋“œ๋ฅผ ES5 ์‚ฌ์–‘์˜ ์ฝ”๋“œ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•ด๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
  • Promise, Object.assign, Array.from ๋“ฑ๊ณผ ๊ฐ™์ด ES5 ์‚ฌ์–‘์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ๋˜์ง€ ์•Š์Œ.
  • IE ๊ฐ™์€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์œ„์™€ ๊ฐ™์€ ๊ฐ์ฒด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ @babel/polyfill ์„ค์น˜.

@babel-polyfill์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ ์—์„œ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ --save-dev ์˜ต์…˜ ์ง€์ •ํ•˜์ง€ ์•Š์Œ

  • ES6์˜ import๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ง„์ž…์ ์˜ ์„ ๋‘์—์„œ ํด๋ฆฌํ•„์„ ๋กœ๋“œ
import "@babel/polyfill";
import { pi, power, Foo } from "./lib";
  • Webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ webpack.config.js ํŒŒ์ผ์˜ entry ๋ฐฐ์—ด์— ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€.
module.exports = {
entry: ["@babel/polyfill", "./src/js/main.js"],
};

๋Œ“๊ธ€