Come installo la libreria babel-polyfill?


140

Ho appena iniziato a usare Babel per compilare il mio codice javascript ES6 in ES5. Quando inizio a utilizzare Promises sembra che non funzioni. Il sito web Babel afferma il supporto per le promesse tramite polyfill.

Senza fortuna, ho provato ad aggiungere:

require("babel/polyfill");

o

import * as p from "babel/polyfill";

Con ciò visualizzerò il seguente errore sul bootstrap della mia app:

Impossibile trovare il modulo 'babel / polyfill'

Ho cercato il modulo ma sembra che qui manchi qualcosa di fondamentale. Ho anche provato ad aggiungere il vecchio e buon NPM bluebird ma sembra che non funzioni.

Come usare i polyfill di Babel?


1
npm install _name_
dandavis,

1
NOTA: Babel ora ha un pacchetto NPM separato per questo: babel-polyfill
Stijn de Witt

1
@StijndeWitt solo per salvarti un clic, ecco il file README.md completo nella versione completa:
gurghet,

1
@gurghet Sì, avrebbero potuto aggiungere qualche informazione in più, sono d'accordo :) Ma tutto quello che devi sapere è npm install --save babel-polyfille require('babel-polyfill).
Stijn de Witt,

1
Dato che stai usando ES6, puoi anche usare import "babel-polyfill".
Ama Hasija

Risposte:


66

Questo è cambiato un po 'in Babel V6.

Dai documenti:

Il polyfill emulerà un ambiente ES6 completo. Questo polyfill viene caricato automaticamente quando si utilizza il nodo babele.

Installazione:
$ npm install babel-polyfill

Utilizzo in Nodo / Browserify / Webpack:
per includere il polyfill è necessario richiederlo nella parte superiore del punto di ingresso dell'applicazione.
require("babel-polyfill");

Utilizzo nel browser:
disponibile dal dist/polyfill.jsfile in una babel-polyfillversione npm. Questo deve essere incluso prima di tutto il codice Babel compilato. È possibile anteporre al codice compilato o includerlo in un <script>prima.

NOTA: non utilizzare requiretramite browserify ecc., Utilizzare babel-polyfill.


6
Non sono ancora del tutto sicuro su quando sia necessario il polyfill. Perché i moduli ES6 funzionano solo con babel.js ma Array.protorype.findIndex()non funzionano senza il polyfill e babel non solleverà un'eccezione durante la traspilazione? È quella la natura di un Polyfill ™?
Ricorda il

5
Fondamentalmente il polyfill di Babel è solo github.com/facebook/regenerator e github.com/zloirock/core-js messi insieme. Dai un'occhiata a quei 2 repository per sapere se in realtà hai bisogno dei polyfill.
vdclouis,

7
Penso che il motivo per cui uno funziona e l'altro no è che Babel, durante la trascrizione, prende di mira un ipotetico motore JS con un certo livello di supporto. I browser reali possono finire per supportare più o meno di questo ipotetico motore. In pratica, penso che l'ipotetico browser a cui si rivolgono sia da qualche parte a livello di IE10, quindi i browser più vecchi potrebbero avere dei problemi. Inserendo le correzioni per questo in un polifill separato, lasciano la decisione se si desidera supportare tali browser meno recenti. Un po 'come jQuery con il suo ramo 1.0 che lo fa e il ramo 2.0 che non supporta IE8. @RemEmber
Stijn de Witt

2
@dougmacklin se findIndex è l'unico polyfill di cui hai bisogno, puoi semplicemente includerlo da qualche parte nel tuo codice. Controlla MDN per polyfill: developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
vdclouis

1
@vdclouis, come faresti a includere quel codice polyfill tramite webpack in modo che sia disponibile ovunque nel progetto?
Douglas

48

I documenti di Babel descrivono questo in modo abbastanza conciso:

Babel include un polyfill che include un runtime di rigeneratore personalizzato e core.js.

Questo emulerà un ambiente ES6 completo. Questo polyfill viene caricato automaticamente quando si utilizzano babel-node e babel / register.

Assicurati di averlo richiesto nel punto di accesso alla tua applicazione, prima di chiamare qualsiasi altra cosa. Se stai usando uno strumento come il webpack, diventa abbastanza semplice (puoi dire al webpack di includerlo nel bundle).

Se si utilizza uno strumento come gulp-babelo babel-loader, è necessario installare anche il babelpacchetto stesso per utilizzare il polyfill.

Si noti inoltre che per i moduli che influenzano l'ambito globale (polyfill e simili), è possibile utilizzare un'importazione concisa per evitare di avere variabili non utilizzate nel modulo:

import 'babel/polyfill';

4
Solo per aggiungere una nota, e non sono sicuro al 100% se questo è del tutto corretto, ma ho provato a usarlo import 'babel-core/polyfill'senza installarlo babele ha funzionato bene.
Nathan Lutterman,

2
Zaemz , immagino tu abbia già installato Babel, quindi import 'babel-core/polifyll'funziona. L'ho provato senza installato babele non ha funzionato per me. A proposito: ssube advis funziona.
WebBrother,

4
Quando usi il webpack dove lo includi?
theptrk,

2
@theptrk Usando il webpack, puoi semplicemente importarlo come modulo, poiché il webpack consente di importare pacchetti npm. Per Karma, lo configuri come file da includere prima dei test.
ssube,

3
Grazie, forse avevo una versione diversa ma dovevo usare invece babel-core => "import 'babel-core / polyfill';
theptrk,

22

Per Babel versione 7, se stai usando @ babel / preset-env, per includere polyfill tutto ciò che devi fare è aggiungere un flag "useBuiltIns" con il valore di "utilizzo" nella configurazione di babel. Non è necessario richiedere o importare polyfill nel punto di ingresso della tua app.

Con questo flag specificato, babel @ 7 ottimizzerà e includerà solo i polyfill di cui hai bisogno.

Per utilizzare questo flag, dopo l'installazione:

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

Aggiungi semplicemente la bandiera:

useBuiltIns: "usage" 

al tuo file di configurazione di babel chiamato "babel.config.js" (anche nuovo per Babel @ 7), nella sezione "@ babel / env":

// file: babel.config.js

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

   return { presets };
};

Riferimento:


Aggiornamento agosto 2019:

Con il rilascio di Babel 7.4.0 (19 marzo 2019) @ babel / polyfill è obsoleto. Invece di installare @ babe / polyfill, installerai core-js:

npm install --save core-js@3

Una nuova voce corejsviene aggiunta a babel.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 };
};

vedi esempio: https://github.com/ApolloTang/stackoverflow-eg--babel-v7.4.0-polyfill-w-core-v3

Riferimento:


1
Lo usi in ambiente di produzione? qualche rischio?
Roy,

useBuiltIns: "usage"non funziona dalla mia parte. Semplicemente non include alcun polyfils nel bundle (esempio: utilizzo i generatori e viene visualizzato l'errore "rigeneratorRuntime non definito"). Qualche idea?
WebBrother,

@WebBrother, funziona per me ... vedi ad esempio: github.com/ApolloTang/stackoverflow-eg--babel-polyfill
apollo

@Roy, attualmente sto migrando un progetto aziendale da babel @ 6 a babel @ 7 in modo da poter usare @ babel / preset-dattiloscritto. Questo è ancora un lavoro in corso, ma sto seguendo le istruzioni del documento ufficiale di Babel (vedi link di riferimento nella mia risposta). Finora tutto sembra funzionare, ma non ho ancora inviato il mio lavoro di migrazione / aggiornamento al QA, pubblicherò qui in caso di problemi.
aprile

19

Se il tuo pacchetto.json è simile al seguente:

  ...
  "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",
  ...

E ricevi il Cannot find module 'babel/polyfill'messaggio di errore, quindi probabilmente devi solo cambiare la tua dichiarazione di importazione DA:

import "babel/polyfill";

PER:

import "babel-polyfill";

E assicurati che venga prima di qualsiasi altra importaffermazione (non necessariamente nel punto di ingresso della tua domanda).

Riferimento: https://babeljs.io/docs/usage/polyfill/


3
In questa risposta il pacchetto babel-polyfill è elencato in "devDependencies". Ciò comporterà un babf-polyfill non incluso nella distribuzione. Non è necessario installare babel-polyfill con -D flag ma con -S flag in modo che sia elencato in "dipendenze" e quindi incluso nella distribuzione.
apollo,

9

Prima di tutto, l'ovvia risposta che nessuno ha fornito, devi installare Babel nella tua applicazione:

npm install babel --save

(o babel-corese invece lo desideri require('babel-core/polyfill')).

A parte questo, ho un compito grugnito di traspilare il mio es6 e jsx come un passo di costruzione (cioè non voglio usare babel/register, motivo per cui sto cercando di usarebabel/polyfill direttamente in primo luogo), quindi mi piacerebbe porre maggiormente l'accento su questa parte della risposta di @ssube:

Assicurati di averlo richiesto nel punto di accesso alla tua applicazione, prima di chiamare qualsiasi altra cosa

Mi sono imbattuto in qualche strano problema in cui stavo cercando di richiedere babel/polyfillda un file di avvio dell'ambiente condiviso e ho ricevuto l'errore a cui l'utente ha fatto riferimento - Penso che potrebbe aver avuto a che fare con il modo in cui le importazioni di babel richiedono rispetto alle importazioni ma non riesco a riprodurre adesso. Comunque, commoventeimport 'babel/polyfill' come prima riga negli script di avvio sia del mio client che del server ha risolto il problema.

Nota che se invece vuoi usare require('babel/polyfill')mi assicurerei che anche tutte le altre istruzioni del caricatore del modulo siano necessarie e non utilizzino le importazioni - evita di mescolare le due cose. In altre parole, se sono presenti dichiarazioni di importazione nello script di avvio, creare import babel/polyfillla prima riga nello script anziché require('babel/polyfill').



8

babel-polyfill consente di utilizzare l'intero set di funzionalità ES6 oltre le modifiche alla sintassi. Ciò include funzionalità come nuovi oggetti incorporati come Promises e WeakMap, nonché nuovi metodi statici come Array.from o Object.assign.

Senza babel-polyfill, babel ti consente di utilizzare solo funzioni come le funzioni freccia, destrutturazione, argomenti predefiniti e altre funzionalità specifiche della sintassi introdotte in 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

Come Babel dice nei documenti , per Babel> 7.4.0 il modulo @ babel / polyfill è deprecato , quindi si consiglia di utilizzare direttamente le librerie core-js e rigenerator-runtime che prima erano incluse in @ babel / polyfill.

Quindi questo ha funzionato per me:

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

quindi aggiungi all'inizio del tuo file js iniziale:

import 'core-js/stable';
import 'regenerator-runtime/runtime';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.