Startseite>Programmierbezogen>Anderer Quellcode

Dieser einfache Ansatz kann jedoch möglicherweise eine Menge unnötigen Code enthalten. Die in diesem Repository implementierten Babel-Plugins fügen die Polyfills automatisch in Ihren Code ein und versuchen dabei, nur das zu laden, was wirklich benötigt wird. Dies geschieht basierend auf Ihren Kompilierungszielen und dem, was Sie in Ihrem Code verwenden.

Diese Plugins (wir nennen sie „Polyfill-Anbieter“) unterstützen verschiedene Injektionsmethoden , um Ihren Anforderungen besser gerecht zu werden.

Wenn Sie beispielsweise Importe in es-shims Polyfills injizieren möchten, indem Sie die fehlenden Funktionen zu den globalen Objekten hinzufügen, können Sie Babel wie folgt konfigurieren:

Konfiguration Eingabecode Ausgabecode
{
  "targets" : { "firefox" : 65 },
  "plugins" : [
    [ " polyfill-es-shims " , {
      "method" : " usage-global "
    }]
  ]
}
 Promise . allSettled ( [
  p1 ,
  p2
] ) . finally ( ( ) => {
  console . log ( "Done!" ) ;
} ) ; 
{ console.log("Done!"); });">
 import "promise.prototype.finally/auto" ;
import "promise.allsettled/auto" ;

Promise . allSettled ( [
  p1 ,
  p2
] ) . finally ( ( ) => {
  console . log ( "Done!" ) ;
} ) ;

Wenn Sie weitere Konfigurationsbeispiele sehen möchten, können Sie die Migrationsdokumente überprüfen: docs/migration.md .

Wenn Sie mehr über alle von diesen Plugins unterstützten Optionen erfahren möchten, können Sie sich die Nutzungsdokumente ansehen: docs/usage.md .

Unterstützte Polyfüllungen

Polyfill Plugin Methoden
core-js@2 babel-plugin-polyfill-corejs2 entry-global , usage-global und usage-pure
core-js@3 babel-plugin-polyfill-corejs3 entry-global , usage-global und usage-pure
es-shims babel-plugin-polyfill-es-shims usage-global und usage-pure
regenerator-runtime babel-plugin-polyfill-regenerator entry-global , usage-global und usage-pure

Wir unterstützen weiterhin core-js und es-shims , empfehlen Ihnen jedoch, einen Anbieter für Ihr eigenes Polyfill oder für Ihr Lieblingspolyfill zu implementieren! Eines unserer Ziele besteht darin, den Wettbewerb zwischen verschiedenen Polyfills zu fördern, um die verschiedenen Kompromisse wie Spezifikationskonformität und Codegröße besser auszubalancieren.

Wenn Sie Unterstützung für eine benutzerdefinierte Polyfüllung implementieren möchten, können Sie @babel/helper-define-polyfill-provider verwenden. ( docs/polyfill-provider.md .)

Injektionsmethoden

Polyfill-Plugins können drei verschiedene Injektionsmethoden verfügbar machen: entry-global , usage-global und usage-pure . Beachten Sie, dass Polyfill-Plugins die erforderlichen Pakete nicht automatisch zu Ihren Abhängigkeiten hinzufügen. Sie müssen sie daher explizit in Ihrer package.json auflisten.

Bei allen Beispielen wird davon ausgegangen, dass Sie auf Chrome 62 abzielen.

  • Die entry-global Methode ersetzt einen einzelnen einfachen Import in die gesamte Polyfüllung durch Importe in die spezifischen Funktionen, die von den Zielumgebungen nicht unterstützt werden. Dies ist am nützlichsten, wenn Sie sicherstellen möchten, dass jede nicht unterstützte Funktion verfügbar ist, unabhängig davon, was Sie in dem Code verwenden, den Sie mit Babel kompilieren. Möglicherweise möchten Sie diese Methode verwenden, wenn:

    1. Sie kompilieren Ihre Abhängigkeiten nicht, möchten aber sicher sein, dass sie über alle erforderlichen Polyfills verfügen.
    2. Die Erkennungslogik von Babel ist nicht intelligent genug, um zu verstehen, welche Funktionen Sie verwenden.
    3. Sie möchten eine einzige gebündelte Datei haben, die alle Polyfills enthält, ohne sie neu generieren zu müssen, wenn sich Ihr Code ändert.
    Eingabecode Ausgabecode
     import "core-js" ; 
     import "core-js/modules/es7.array.flat-map.js" ;
    import "core-js/modules/es6.array.sort.js" ;
    import "core-js/modules/es7.promise.finally.js" ;
    import "core-js/modules/es7.symbol.async-iterator.js" ;
    import "core-js/modules/es7.string.trim-left.js" ;
    import "core-js/modules/es7.string.trim-right.js" ;
    import "core-js/modules/web.timers.js" ;
    import "core-js/modules/web.immediate.js" ;
    import "core-js/modules/web.dom.iterable.js" ;
  • Die Methode usage-global injiziert Importe in Polyfills, die an den globalen Bereich angehängt sind, jedoch nur für nicht unterstützte Funktionen, die in Ihrem Code verwendet werden. Möglicherweise möchten Sie diese Methode verwenden, wenn:

    1. Sie müssen die Codegröße so klein wie möglich halten und nur das einbeziehen, was effektiv verwendet wird.
    2. Ihr Polyfill unterstützt keinen einzelnen Einstiegspunkt, aber jedes seiner Features muss separat geladen werden.
    Eingabecode Ausgabecode
     foo . flatMap ( x => [ x , x + 1 ] ) ;
    bar . trimLeft ( ) ;
    arr . includes ( 2 ) ; 
    [x, x + 1]); bar.trimLeft(); arr.includes(2);">
     import "core-js/modules/es.array.flat-map.js" ;
    import "core-js/modules/es.array.unscopables.flat-map.js" ;
    import "core-js/modules/es.string.trim-start.js" ;
    
    foo . flatMap ( x => [ x , x + 1 ] ) ;
    bar . trimLeft ( ) ;
    arr . includes ( 2 ) ;
  • Die usage-pure Methode injiziert Importe in Polyfills für nicht unterstützte Features, die in Ihrem Code verwendet werden, ohne die Polyfills an den globalen Bereich anzuhängen, sondern sie als normale Funktionen zu importieren. Möglicherweise möchten Sie diese Methode verwenden, wenn:

    1. Sie sind Bibliotheksautor und möchten den globalen Bereich nicht mit den von Ihnen geladenen Polyfills „verschmutzen“.
    Eingabecode Ausgabecode
     foo . flatMap ( x => [ x , x + 1 ] ) ;
    bar . trimLeft ( ) ;
    arr . includes ( 2 ) ; 
    [x, x + 1]); _trimLeftInstanceProperty(bar).call(bar); arr.includes(2);">
     import _flatMapInstanceProperty from "core-js-pure/stable/instance/flat-map.js" ;
    import _trimLeftInstanceProperty from "core-js-pure/stable/instance/trim-left.js" ;
    
    _flatMapInstanceProperty ( foo ) . call ( foo , x => [ x , x + 1 ] ) ;
    _trimLeftInstanceProperty ( bar ) . call ( bar ) ;
    arr . includes ( 2 ) ; 

Geschichte und Motivation

In den letzten dreieinhalb Jahren hat @babel/preset-env sein volles Potenzial bei der Reduzierung der Bundle-Größen gezeigt, nicht nur durch die Nichttranspilierung unterstützter Syntaxfunktionen, sondern auch durch den Verzicht auf unnötige core-js -Polyfills.

Bisher stellte Babel drei verschiedene Möglichkeiten bereit, core-js -Polyfills in den Quellcode einzufügen:

  • Durch die Verwendung der useBuiltIns: "entry" -Option von @babel/preset-env ist es möglich, selbstinstallierende Polyfills für jede ECMAScript-Funktionalität einzufügen, die von den Zielbrowsern nicht nativ unterstützt wird;
  • Durch die Verwendung @babel/preset-env 's useBuiltIns: "usage" fügt Babel nur selbstinstallierende Polyfills für nicht unterstützte ECMAScript-Funktionen ein, aber nur , wenn sie tatsächlich im Eingabequellcode verwendet werden;
  • Durch die Verwendung @babel/plugin-transform-runtime fügt Babel „reine“ Polyfills (die im Gegensatz zu selbstinstallierenden Polyfills den globalen Bereich nicht verschmutzen) für jede verwendete ECMAScript-Funktion ein, die von core-js unterstützt wird. Dies wird normalerweise von Bibliotheksautoren verwendet.

Unser alter Ansatz hat zwei Hauptprobleme:

  • Es war nicht möglich, targets -Option von @babel/preset-env mit „reinen“ Polyfills zu verwenden, da @babel/plugin-transform-runtime ein völlig separates Paket ist.
  • Wir haben unsere Benutzer gezwungen, core-js zu verwenden, wenn sie eine Babel-Integration wünschen. core-js ist ein gutes und umfassendes Polyfill, aber es erfüllt nicht die Bedürfnisse aller unserer Benutzer.

Mit diesen neuen Paketen schlagen wir eine Lösung für diese beiden Probleme vor und behalten gleichzeitig die volle Abwärtskompatibilität bei.

Möchten Sie einen Beitrag leisten?

Sehen Sie sich unsere CONTRIBUTING.md an, um mit der Einrichtung des Repos zu beginnen.

Expandieren
Zusätzliche Informationen
  • Version
  • Typ Anderer Quellcode
  • Aktualisierungszeit 2024-12-11
  • Größe 2.89MB
  • Sprache Vereinfachtes Chinesisch