Babel
# 프로젝트 폴더 생성
$ mkdir esnext-project && cd esnext-project
# package.json 생성
$ npm init -y
# bable-core, babel-cli 설치
$ npm install --save-dev @babel/core @babel/cli
@babel/preset-env를 설치해야 한다@babel/preset-env과 함께 사용되어야 하는 Babel 플러그인을 모아둔 것이다@babel/preset-env는 필요한 플러그인들을 프로젝트 지원 환경에 맞춰 동적으로 결정해 준다. 프로젝트 지원 환경은 Browserslist 형식으로 .browerslistrc 파일에 상세히 설정할 수 있다.# @babel/preset-env 설치
$ npm install --save-dev @babel/preset-env
babel.config.json 설정 파일을 생성하고 아래와 같이 작성한다{
"presets":["@babel/preset-env"]
}
{
"name":"esnext-project",
"version":"1.0.0",
"scripts":{
"build": "babel src/js -w -d dist/js"
},
"devDependencies":{
"@babel/cli": "^7.10.3",
"@babel/core": "^7.10.3",
"@babel/preset-env": "^7.10.3",
}
}
-w는 타깃 폴더에 있는 모든 자바스크립트 파일들의 변경을 감지하여 자동으로 트랜스파일한다-d는 트랜스파일링된 결과물이 저장될 폴더를 지정한다. 만약 지정된 폴더가 존재하지 않으면 자동 생성한다// src/js/lib.js
export const pi = Math.PI; // ES6 모듈
export function power(x,y) {
return x ** y;
}
// ES6 클래스
export class Foo {
#private = 10;
foo() {
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 * 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
$ npm install --save-dev @babel/plugin-proposal-class-properties
babel.config.json 설정 파일을 아래와 같이 수정한다{
"presets":["@babel/preset-env"],
"plugins":["@babel/plugin-proposal-class-properties"]
}
npm run build를 입력하여 트랜스파일링을 실행하면 성공할 수 있다.Webpack
$ npm insatll --save-dev webpack webpack-cli
$ npm install --save-dev babel-loader
{
"name":"esnext-project",
"version":"1.0.0",
"scripts":{
"build": "webpack -w"
},
"devDependencies":{
"@babel/cli": "^7.10.3",
"@babel/core": "^7.10.3",
"@babel/preset-env": "^7.10.3",
"webpack":"^4.43.0",
"webpack-cli":"^3.3.12"
}
}
//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: {
rule: [
{
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",
};
npm run build 명령어를 통해 Webpack을 실행하면 dist/js 폴더에 bundle.js가 생성되었다. 이 파일을 main.js, lib.js 모듈이 하나로 번들링된 결과물이다. index.html을 다음과 같이 수정하고 브라우저에서 실행해보자<!DOCTYPE html>
<html>
<body>
<script src="dist/js/bundle.js"></script>
</body>
</html>
//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());
// polyfill이 필요한 코드
console.log(
new Promise((resolve, resject) => {
setTimeout(() => resolve(1), 100);
})
);
// polyfill이 필요한 코드
console.log(Object.assign({}, { x: 1 }, { y: 2 }));
// polyfill이 필요한 코드
console.log(Array.from([1, 2, 3], (v) => v + v));
다시 트랜스파일링과 번들링을 실행한 다음, dist/js/bundle.js를 확인해보자.
console.log(new Promise(function (resolve, reject) {
setTimeout(function ()
return resolve(1);
}, 100);
})); // polyfill이 필요한 코드
// polyfill이 필요한 코드
console.log(Object.assign({}, {
x: 1
}, {
y: 2
}));
// polyfill이 필요한 코드
console.log(Array.from([1, 2, 3], function (v) {
return v + v;
}));
$npm install @babel/polyfill
@babel/polyfill은 개발 환경에서만 사용해야하는 것이 아니라 실제 운영 환경에서도 사용해야한다. 따라서 —save-dev 옵션을 지정하지 않는다.
ES6의 import를 사용하는 경우에는 진입점의 선두에서 먼저 폴리필을 로드하도록 한다.
import "@babel/polyfill";
import { pi, power, Foo } from "./lib";
...
const path = require('path');
module.exports = {
...
entry: ['@babel/polyfill', './src/js/main.js'],
...
}