RxJSコアチームメンバーでリーダーのBen Lesh氏が、ng-confでRxJS 7の今後の機能を発表した。
Lesh氏は、聴衆にRxJSの目標を思い出させることから始めた。RxJSは、リアクティブプログラミングパラダイムがより一般的になった結果として、着実に人気が高まっているユーティリティライブラリである。RxJSは、多くのさまざまなコンテキストやフレームワークで使用できるユーティリティライブラリとして、安定性と信頼性を高め、開発者のエクスペリエンスを常に向上させ、バンドルサイズを最適化するよう努めている。
安定性、信頼性、および保守性は、エンタープライズソフトウェアで非常に望ましい特性である。その方向にさらに前進するために、Lesh氏はいくつかの進行中のイニシアチブに言及した。
RxJSチームは、パッチリリース間で重大な変更がないことと、RxJS 8以降のスムーズな移行パスを保証するプロセスを開始した。RxJSはGoogleをパートナーとして、最新バージョンのRxJSをgoogle3 (Googleモノリポジトリ) で実行し、発生したバグや重大な変更を明らかにできるようにした。Lesh氏は説明した:
[Moshe Kolodney氏はタスクフォースの設立を支援しました] 最新バージョンのRxJSをgoogle3に入れて […] すべてのビルドターゲットに対して実行します — 何千ものビルドターゲット、RxJSを使用するたくさんのアプリ、あなたが想像できる方法で、何が壊れているかを見てください。彼らは [その後] 私たちに報告し、何が壊れているかを私たちに知らせ、私たちはあなたがNPMで公開されたリリースを見る前に、それらの問題を解決するために彼らと協力します
RxJS 7はまた、新しいバージョンのTypeScriptを利用して、ライブラリユーザにより良い型推論を提供しようとしている。Lesh氏は、RxJSメソッドのタイプ定義ファイルにエンコードされている9つの引数まで型推論が機能するN引数メソッドの例を示した:
以前は8個または9個の値のような上限があり、その後はタイプを推測できなくなることがありました。今、任意の数の値に増えてもTypeScriptがそれを推測することができます。
RxJSチームは、誤ったタイプも修正した。次のコードは例を示している:
async function test(){
const names$: Observable <string[]> = getNames();
const names = await names$.toPromise();
console.log(names);
}
names
の正しいタイプは string[] | undefined
である。undefined
タイプは、names
ストリームが空であるエッジケースに対応する — toPromise
によって返される promise は、undefined
に解決される。上記のエッジケースは、1つの undefined
の値を放出する空でない observable のケースと区別がつかないという問題が加わる。これにより、toPromise
メソッドは非推奨になる。
Lesh氏は、共用体タイプのリターンの方が優れているとも述べた。次のコードでは、タイプの結果が Observable<string | number>
に正しく推測される:
const result = of(Math.random()).pipe(
concatMap(n => n > 0.5 ? of ('life') : of(42))
);
console.log(result);
これは、さまざまなタイプのアクションを返す可能性のある結果を使用する NgRx Angular 状態管理ライブラリのユーザにとって特に興味深いものである。このようなユーザは、返されたエンティティのタイプを明示する必要がなくなる。
非推奨の toPromise
は、2つの新しいメソッド lastValueFrom
と firstValueFrom
に置き換えられた。どちらも、observable なものを取り、promise を返す。空の observable が渡された場合、どちらのメソッドも EmptyError
例外をスローする。
RxJS 7は、promise または observable (concatMap
、mergeMap
、defer
など) を受け入れるすべてのRxJSメソッドでの非同期ジェネレーターの使用もサポートする必要がある。非同期ジェネレーターはJavaScriptの標準機能であり、サポートは非同期処理 (ポーリング、I/Oストリームのチャンクごとの読み取りなど) にバニラJavaScriptを使用する新しい可能性を提供する。または、単に、既存の非同期反復のライブラリを再利用することである。
一方、RxJS 7は、observable の非同期反復をサポートしない。代わりに、開発者は (rxjs-for-await) ライブラリを使用して、observable を非同期的に反復するための4つの戦略に区別できる。4つの戦略は、コンシューマ (反復ループ) から切り離されたプロデューサ (observable) の存在に起因し、バックプレッシャーの問題を引き起こす可能性がある。
observable は、イテレーターが値をプルしている間に値をプッシュし、イテレーターが値をプルするよりも速く値をプッシュすると、値をドロップするか (不可逆戦略) 、バッファに入れる (損失のない戦略) 。バッファされた値は、個別に渡す (eachValueFrom
) か、一緒に渡す (bufferedValuesFrom
) ことができる。不可逆戦略では、observable によって発行された最新の値 (latestValueFrom
) 、または次の値 (nextValueFrom
) をプルする。Lesh氏は、反復可能オブジェクトのために積極的に開発されたIxJSライブラリがRxJSの対応物であることを聴衆に思い出させた。
一部のオペレータの名前が変更された (たとえば、zip
の名前が zipWith
に変更された) 。RxJSチームは、いくつかのメソッド (interval
、auditTime
など) からスケジューラを削除し、新しい scheduled
とobservedOn
APIを推奨している。移行の背景にある重要な目標は、スケジューラを使用しないユーザのRxJSメソッドのフットプリントを削減することである。
RxJSは現在Beta 7であり、次のようにインストールできる:
npm install rxjs@next
講演の完全なビデオには、多くの追加の技術的な詳細と貴重なコメントが含まれている。ng-confは、Angular JavaScriptフレームワークで最高品質のトレーニングを提供することを目的とした3日間のAngularカンファレンスである。ng-confは2020年4月にソルトレイクシティで開催され、1,500人以上の開発者が集まった。