새로 추가된 전역 객체들(Promise, Map, ...)을 사용가능한 객체로 바꾸어주는 플러그인이다.
babel을 사용한다고 자바스크립트 최신 함수를 사용할 수 있는 건 아니다. babel은 문법을 변환해주는 역할만 할 뿐이다. polyfill은 프로그램이 처음에 시작될 때 현재 브라우저에서 지원하지 않는 함수( ES6+에서 새롭게 추가된 Promise, WeakMap와 같은 내장메소드나 Array.from, Object.assign와 같은 정적 메소드 )를 검사해서 각 코드 변환을 하는 역할을 한다.
babel
polyfill
babel-polyfill을 추가하거나 transform-runtime(core-js와 regenerator를 포함)을 해야한다.
→ @babel-polyfill의 경우는 상단에만 넣으면 되지만 파일크기가 크고, 전역변수가 오염된다. (deprecated)
→ @babel/plugin-transform-runtime을 사용하면 실제로 코드에서 사용한 폴리필 메서드만 번들에 포함되므로 전역변수가 오염되지 않는다.
→ core-js3 로써 @babel/polyfill의 전역 오염 문제와, @babel/plugin-transform-runtime의 인스턴스 메소드 문제를 모두 해결한다.
👉 Webpack 번들에 포함하고 번들 내부에 가두기
npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime @babel/runtime-corejs3
아래와 같이 추가된다.
// .package.json
{
...
"devDependencies": {
```jsx
// .package.json
{
...
"devDependencies": {
"@babel/plugin-transform-runtime": "^7.12.10",
},
"dependencies": {
"@babel/runtime-corejs3": "^7.12.5",
}
}
```e": "^7.12.10",
},
"dependencies": {
"@babel/runtime-corejs3": "^7.12.5",
}
}
// .babelrc
{
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"absoluteRuntime": false,
"corejs": 3,
"helpers": true,
"regenerator": true,
"useESModules": false
}
]
]
}
// .next.config.js
webpack(config) {
const originalEntry = config.entry;
config.entry = async () => {
const entries = await originalEntry();
if (entries['main.js']) {
entries['main.js'].unshift('./polyfill.js');
}
return entries;
};
config.resolve.modules.push(path.resolve('./'));
return config;
},
map 이라는 메소드의 사용을 위해 polyfill을 설정했지만, 앞으로 es6중 다른 메소드들이 필요할 수 있으니 es6 전체를 추가한다.
// ./polyfill.js
import 'core-js/es6';