ホーム>プログラミング関連>その他のソースコード

ただし、この単純なアプローチには、不要なコードが大量に含まれる可能性があります。このリポジトリに実装されている Babel プラグインは、コードにポリフィルを自動的に挿入し、本当に必要なものだけをロードしようとします。これは、コンパイル ターゲットとコードで使用している内容に基づいて行われます。

これらのプラグイン (私たちは「ポリフィル プロバイダー」と呼んでいます) は、ニーズに合わせてさまざまな注入方法をサポートしています。

たとえば、欠落している関数をグローバル オブジェクトに追加することでes-shimsポリフィルにインポートを挿入したい場合は、Babel を次のように構成できます。

構成コードを入力してください出力コード
{
  "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!" ) ;
} ) ;

さらに多くの構成例を確認したい場合は、移行ドキュメントdocs/migration.mdを確認してください。

これらのプラグインでサポートされているすべてのオプションについて知りたい場合は、使用法に関するドキュメントdocs/usage.md確認してください。

サポートされているポリフィル

ポリフィルプラグインメソッド
core-js@2 babel-plugin-polyfill-corejs2 entry-globalusage-global 、およびusage-pure
core-js@3 babel-plugin-polyfill-corejs3 entry-globalusage-global 、およびusage-pure
es-shims babel-plugin-polyfill-es-shims usage-globalusage-pure
regenerator-runtime babel-plugin-polyfill-regenerator entry-globalusage-global 、およびusage-pure

私たちはcore-jses-shimsのサポートを維持していますが、独自のポリフィルまたはお気に入りのポリフィルのプロバイダーを実装することをお勧めします。私たちの目標の 1 つは、異なるポリフィル間の競争を促進し、仕様への準拠性やコード サイズなどのさまざまなトレードオフのバランスをより良くすることです。

カスタム ポリフィルのサポートを実装したい場合は、 @babel/helper-define-polyfill-provider使用できます。 ( docs/polyfill-provider.md 。)

注入方法

Polyfill プラグインは、 entry-globalusage-global 、およびusage-pureの 3 つの異なる注入メソッドを公開できます。ポリフィル プラグインは必要なパッケージを依存関係に自動的に追加しないため、 package.jsonに明示的にリストする必要があることに注意してください。

すべての例は、Chrome 62 をターゲットにしていることを前提としています。

  • entry-globalメソッドは、ポリフィル全体への単一の単純なインポートを、ターゲット環境でサポートされていない特定の機能へのインポートに置き換えます。これは、Babel でコンパイルしているコードで何を使用しているかに関係なく、サポートされていないすべての関数が利用可能であることを確認したい場合に最も役立ちます。次のような場合にこの方法を使用するとよいでしょう。

    1. 依存関係をコンパイルするわけではありませんが、必要なポリフィルがすべて揃っていることを確認したいとします。
    2. Babel の検出ロジックは、どの関数が使用されているかを理解できるほど賢くはありません。
    3. コードを変更したときに再生成する必要がなく、すべてのポリフィルを含む 1 つのバンドル ファイルが必要です。
    コードを入力してください出力コード
     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" ;
  • usage-globalメソッドは、コード内で使用されているサポートされていない機能に対してのみ、グローバル スコープにアタッチされたポリフィルにインポートを挿入します。次のような場合にこの方法を使用するとよいでしょう。

    1. コードのサイズをできるだけ小さくし、効果的に使用されるものだけを含める必要があります。
    2. ポリフィルは単一のエントリ ポイントをサポートしていませんが、その各機能を個別にロードする必要があります。
    コードを入力してください出力コード
     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 ) ;
  • usage-pureメソッドは、コード内で使用されているサポートされていない機能のポリフィルにインポートを挿入します。ポリフィルをグローバル スコープにアタッチせず、通常の関数としてインポートします。次のような場合にこの方法を使用するとよいでしょう。

    1. あなたはライブラリの作成者であり、ロードしているポリフィルでグローバル スコープを「汚染」したくないと考えています。
    コードを入力してください出力コード
     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 ) ; 

歴史と動機

過去 3 年半で、 @babel/preset-envサポートされている構文機能をトランスパイルしないだけでなく、不要なcore-jsポリフィルを含めないことによって、バンドル サイズを削減するという点でその可能性を最大限に発揮してきました。

これまでのところ、Babel はソース コードにcore-jsポリフィルを挿入する 3 つの異なる方法を提供しました。

  • @babel/preset-envuseBuiltIns: "entry"オプションを使用すると、ターゲット ブラウザでネイティブにサポートされていないすべての ECMAScript 機能に自己インストール ポリフィルを挿入できます。
  • @babel/preset-envuseBuiltIns: "usage"を使用すると、Babel はサポートされていない ECMAScript 機能に対してのみ、入力ソース コードで実際に使用されている場合にのみ、自己インストール ポリフィルを挿入します。
  • @babel/plugin-transform-runtime使用することで、Babel はcore-jsでサポートされているすべての使用済み ECMAScript 機能に対して「純粋な」ポリフィル (自己インストール型とは異なり、グローバル スコープを汚染しません) を挿入します。これは通常、ライブラリの作成者によって使用されます。

私たちの古いアプローチには 2 つの主な問題があります。

  • @babel/plugin-transform-runtimeは完全に別個のパッケージであるため、「純粋な」ポリフィルで@babel/preset-envtargetsオプションを使用することはできませんでした。
  • Babel 統合を希望する場合は、ユーザーにcore-jsの使用を強制しました。 core-jsは優れた包括的なポリフィルですが、すべてのユーザーのニーズに適合するわけではありません。

この新しいパッケージでは、完全な下位互換性を維持しながら、これらの問題の両方に対する解決策を提案しています。

貢献したいですか?

リポジトリの設定を開始するには、CONTRIBUTING.md を参照してください。

拡大する
追加情報