기술에 발전해가면서 모든 언어도 계속해서 발전해왔다.
JavaScript역시 발전해왔다.
대부분의 브라우저는 ES6이상의 버전을 지원하지만, 사양 문제로 인해 ES6버전보다 아래의 버전을 지원하는 구형 브라우저들이 있다.
이 경우,Babel
은 버전을 변환해준다.
즉, 브라우저의 하위 호환성을 생각해서 ES6로 코드를 작성하여도 구형브라우저가 이를 인식할 수 있도록 ES5로 변환시켜준다.
[1, 2, 3].map((n) => n ** n);
// ES5
"use strict";
[1, 2, 3].map(function (n) {
return Math.pow(n, n);
});
Babel
을 사용하면, 위의 코드처럼 ES5이하의 버전으로 변환할 수 있다.
Babel CLI
란 터미널에서 커맨드를 입력해서babel
을 사용하기 위한 패키지
npm
을 사용해서 Babel CLI
를 설치할 수 있다.👊 프로젝트 폴더 생성
$ mkdir es6-project && cd es6-project
👊 package.json 생성
$ npm init -y
👊 babel-core, babel-cli 설치
$ npm install --save-dev @babel/core @babel/cli
설치 이후, package.json
파일은 아래와 같으며 불필요한 설정은 삭제.
{
"name": "es6-project",
"version": "1.0.0",
"devDependencies": {
"@babel/cli": "^7.7.0",
"@babel/core": "^7.7.2"
}
}
Babel을 사용하기 위해선
@babel/preset-env
를 설치해야한다.
@babel/preset-env
는 함께 사용해야하는 Babel 플러그인을 모아 둔 것으로Babel 프리셋
이다.
[ 👩💻 BABEL 프리셋 ]
- @babel/preset-env
- @babel/preset-flow
- @babel/preset-react
- @babel/preset-typescript
@babel/preset-env
는 필요한 플러그인들을 프로젝트 지원환경에 맞춰 동적으로 결정해준다..browserslistrc
파일에 상세히 설정 가능하다.👊 env preset 설치
$ npm install --save-dev @babel/preset-env
{
"name": "es6-project",
"version": "1.0.0",
"devDependencies": {
"@babel/cli": "^7.7.0",
"@babel/core": "^7.7.2",
"@babel/preset-env": "^7.7.1"
}
}
.babelrc
파일을 생성한 뒤 아래처럼 작성한다.{
"presets": ["@babel/preset-env"]
}
@babel/preset-env
를 사용하겠다는 의미Babel을 사용해서
ES6+
코드를ES5
이하의 코드로 트랜스파일링하기 위해서 Babel CLI 명령어를 사용할 수 있지만,npm script
를 사용하여 트랜스파일링할 수 있다.
{
"name": "es6-project",
"version": "1.0.0",
"scripts": {
"build": "babel src/js -w -d dist/js"
},
"devDependencies": {
"@babel/cli": "^7.7.0",
"@babel/core": "^7.7.2",
"@babel/preset-env": "^7.7.1"
}
}
// src/js/lib.js -> 루트에 src/js폴더 생성 후 lib.js와 main.js 추가
// ES6 모듈
export const pi = Math.PI;
export function power(x, y){
// ES7: 지수 연산자
return x ** y;
}
// ES6 클래스
export class Test {
// stage 3: 클래스 필드 정의 제안
#private = 10;
test() {
// stage 4: 객체 Reset/Spread 프로퍼티
const { a, b, ...x } = { ... { a: 1, b: 2}, c: 3, d: 4};
return {a, b, x};
}
test2(){
return this.#private;
}
}
// src/js/main.js
// ES5 모듈
import {pi, test, Test} from './lib';
console.log(pi);
console.log(test(pi, pi));
const t = new Test();
console.log(t.test());
console.log(t.test2());
$ npm run build
> es6-project@1.0.0 build /Users/leeungmo/Desktop/es6-project
> babel src/js -w -d dist/js
SyntaxError: /Users/leeungmo/Desktop/es6-project/src/js/lib.js: Unexpected character '#' (12:2)
10 | export class Test {
11 | // stage 3: 클래스 필드 정의 제안
> 12 | #private = 10;
| ^
13 |
14 | test() {
15 | // stage 4: 객체 Rest/Spread 프로퍼티
...
다만, @babel/preset-env
는 현재 제안 단계 사양에 대한 플러그인을 지원하지 않기 때문에 에러가 발생한다.
별도의 플러그인을 설치해야 한다.
설치가 필요한 플러그인은 Babel 홈페이지에서 찾아볼 수 있다.
클래스 필드 정의 제안 플러그인을 검색해야하므로Class field
를 검색한다.
@babel/plugin-proposal-class-properties
설치. (검색한 플러그인임)$ npm install --save-dev @babel/plugin-proposal-class-properties
{
"name": "es6-project",
"version": "1.0.0",
"scripts": {
"build": "babel src/js -w -d dist/js"
},
"devDependencies": {
"@babel/cli": "^7.7.0",
"@babel/core": "^7.7.2",
"@babel/plugin-proposal-class-properties": "^7.7.0",
"@babel/preset-env": "^7.7.1"
}
}
.babelrc
파일에 추가{
"presets": ["@babel/preset-env"],
"plugins": ["@babel/plugin-proposal-class-properties"]
}
npm run build
> es6-project@1.0.0 build /Users/leeungmo/Desktop/es6-project
> babel src/js -w -d dist/js
Successfully compiled 2 files with Babel.
dist/js
폴더가 자동으로 생성된다.$ node dist/js/main
3.141592653589793
36.4621596072079
{ a: 1, b: 2, x: { c: 3, d: 4 } }
10
위에서 ES5로 변환이 문제없이 실행되는 것을 확인했다.
또한, ES6 모듈의 import export
키워드도 트랜스파일링되어 모듈 기능도 동작하였다.
그러나, 모듈 기능은 node.js
환경에서 동작한 것이고, Babel이 모듈을 트랜스파일링한 것도 node.js
가 기본적으로 지원하는 CommonJS
방식의 module loadiing system
에 따른 것이다.
// dist/js/main.js
"use strict";
var _lib = require("./lib");
cosole.log(_lib.pi);
console.log((0, _lib.test)(_lib.pi, _lib.pi));
var t = new _lib.Test();
console.log(t.test());
console.log(t.test2());
CommonJS
방식의 module loading system(require함수)
를 지원하지 않는다.<<!DOCTYPE html>
<html>
<body>
<script src="dist/js/lib.js"></script>
<script src="dist/js/main.js"></script>
</body>
</html>
Uncaught ReferenceError: exports is not defined
at lib.js:3
main.js:3 Uncaught ReferenceError: require is not defined
at main.js:3
Webpack
을 통해 해결할 수 있다.