5

ES6 と ES7 の機能を多用するライブラリを開発しています。これを Babel でコンパイルすると、(自然に) Symbol や Promise などのプリミティブを使用するコードが生成されます。require('babel-polyfill')そのようなプリミティブが確実に存在することを確認する必要がありますか?

最初の瞬間、答えは「はい」のようです。特に、誰かが自分のライブラリを実行する可能性のあるランタイムがわからない場合はそうです。一方、すべてのライブラリがこれを行う場合、babel-polyfill何度も何度も要求することになります (これが良いアイデアかどうかはわかりません)。

4

1 に答える 1

6

私はこれについていくつかの調査を行いました:

ライブラリ内からの要求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 がブラウザーでもポリフィルでも定義されていない場合)。私のアドバイスは、この目的でプラグインを使用しないことです。

于 2016-01-24T13:08:43.293 に答える