RsJ は、次の 4 つの理由から、演算子の抽象化を「ドット」から「パイプ」に移行しました。演算子がシンボルでエイリアス化されていれば、これらの理由も解決されますか? という名前のプロパティ'myOp'
をプロトタイプに追加する代わりに、名前が のようなシンボルだったらどうSymbol('myOp')
でしょうか? 次に、次のように呼び出すことができます
var MyOp = require('my-op');
var o = getObservable();
var x = o[MyOp]();
理由を 1 つずつ取り上げます。
patch オペレーターをインポートするライブラリーは、そのライブラリーのすべてのコンシューマーに対して Observable.prototype を拡張し、盲目的な依存関係を作成します。ライブラリがそれらの使用を削除すると、無意識のうちに他のすべての人を壊してしまいます。pipeables では、必要な演算子を使用する各ファイルにインポートする必要があります。
シンボルは、モジュールがロードされたときにのみプロトタイプにアタッチされrequire('myOp')
、シンボルであり削除されないため、衝突しません。
プロトタイプに直接パッチされたオペレーターは、ロールアップや webpack などのツールによって「ツリー シェーク可能」ではありません。パイプ可能な演算子は、モジュールから直接引き出された単なる関数であるためです。
プロトタイプに追加されたシンボルは、必要に応じて 1 つずつインポートされるため、シェイクする必要はありません。シンボルがプロトタイプに存在する場合、それをインポートした人によって使用されています。
アプリにインポートされている未使用の演算子は、ビルド ツールや lint ルールでは確実に検出できません。つまり、スキャンをインポートしても使用を停止しても、まだ出力バンドルに追加されているということです。パイプ可能な演算子を使用していない場合は、lint ルールで取得できます。
読み込まれているが使用されていないシンボルは簡単に検出できます。var MyOp = require('my-op')
andが使用されていない場合MyOp
、リンターはパッケージを削除するように要求する可能性があり、モジュールがロードされないため、op がアタッチされることはありません。
機能構成は素晴らしいです。独自のカスタム オペレータの作成が非常に簡単になり、rxjs の他のすべてのオペレータと同じように機能し、見た目もよくなりました。Observable を拡張したり、lift をオーバーライドしたりする必要はもうありません。
モジュールmy-op
は次のように演算子を宣言します。
var MyOp = Symbol('MyOp');
Observable.prototype[MyOp] = function() { ... }
module.exports = MyOp