01. ES6 -> babel
https://epiphany0421.tistory.com/186
babel을 쓰는 이유
- 크로스 브라우징
- JavaScript (ES6) -> JavaScript(ES5)로 변환해줍니다. (브라우저 하위 호환성을 생각)
- 각 브라우저마다 JavaScript 엔진이 다르지만, 모든 브라우저에서 동작하도록 호환성을 지켜줍니다.
- 폴리필(polyfill)
- 폴리필은 개발자가 특정 기능이 지원되지 않는 브라우저를 위해 사용할 수 있는 코드 조각이나 플러그인을 의미합니다.
- 폴리필은 프로그램이 처음에 시작될 때 현재 브라우저에서 지원하지 않는 함수를 검사해서 각 object의 prototype에 붙여주는 역할을 합니다.
babel은 최신 문법을 하위 기기나 브라우저에서 사용하도록 도와주는 역할을 함
https://poiemaweb.com/es6-babel-webpack-1
Babel 은 최신 문법을 ES5 이하의 코드로 변환(트랜스파일링)할 수 있다.
1. npm 설치
package.json 파일 생성됨
2. babel 설치
node_modules 과 package-lock.json 생성
package.json
plugin : 실제로 코드를 변환하는 기능
ex) @babel/plugin-transfrom-arrow-functions // ES6 화살표 함수 문법
필요한걸 하나씩 다 설치하기 힘드므로 preset 을 사용
루트 디렉터리에 .babelrc 파일 생성
설치한 @babel/preset-env를 사용하겠다는 코드 작성
트랜스파일링
Babel을 사용하여 ES6+ 코드를 ES5 이하의 코드로 트랜스파일링하기 위해
Babel CLI 명령어를 사용하거나, npm script를 사용하여 트랜스파일링
package.json 파일에 scripts를 추가한다.
src/js 폴더(타깃 폴더)에 있는 모든 ES6+ 파일들을 트랜스파일링한 후, 그 결과물을 dist/js 폴더에 저장한다.
-w
타깃 폴더에 있는 모든 파일들의 변경을 감지하여 자동으로 트랜스파일한다. (--watch 옵션의 축약형)
-d
트랜스파일링된 결과물이 저장될 폴더를 지정한다. (--out-dir 옵션의 축약형)
여기까지 결과 테스트
프로젝트 루트에 src/js 폴더를 생성한 후 lib.js와 main.js를 추가한다.
기존 글에서는 preset-env 가 Class 문법에 대한 plugin 을 지원하지 않아서 추가로 해당 플러그인을 설치하여 다시 빌드한다. 해당 글에 비해 시간이 많이 지나 오류 없이 성공하는것을 볼 수 있음.
만약 오류가 있다면 해당 문법에 대한 plugin 을 따로 설치해야함..!
package.json 파일에 추가 된 것을 확인
.babelrc 파일에 추가
트랜스파일링에 성공하면 프로젝트 루트에 dist/js 폴더가 자동 생성되고 트랜스파일링된 main.js와 lib.js가 저장된다.
node dist/js/main.js 로 실행이 가능해짐!
기존에 node main.js 로 실행이 안되었나? 확인
gpt 한테 물어봤는데
이 오류는 ES 모듈을 사용하려는데 Node.js가 이를 인식하지 못하기 때문에 발생합니다.
package.json에 "type": "module"을 추가하거나 파일 확장자를 .mjs로 변경해 보세요.
--> 해봐도 안됨
1.6 브라우저에서 모듈 로딩 테스트
main.js와 lib.js 모듈을 트랜스파일링하여 ES5로 변환된 main.js을 실행한 결과, 문제없이 실행되는 것을 확인
하지만 모듈 기능은 node.js 환경에서 동작한 것이고 Babel이 모듈을 트랜스파일링한 것도 node.js가 기본 지원하는 CommonJS 방식의 module loading system에 따른 것이다.
브라우저는 CommonJS 방식의 module loading system(require 함수)을 지원하지 않으므로 위에서 트랜스파일링된 결과를 그대로 브라우저에서 실행하면 에러가 발생한다.
프로젝트 루트 폴더에 아래와 같이 index.html을 작성
실행시 다음과 같은 오류 발생
Webpack 을 이용하여 해결 가능 하다. !
이외 출처