私はこれについていくつかの調査を行いました:
ライブラリ内からの要求babel-polyfill
はアンチパターンのように見えます。これには次の 2 つの理由があります。
1)babel-polyfill
複数回要求されることを好まないため、これを実行しようとするとスローされます (以下の注を参照)
2) そうすると、ポリフィルを複数回バンドルする必要があるため、ライブラリのサイズが大幅に増加します。
1) と 2) の両方が関連するのは、複数の依存関係npm
の重複排除に失敗した場合のみです。babel-polyfill
これは、 の古いバージョンを使用している場合npm
や、依存関係の制約により重複排除が不可能な場合に発生する可能性があります。最新は簡単にコントロールできないので、1)も2)もかなり深刻だと思います。
そして今、あなたが(おそらく)それを行うべき方法:
lib に特定の機能 (Promise など) が必要な場合は、具体的に行うことができますrequire
(つまり、ポリフィル全体ではなく、機能のみ)。このアプローチは、1) を軽減し、2) を部分的に軽減します。
おそらくこれを行う最善の方法は、ライブラリがいくつかの ES6 機能を期待しているため、ポリフィルが必要であることをユーザーに警告することです。
最初のアプローチの良い例は
https://www.npmjs.com/package/promisify-node
これには、独自のバージョンの A+ 互換 Promise が必要です。2番目のアプローチの良い例は
https://github.com/ubolonton/js-csp
ジェネレーターを使用しますが、保証するものは何もありません。実際に存在します (一般に、Babel でコードをコンパイルするだけでは十分ではなく、それらを機能させるにはポリフィルが必要です)。
- - - - 編集 - - - -
この問題に正確に使用できることがわかりましたbabel-plugin-transform-runtime
。ポリフィルを必要とすることにより、グローバル名前空間を汚染することなく、ES6 / ES7 機能を使用できます。残念なことに、このプラグインは非常にバグが多いということです。例えば:
Object.keys({})
次のようなものに変換されます。
var _keys=require("babel-runtime/core-js/object/keys")
_keys(obj)
しかし
var aaa = Object
aaa.keys(obj)
まったく変換されないため、失敗します (Object.keys がブラウザーでもポリフィルでも定義されていない場合)。私のアドバイスは、この目的でプラグインを使用しないことです。