Inicio>Relacionado con la programación>Otro código fuente

Sin embargo, este enfoque simple puede incluir potencialmente una gran cantidad de código innecesario. Los complementos de Babel implementados en este repositorio inyectan automáticamente los polyfills en su código, mientras intentan cargar solo lo que realmente se necesita. Lo hace en función de sus objetivos de compilación y de lo que está utilizando en su código.

Estos complementos (los llamamos "proveedores de polyfill") admiten diferentes métodos de inyección para adaptarse mejor a sus necesidades.

Por ejemplo, si desea inyectar importaciones a los polyfills es-shims agregando las funciones que faltan a los objetos globales, puede configurar Babel como tal:

Configuración Código de entrada Código de salida
{
  "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!" ) ;
} ) ;

Si desea ver más ejemplos de configuración, puede consultar los documentos de migración: docs/migration.md .

Si está interesado en leer sobre todas las opciones admitidas por estos complementos, puede consultar los documentos de uso: docs/usage.md .

Polyfills soportados

Polirelleno Complemento Métodos
core-js@2 babel-plugin-polyfill-corejs2 entry-global , usage-global y usage-pure
core-js@3 babel-plugin-polyfill-corejs3 entry-global , usage-global y usage-pure
es-shims babel-plugin-polyfill-es-shims usage-global y usage-pure
regenerator-runtime babel-plugin-polyfill-regenerator entry-global , usage-global y usage-pure

Mantenemos el soporte para core-js y es-shims , pero te recomendamos que implementes un proveedor para tu propio polyfill o para tu favorito. Uno de nuestros objetivos es fomentar la competencia entre diferentes polyfills, para equilibrar mejor las diferentes compensaciones, como el cumplimiento de las especificaciones y el tamaño del código.

Si desea implementar soporte para un polyfill personalizado, puede usar @babel/helper-define-polyfill-provider . ( docs/polyfill-provider.md ).

Métodos de inyección

Los complementos de Polyfill pueden exponer tres métodos de inyección diferentes: entry-global , usage-global y usage-pure . Tenga en cuenta que los complementos de polyfill no agregan automáticamente los paquetes necesarios a sus dependencias, por lo que debe enumerarlos explícitamente en su package.json .

Todos los ejemplos suponen que su objetivo es Chrome 62.

  • El método entry-global reemplaza una única importación simple de todo el polyfill con importaciones de características específicas que no son compatibles con los entornos de destino. Es más útil cuando desea asegurarse de que todas las funciones no compatibles estén disponibles, independientemente de lo que esté utilizando en el código que esté compilando con Babel. Es posible que desee utilizar este método si:

    1. no estás compilando tus dependencias, pero quieres estar seguro de que tengan todos los polyfills necesarios;
    2. La lógica de detección de Babel no es lo suficientemente inteligente como para comprender qué funciones estás utilizando;
    3. desea tener un único archivo empaquetado que contenga todos los polyfills, sin necesidad de regenerarlo cuando cambie su código.
    Código de entrada Código de salida
     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" ;
  • El método usage-global inyecta importaciones en polyfills adjuntos al alcance global, pero solo para funciones no compatibles que se utilizan en su código. Es posible que desee utilizar este método si:

    1. debe mantener el tamaño del código lo más pequeño posible e incluir solo lo que se utiliza de manera efectiva;
    2. su polyfill no admite un único punto de entrada, pero cada una de sus funciones debe cargarse por separado.
    Código de entrada Código de salida
     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 ) ;
  • El método usage-pure inyecta importaciones en polyfills para funciones no compatibles que se utilizan en su código, sin adjuntar los polyfills al alcance global, sino importándolos como funciones normales. Es posible que desee utilizar este método si:

    1. usted es autor de una biblioteca y no quiere "contaminar" el alcance global con los polyfills que está cargando.
    Código de entrada Código de salida
     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 ) ; 

Historia y motivación

En los últimos tres años y medio, @babel/preset-env ha demostrado todo su potencial para reducir el tamaño de los paquetes, no solo al no transpilar las funciones de sintaxis admitidas, sino también al no incluir polyfills core-js innecesarios.

Hasta ahora, Babel proporcionó tres formas diferentes de inyectar polyfills core-js en el código fuente:

  • Al utilizar la opción useBuiltIns: "entry" de @babel/preset-env , es posible inyectar polyfills autoinstalables para cada funcionalidad ECMAScript que no sea compatible de forma nativa con los navegadores de destino;
  • Al utilizar useBuiltIns: "usage" de @babel/preset-env , Babel solo inyectará polyfills autoinstalables para funciones ECMAScript no compatibles, pero solo si realmente se usan en el código fuente de entrada;
  • Al usar @babel/plugin-transform-runtime , Babel inyectará polyfills "puros" (que, a diferencia de los que se instalan automáticamente, no contaminan el alcance global) para cada función ECMAScript utilizada compatible con core-js . Esto suele ser utilizado por los autores de bibliotecas.

Nuestro antiguo enfoque tiene dos problemas principales:

  • No fue posible usar la opción targets de @babel/preset-env con polyfills "puros", porque @babel/plugin-transform-runtime es un paquete completamente separado.
  • Obligamos a nuestros usuarios a usar core-js si querían una integración con Babel. core-js es un polyfill bueno y completo, pero no se adapta a las necesidades de todos nuestros usuarios.

Con estos nuevos paquetes proponemos una solución para ambos problemas, manteniendo al mismo tiempo la total compatibilidad con versiones anteriores.

¿Quieres contribuir?

Consulte nuestro CONTRIBUTING.md para comenzar a configurar el repositorio.

Expandir
Información adicional
  • Versión
  • Tipo Otro código fuente
  • Fecha de actualización 2024-12-11
  • tamaño 2.89MB
  • Idioma Chino simplificado