ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ, ํŒŒ์ด์–ดํญ์Šค, ์—ฃ์ง€ ๊ฐ™์€ ์—๋ฒ„๊ทธ๋ฆฐ ๋ธŒ๋ผ์šฐ์ €์˜ ES6 ์ง€์›์œจ์€ ์•ฝ 98%๋กœ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ ES6 ์‚ฌ์–‘์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ IE 11์˜ ES6 ์ง€์›์œจ์€ ์•ฝ 11%์ด๊ณ . ES6 ์ด์ƒ์˜ ๋ฒ„์ „(ES6+)๊ณผ ์ œ์•ˆ ๋‹จ๊ณ„์— ์žˆ๋Š” ES ์ œ์•ˆ ์‚ฌ์–‘(ES.NEXT)์€ ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ์ง€์›์œจ์ด ๋‹ค๋ฅธ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ES6+์™€ ES.NEXT์˜ ์ตœ์‹  ESCMAScript ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ์ตœ์‹  ์‚ฌ์–‘์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ IE๋ฅผ ํฌํ•จํ•œ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฌธ์ œ ์—†์ด ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ES6 ๋ชจ๋“ˆ(ESM)์™ธ์˜ ๋ณ„๋„์˜ ๋ชจ๋“ˆ ๋กœ๋”๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • IE๋ฅผ ํฌํ•จํ•œ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๋Š” ESM์„ ์ง€์›X
  • ESM์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์ด๋‚˜ ๋ฒˆ๋“ค๋ง์ด ํ•„์š”ํ•จ
  • ESM์ด ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ(bare import ๋“ฑ)์ด ์žˆ๊ณ  ์ ์ฐจ ํ•ด๊ฒฐ๋˜๊ณ  ์žˆ์ง€๋งŒ ์•„์ง ๋ช‡ ๊ฐ€์ง€ ์ด์Šˆ๊ฐ€ ์กด์žฌ

ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ์ธ Bable๊ณผ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ธ Webpack์„ ์ด์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Babel

Babel์€ ES6+/ES.NEXT๋กœ ๊ตฌํ˜„๋œ ์ตœ์‹  ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ IE ๊ฐ™์€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” ES5 ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋กœ ๋ณ€ํ™˜(ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ES6์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€ ES7์˜ ์ง€์ˆ˜ ์—ฐ์‚ฐ์ž๋ฅผ Babel์„ ํ†ตํ•ด ES5 ์‚ฌ์–‘์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// ES6+
[1, 2, 3].map(n => n ** n);

// ES5
"use strict";

[1, 2, 3].map(function (n) {
  return Math.pow(n, n);
});

 

์ด์ฒ˜๋Ÿผ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ์œ„ํ•œ Babel์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Babel ์„ค์น˜

npm์„ ์‚ฌ์šฉํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด Babel์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

 

# ํ”„๋กœ์ ํŠธ ํด๋” ์ƒ์„ฑ
$ mkdir esnext-project
$ cd esnext-project

# package.json ์ƒ์„ฑ
$ npm init -y

# babel-core, babel-cli ์„ค์น˜
$ npm install --save-dev @babel/core @babel/cli

 

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„ package.json ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

Babel ํ”„๋ฆฌ์…‹ ์„ค์น˜์™€ babel.config.json ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ

Babel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด @babel/preset-env๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

@bebel/preser-env๋Š” ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ชจ์•„ ๋‘” ๊ฒƒ์œผ๋กœ Babel ํ”„๋ฆฌ์…‹์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ Bebel์ด ์ œ๊ณตํ•˜๋Š” ๊ณต์‹ Babel ํ”„๋ฆฌ์…‹(official preset)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • babel/preset-env
  • babel/preset-flow
  • babel/preset-react
  • babel/preset-typescript

์ด๋Ÿฌํ•œ @bebel/preset-env๋Š” ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ํ”„๋กœ์ ํŠธ ์ง€์› ํ™˜๊ฒฝ์— ๋งž์ถฐ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•ด ์ค๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ง€์› ํ™˜๊ฒฝ์€ Browserslist ํ˜•์‹์œผ๋กœ .browserslistrc ํŒŒ์ผ์— ์ƒ์„ธํžˆ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ ์„ค์ •์€ ๋ชจ๋“  ES6+/ES.NEXT ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

$npm install --save-dev @babel/preset-env

 

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„ pakage.json ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์— babel.config.json ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด @babel/preset-env๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

{
  "presets": ["@babel/preset-env"]
}

 

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

Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ES6+/ES.NEXT ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ES5 ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•˜๊ธฐ ์œ„ํ•ด์„œ Babel CLI ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค๋ฒˆ Babel CLI ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ npm scripts์— Babel CLI ๋ช…๋ น์–ด๋ฅผ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

package.json ํŒŒ์ผ์— scripts๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ์™„์„ฑ๋œ package.json ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

์œ„ npm scripts์˜ build๋Š” src/js ํด๋”(ํƒ€๊นƒ ํด๋”)์— ์žˆ๋Š” ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์„ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ฆฐํ•œ ํ›„, ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์„ dist/js ํด๋”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•œ ์˜ต์…˜์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • -w : ํƒ€๊นƒ ํด๋”์— ์žˆ๋Š” ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ. (--watch ์˜ต์…˜์˜ ์ถ•์•ฝํ˜•) 
  • -d : ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์ด ์ €์žฅ๋  ํด๋”๋ฅผ ์ง€์ •. ๋งŒ์•ฝ ์ง€์ •๋œ ํด๋”๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™ ์ƒ์„ฑ (--out-dir ์˜ต์…˜์˜
    ์ถ•์•ฝํ˜•)

 

 

๋‹ค์Œ์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์— src/js ํด๋”๋ฅผ ์ƒ์„ฑํ•œ ํ›„ lib.js์™€ main.js๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

// src/js/lib.js
export const pi = Math.PI; // ES6 ๋ชจ๋“ˆ

export function power(x, y) {
  return x ** y; // ES7: ์ง€์ˆ˜ ์—ฐ์‚ฐ์ž
}

// ES6 ํด๋ž˜์Šค
export class Foo {
  #private = 10; // stage 3: ํด๋ž˜์Šค ํ•„๋“œ ์ •์˜ ์ œ์•ˆ

  foo() {
    // stage 4: ๊ฐ์ฒด Rest/Spread ํ”„๋กœํผํ‹ฐ ์ œ์•ˆ
    const { a, b, ...x } = { ...{ a: 1, b: 2 }, c: 3, d: 4 };
    return { a, b, x };
  }

  bar() {
    return this.#private;
  }
}
// src/js/main.js
import { pi, power, Foo } from './lib';

console.log(pi);
console.log(power(pi, pi));

const f = new Foo();
console.log(f.foo());
console.log(f.bar());

 

ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$npm run build

 

ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์— ์„ฑ๊ณตํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์— dist/js ํด๋”๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง๋œ main.js์™€ lib.js๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง๋œ main.js๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

๋งŒ์•ฝ ์ถ”๊ฐ€ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Babel ํ™ˆํŽ˜์ด์ง€ ์ƒ๋‹จ ๋ฉ”๋‰ด์˜ Search๋ž€์— ์ œ์•ˆ ์‚ฌ์–‘์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

์œ„์—์„œ ์‚ดํŽด๋ณธ ์˜ˆ์ œ์˜ ๋ชจ๋“ˆ ๊ธฐ๋Šฅ์€ Node.js ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•œ ๊ฒƒ์ด๊ณ  Babel์ด ๋ชจ๋“ˆ์„ ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•œ ๊ฒƒ๋„ Node.js๊ฐ€ ๊ธฐ๋ณธ ์ง€์›ํ•˜๋Š” CommonJS ๋ฐฉ์‹์˜ ๋ชจ๋“ˆ ๋กœ๋”ฉ ์‹œ์Šคํ…œ์— ๋”ฐ๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ src/js/main.js๊ฐ€ Babel์— ์˜ํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง๋œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

 

// dist/js/main.js
"use strict";

var _lib = require("./lib");

// src/js/main.js
console.log(_lib.pi);
console.log((0, _lib.power)(_lib.pi, _lib.pi));
var f = new _lib.Foo();
console.log(f.foo());
console.log(f.bar());

 

๋ธŒ๋ผ์šฐ์ €๋Š” CommonJS ๋ฐฉ์‹์˜ requrie ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์œ„์—์„œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด index.html์„ ์ž‘์„ฑํ•˜์—ฌ HTML ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

<!DOCTYPE html>
<html>
<body>
  <script src="dist/js/lib.js"></script>
  <script src="dist/js/main.js"></script>
</body>
</html>

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” Webpack์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Webpack

Webpack์€ ์˜์กด ๊ด€๊ณ„์— ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, CSS, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋“ค์„ ํ•˜๋‚˜(๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ)์˜ ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. Webpack์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

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

 

Webpack ์„ค์น˜

ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Webpack์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

 

$npm install --save-dev webpack webpack-cli

 

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„ package.js ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

babel-loader ์„ค์น˜

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

 

$npm install --save-dev babel-loader

 

npm scripts๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ Babel ๋Œ€์‹  Webpack์„ ์‹คํ–‰ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๋ฉด package.json ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

 

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

webpack.config.js๋Š” Webpack์ด ์‹คํ–‰๋  ๋•Œ ์ฐธ์กฐํ•˜๋Š” ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์— webpack.config.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

const path = require('path');

module.exports = {
  // entry file
  // https://webpack.js.org/configuration/entry-context/#entry
  entry: './src/js/main.js',
  // ๋ฒˆ๋“ค๋ง๋œ js ํŒŒ์ผ์˜ ์ด๋ฆ„(filename)๊ณผ ์ €์žฅ๋  ๊ฒฝ๋กœ(path)๋ฅผ ์ง€์ •
  // https://webpack.js.org/configuration/output/#outputpath
  // https://webpack.js.org/configuration/output/#outputfilename
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'js/bundle.js'
  },
  // https://webpack.js.org/configuration/module
  module: {
    rules: [
      {
        test: /\.js$/,
        include: [
          path.resolve(__dirname, 'src/js')
        ],
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  devtool: 'source-map',
  // https://webpack.js.org/configuration/mode
  mode: 'development'
};

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Babel์ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  Webpack์ด ๋ฒˆ๋“ค๋ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

 

Webpack์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ, dist/js ํด๋”์— bundle.js๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด ํŒŒ์ผ์€ main.js, lib.js ๋ชจ๋“ˆ์ด ํ•˜๋‚˜๋กœ ๋ฒˆ๋“ค๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์ž…๋‹ˆ๋‹ค. index.html์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ์—†์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
<body>
  <script src="./dist/js/bundle.js"></script>
</body>
</html>

 

babel-polyfill ์„ค์น˜

Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ES6+/ES.NEXT ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ES5 ์‚ฌ์–‘์˜ ์†Œ์Šค์ฝ”๋“œ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•ด๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ES6์—์„œ ์ถ”๊ฐ€๋œ Promise, Object.assign, Array.from ๋“ฑ์€ ES5 ์‚ฌ์–‘์— ๋Œ€์ฒดํ•  ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง๋˜์ง€ ๋ชปํ•˜๊ณ  ๊ทธ๋ž˜๋„ ๋‚จ์Œ

๋”ฐ๋ผ์„œ IE ๊ฐ™์€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ Promise, Object.assign, Array.from ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @babel/polyfill์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

$npm install @babel/polyfill

 

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„ package.json ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

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

 

ES6์˜ inport์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ง„์ž…์ ์˜ ์„ ๋‘์—์„œ ๋จผ์ € ํด๋ฆฌํ•„์„ ๋กœ๋“œํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

// src/js/main.js
import "@babel/polyfill";
import { pi, power, Foo } from './lib';
...

 

Webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์œ„ ๋ฐฉ๋ฒ• ๋Œ€์‹  webpack.config.js ํŒŒ์ผ์˜ entry ๋ฐฐ์—ด์— ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

const path = require('path');

module.exports = {
  // entry file
  // https://webpack.js.org/configuration/entry-context/#entry
  entry: ['@babel/polyfill', './src/js/main.js'],
...

 

์œ„์™€ ๊ฐ™์ด webpack.config.js ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ํด๋ฆฌํ•„์„ ๋ฐ˜์˜ํ•˜์—ฌ Webpack์„ ์‹คํ–‰ํ•˜๋ฉด dist/js/bundle.js์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋ฆฌํ•„์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

269๊ฐœ์˜ ๊ทธ๋ฆผ๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ์„ค๋ช…์œผ๋กœ ‘์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ’๋ฅผ ์ดํ•ดํ•˜์ž! ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ ํƒœ์–ด๋‚œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณผ๋„

wikibook.co.kr