babel-polyfill 라이브러리를 어떻게 설치합니까?


140

방금 Babel을 사용하여 ES6 자바 스크립트 코드를 ES5로 컴파일하기 시작했습니다. 약속을 사용하기 시작하면 작동하지 않는 것 같습니다. Babel 웹 사이트는 polyfill을 통한 약속 지원을 명시합니다.

운이 없다면 나는 다음을 추가하려고 시도했다.

require("babel/polyfill");

또는

import * as p from "babel/polyfill";

이를 통해 앱 부트 스트랩에서 다음과 같은 오류가 발생합니다.

'babel / polyfill'모듈을 찾을 수 없습니다

모듈을 검색했지만 여기에 근본적인 부분이 빠져있는 것 같습니다. 또한 오래되고 좋은 블루 버드 NPM을 추가하려고 시도했지만 작동하지 않는 것 같습니다.

바벨의 폴리 필을 사용하는 방법?


1
npm install _name_
dandavis 2016 년

1
참고 : Babel은 이제이를위한 별도의 NPM 패키지를 갖습니다
Stijn de Witt

1
@StijndeWitt는 클릭을 저장하기 위해 여기에 정식 버전의 전체 README.md 파일이 있습니다.
gurghet

1
@gurghet 그래 그들이 거기에 좀 더 많은 정보를 추가 할 수 동의 :하지만 당신은 정말 알아야 할 모든은 npm install --save babel-polyfillrequire('babel-polyfill).
Stijn de Witt

1
ES6을 사용하고 있으므로 가져 오기 "babel-polyfill"을 사용할 수도 있습니다.
Love Hasija

답변:


66

이것은 babel v6에서 약간 변경되었습니다.

문서에서 :

폴리 필은 전체 ES6 환경을 에뮬레이트합니다. 이 폴리 필은 babel-node를 사용할 때 자동으로로드됩니다.

설치:
$ npm install babel-polyfill

Node / Browserify / Webpack에서의 사용법 : polyfill
을 포함하려면 응용 프로그램의 진입 점 상단에 polyfill이 필요합니다.
require("babel-polyfill");

브라우저에서의 사용법 : npm 릴리스 내의 파일에서
사용 가능합니다 . 컴파일 된 모든 Babel 코드 앞에 포함시켜야합니다. 컴파일 된 코드 앞에 추가하거나 앞에 포함시킬 수 있습니다.dist/polyfill.jsbabel-polyfill<script>

참고 : require이것을 browserify 등을 통해 사용 하지 마십시오 babel-polyfill.


6
폴리 필이 언제 필요한지 아직 확실하지 않습니다. ES6 모듈은 왜 babel.js와 함께 작동하지만 polyfill Array.protorype.findIndex()없이는 작동하지 않으며 babel은 코드 변환시 예외를 발생시키지 않습니까? 이것이 Polyfill ™의 특성입니까?
RemEmber

5
기본적으로 Babel 폴리 필은 github.com/facebook/regeneratorgithub.com/zloirock/core-js가 결합 된 것입니다. 폴리 필이 실제로 필요한지 확인하려면이 2 개의 저장소를 확인하십시오.
vdclouis

7
바벨이 변환 할 때 특정 수준의 지원을 제공하는 가상 JS 엔진을 대상으로하기 때문에 하나가 작동하고 다른 하나는 작동하지 않습니다. 실제 브라우저는이 가상 엔진보다 더 많거나 적은 지원을 할 수 있습니다. 실제로 나는 그들이 목표로하는 가상 브라우저가 IE10 레벨에 있다고 생각하므로 구형 브라우저에는 문제가있을 수 있습니다. 이것에 대한 수정 사항을 별도의 polyfill에 넣으면 이전 브라우저를 지원할지 여부를 결정하게됩니다. jQuery는 1.0 브랜치와 IE8을 지원하지 않는 2.0 브랜치가 약간 있습니다. @RemEmber
Stijn de Witt

2
@dougmacklin findIndex가 필요한 유일한 polyfill이라면 코드의 어딘가에 포함시킬 수 있습니다. 폴리 필에 대한 MDN 확인 : developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
vdclouis

1
@ vdclouis, 프로젝트의 모든 곳에서 사용할 수 있도록 webpack을 통해 폴리 필 코드를 포함시키는 방법은 무엇입니까?
dougmacklin

48

바벨의 문서는 매우 간결이 설명 :

Babel에는 사용자 정의 재생기 런타임 및 core.js가 포함 된 폴리 필이 포함되어 있습니다.

전체 ES6 환경을 에뮬레이트합니다. 이 폴리 필은 babel-node 및 babel / register를 사용할 때 자동으로로드됩니다.

다른 항목을 호출하기 전에 응용 프로그램의 시작점에 필요한지 확인하십시오. webpack과 같은 도구를 사용하는 경우 매우 간단 해집니다 (웹팩에 번들에 포함하도록 지시 할 수 있음).

gulp-babel또는 과 같은 도구 를 사용하는 경우 polyfill을 사용하려면 패키지 자체를 babel-loader설치해야합니다 babel.

또한 전역 범위 (폴리 필 등)에 영향을주는 모듈의 경우, 모듈에 사용되지 않은 변수가 없도록하기 위해 간결한 가져 오기를 사용할 수 있습니다.

import 'babel/polyfill';

4
메모를 추가하기 만하면 이것이 완전히 올바른지 100 % 확신 할 수는 없지만 import 'babel-core/polyfill'설치하지 않고 사용하려고 시도했지만 babel정상적으로 작동했습니다.
Nathan Lutterman

2
Zaemz , 나는 이미 babel을 설치했다고 생각 import 'babel-core/polifyll'합니다. 설치하지 않고 시도했지만 효과 babel가 없었습니다. 그런데 ssube 는 작동합니다.
WebBrother

4
웹팩을 사용할 때 어디에 포함합니까?
theptrk

2
@theptrk webpack을 사용하면 웹 패키지를 사용하여 간단히 npm 패키지를 가져올 수 있으므로 모듈로 가져올 수 있습니다. Karma의 경우 테스트하기 전에 포함 할 파일로 설정합니다 .
ssube

3
고마워요, 아마도 다른 버전이 있었지만 대신 babel-core를 사용해야했습니다. => "import 'babel-core / polyfill';
theptrk

22

Babel 버전 7의 경우 @ babel / preset-env를 사용하는 경우 polyfill을 포함하려면 babel 구성에서 'usage'값으로 'useBuiltIns'플래그를 추가하면됩니다. 앱의 진입 점에서 폴리 필을 요구하거나 가져올 필요가 없습니다.

이 플래그를 지정하면 babel @ 7이 최적화하고 필요한 폴리 필 만 포함합니다.

설치 후이 플래그를 사용하려면 다음을 수행하십시오.

npm install --save-dev  @babel/core @babel/cli @babel/preset-env
npm install --save @babel/polyfill

간단히 플래그를 추가하십시오.

useBuiltIns: "usage" 

"@ babel / env"섹션 아래의 "babel.config.js"라는 babel 구성 파일 (Babel @ 7에도 새로 추가됨)에

// file: babel.config.js

module.exports = () => {
   const presets = [
      [
         "@babel/env", 
         { 
             targets: { /* your targeted browser */ },
             useBuiltIns: "usage"  // <-----------------*** add this
         }
      ]
   ];

   return { presets };
};

참고:


2019 년 8 월 업데이트 :

Babel 7.4.0 (2019 년 3 월 19 일) 릴리스에서는 @ babel / polyfill이 더 이상 사용되지 않습니다. @ babe / polyfill을 설치하는 대신 core-js를 설치합니다.

npm install --save core-js@3

corejsbabel.config.js에 새로운 항목 이 추가됩니다

// file: babel.config.js

module.exports = () => {
   const presets = [
      [
         "@babel/env", 
         { 
             targets: { /* your targeted browser */ },
             useBuiltIns: "usage",
             corejs: 3  // <----- specify version of corejs used
         }
      ]
   ];

   return { presets };
};

예를 참조하십시오 : https://github.com/ApolloTang/stackoverflow-eg--babel-v7.4.0-polyfill-w-core-v3

참고:


1
프로덕션 환경에서 이것을 사용합니까? 어떤 위험?
Roy

useBuiltIns: "usage"내 편에서 작동하지 않습니다. 번들에 폴리 파일이 포함되어 있지 않습니다 (예 : 생성기를 사용하고 "regeneratorRuntime is not defined"오류가 발생 함). 어떤 아이디어?
WebBrother

@WebBrother, 나를 위해 일 ... 참조 : github.com/ApolloTang/stackoverflow-eg--babel-polyfill
apollo

@Roy, 실제로 엔터프라이즈 프로젝트를 babel @ 6에서 babel @ 7로 마이그레이션하여 @ babel / preset-typescript를 사용할 수 있습니다. 이것은 여전히 ​​진행중인 작업이지만 babel 공식 문서의 지시를 따르고 있습니다 (내 답변의 참조 링크 참조). 지금까지 모든 것이 작동하는 것 같지만 아직 마이그레이션 / 업그레이드 작업을 품질 보증팀에 보내지 않았습니다. 문제가 발생하면 여기에 게시하겠습니다.
apollo

19

package.json이 다음과 같은 경우

  ...
  "devDependencies": {
    "babel": "^6.5.2",
    "babel-eslint": "^6.0.4",
    "babel-polyfill": "^6.8.0",
    "babel-preset-es2015": "^6.6.0",
    "babelify": "^7.3.0",
  ...

그리고 Cannot find module 'babel/polyfill'오류 메시지가 나타나면 아마도 import 문을 FROM으로 변경해야합니다.

import "babel/polyfill";

에:

import "babel-polyfill";

그리고 다른 import진술 보다 먼저 나오는지 확인하십시오 (응용 프로그램의 시작점에 반드시있는 것은 아님).

참조 : https://babeljs.io/docs/usage/polyfill/


3
이 답변에서 babel-polyfill 패키지는 'devDependencies'에 나열되어 있습니다. 이렇게하면 babel-polyfill이 배포에 포함되지 않습니다. babel-polyfill을 -D 플래그와 함께 설치하고 -S 플래그와 함께 설치하여 '종속성'아래에 나열되므로 배치에 포함되어야합니다.
apollo

9

첫째, 아무도 제공하지 않은 확실한 대답은 응용 프로그램에 Babel을 설치해야합니다.

npm install babel --save

(또는 babel-core대신 원하는 경우 require('babel-core/polyfill')).

그 외에도 es6 및 jsx를 빌드 단계로 변환하는 지저분한 작업이 있습니다 (즉 babel/register, 사용하고 싶지 않기 babel/polyfill때문에 처음부터 직접 사용하려고하는 이유입니다 ). @ssube의 대답 에서이 부분을 더 강조하십시오.

다른 항목을 호출하기 전에 응용 프로그램의 시작점에서 요구해야합니다.

babel/polyfill공유 환경 시작 파일에서 요구하려고하는 이상한 문제가 발생하여 사용자가 참조 한 오류가 발생했습니다. 지금. 어쨌든 import 'babel/polyfill'클라이언트와 서버 시작 스크립트 모두에서 첫 번째 줄로 이동 하면 문제가 해결되었습니다.

대신 사용하려는 경우 require('babel/polyfill')다른 모든 모듈 로더 문도 필요하고 가져 오기를 사용하지 않아야합니다. 두 가지를 혼합하지 마십시오. 다시 말해, 시작 스크립트에 import 문이있는 경우 스크립트 import babel/polyfill에서 첫 줄을 작성하십시오 require('babel/polyfill').


9
당신은 실행해야 그나마 sudoNPM의와 docs.npmjs.com/getting-started/fixing-npm-permissions
블라디미르 Starkov

8

babel-polyfill을 사용하면 구문 변경 이외의 모든 ES6 기능을 사용할 수 있습니다. 여기에는 Promises 및 WeakMap과 같은 새로운 내장 객체와 같은 기능과 Array.from 또는 Object.assign과 같은 새로운 정적 메소드가 포함됩니다.

babel-polyfill이 없으면 babel은 화살표 기능, 구조 해제, 기본 인수 및 ES6에 도입 된 기타 구문 별 기능과 같은 기능 만 사용할 수 있습니다.

https://www.quora.com/What-does-babel-polyfill-do

https://hackernoon.com/polyfills-everything-you-ever-wanted-to-know-or-maybe-a-bit-less-7c8de164e423


0

Babel이 문서 에서 말했듯이 Babel> 7.4.0의 경우 @ babel / polyfill 모듈 은 더 이상 사용되지 않으므로 이전에 @ babel / polyfill에 포함 된 core-js재생기 런타임 라이브러리를 직접 사용하는 것이 좋습니다 .

그래서 이것은 나를 위해 일했습니다 :

npm install --save core-js@3.6.5
npm install regenerator-runtime

그런 다음 초기 js 파일의 맨 위에 추가하십시오.

import 'core-js/stable';
import 'regenerator-runtime/runtime';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.