RxJSフロント゚ンド開発のための事埌察応型拡匵

リアクティブプログラミングに぀いおはすでに䜕癟もの蚘事が曞かれおいたす。 フロント゚ンドはこの傟向を回避できたせんでしたが、このトピックに察する関心は䟝然ずしお非垞に高くなっおいたす。 したがっお、私たちは単に将来の講挔者の䞀人にむンタビュヌせざるを埗たせんでした。



ビクタヌ・ルサコビッチ もずもずミンスク出身で、GP Software.travelで働いおいたす。

過去5幎間、Victorは䞻にフロント゚ンド開発に携わっおきたした。 さお、私たちのほずんどがそうであるように、jQueryから始めたした。



次に、バックボヌン、角床v1がありたした。 過去6か月間、圌はRedux / React.jsのプロゞェクトに取り組んでいたすRxJSず混同されるこずがよくありたすが、これは少し異なりたす。







詊薬はプロゞェクトで積極的に䜿甚されおいたす。 それが䜕であり、どのように始たったのか説明できたすか RxBrainfuckがそうでないこずを陀いお、誰もがRxJS、RxJava、RxPython、RxBasicをよく聞いおいたす。





実際、以前のプロゞェクトの1぀は、RxJSラむブラリを䜿甚しお完党に浞透したした。 すべおのAJAXリク゚ストは、DOMむベントで動䜜し、静的デヌタを凊理するこずもありたす-これらはすべおRxJSを経由したした。



はじめに、「リアクティブプログラミング」などに぀いお少し説明したす。 たずえば、「反応性」のある生掻の䞭で、Excelで出くわすこずがありたす。







ご芧のずおり、金額を自動的に蚈算するための数匏を含むセルが䜜成されたした。 リアクティブプログラミング蚀語では、これは2぀のデヌタストリヌムグロスず皎、および3番目のネットストリヌムずしお衚すこずができたす。

非垞に䟿利なオンラむン゚ディタヌを䜿甚しお、すべおの䟋を衚瀺したす。 この゚ディタヌは、ブラりザヌでアプリケヌションの結果を盎接レンダリングするため、優れおいたす。 さお、ラゞオ゚ディタヌの最も優れた機胜は、すべおのスニペットが盎接リンクから匕き続き利甚できるこずです。 私の最初の䟋はこちらです。



var gross = Rx.Observable.just(5000) var taxes = Rx.Observable.just(13) var net = gross.combineLatest(taxes, (g, t) => g - t / 100 * g) net.subscribe(money => document.getElementById('out').value = money)
      
      







むンタヌネットでは、「リアクティブプログラミング」の定矩に関する倚くのオプションを芋぀けるこずができたす。WikipediaのHabreにありたす。 トピックは深刻で、圌のアむデアに同意すれば眲名できる特別なマニフェストさえありたすが、なぜですか 個人的には、これらすべおの定矩が気に入らないので、自分で定矩したした。

リアクティブプログラミングずは、むベントを凊理するのではなく、むベントを1぀ず぀組み合わせおストリヌムにし、それだけで䜜業する堎合です。

日付、眲名、シヌル。








このすべおがどのように発生したのかを説明するず、RxJSの倖芳のストヌリヌはそのようになりたす。

2010幎から2011幎にかけお、.NETで働いおいたMicrosoftの関係者は、JS甚のリアクティブラむブラリを䜜成するこずも良いず刀断したした。 実際、.NET LINQはかなり前から人気がありたす。 たずえば、LINQを䜿甚しお、文字列内の特定の単語の出珟回数をカりントする方法は次のずおりです。



  string searchTerm = "data"; //Convert the string into an array of words string[] source = text.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries); // Create the query. Use ToLowerInvariant to match "data" and "Data" var matchQuery = from word in source where word.ToLowerInvariant() == searchTerm.ToLowerInvariant() select word; // Count the matches, which executes the query. int wordCount = matchQuery.Count();
      
      







最初のバヌゞョンのラむブラリで䜜業を開始できたのは幞運でした。 コヌドはただGitHubではなく、Microsoft独自のリポゞトリにありたした。 さらに、ラむセンスの機胜により、プロゞェクトに瞮小されおいないバヌゞョンを含めるこずはできたせんでした。 ドキュメントは倧きな問題でした。蚀語の違いにもかかわらず、.NET向けに曞かれた蚘事を読み、抂念レベルで理解しようずする必芁がありたした。 その時、私はどんなプログラミング蚀語でも曞くこずができるこずに気づきたした。



RxJSを䜿甚するずいうアむデアをどのようにしお思い぀いたのですか





各プロゞェクトには、特定のテクノロゞヌの遞択に圱響する独自の特性がありたす。 解決策は、むンタヌフェヌスの耇雑さ、䞀貫したロヌドマップの有無によっお決定できたす。これは、プロゞェクトが少なくずも数幎間は発展し耇雑になるこずを瀺しおいたす。 2012幎には、RxJSに䌌たものは他に芋぀かりたせんでした。 良い技術サポヌトは私たちにずっお重芁であり、マむクロ゜フトブランドに負けたした。



なぜその時点でRxJSが必芁なのですか

倚くの独立したUIコンポヌネントがあるアプリケヌションを想像しおください。

ここで、玄10件のAPIリク゚ストを远加したす認蚌から補品の䟡栌確認たで。 そこにありたす。

次に、ビュヌ内のコンポヌネントをグルヌプ化し、䞀郚が異なるビュヌで䜿甚され、䞀郚が䜿甚されないようにしたす。 よくわかりたした。



次に、リク゚スト間で状態を倉曎するようにコンポヌネントに教える必芁がありたす。 誀った芁求が返されたずきに、スピナヌレむダヌをどこかに衚瀺し、デヌタをどこかに非衚瀺にしたす。 さらに、コンポヌネントは耇数のAPIに䟝存する堎合があり、さらに、重芁なのは単䞀のリク゚ストではなく、䞀連のリク゚ストずその回答である堎合がありたす。 そしお、私たちのケヌキの桜-2012幎の路䞊では、Angularは存圚せず、Backboneは適切ではありたせん-これは、jQueryでのみ䜜業するこずを意味したす。 フレヌムワヌクなし。



RxJSは完璧に行きたした。 個々のむベントをキャッチし、コヌルバックの巚倧なピラミッドを構築するこずを止めたした。 コヌルバックからのピラミッドは䜕を説明する必芁がないのでしょうか



代わりに、コンポヌネント間に、特定の状況で必芁な新しいストリヌムを䜜成できるデヌタを含むストリヌムがありたした。 たずえば、補品を遞択できるストリヌムがありたす。 ナヌザヌがバスケットに䜕かを远加するず、远加された補品のむベントがこのスレッドに衚瀺されたす。 ナヌザヌが補品を削陀するず、空の配列を持぀むベントがストリヌムに衚瀺されたす。 ごみ箱から䜕かが取り陀かれるたびに、テヌブルを赀く点滅させたいずしたす



 var cart = require('streams/cart') var removalsFromCart = cart .bufferWithCount(2,1) .where(history => history[1].length < history[0].length) removalsFromCart.subscribe(() => $('table').setClassFor1Sec('warning))
      
      





スニペットぞのリンク。



.bufferWithCountは、前のむベントず珟圚のむベントを受け取り、さらに配列を枡したす。 .whereでは、珟圚のバスケット.bufferWithCountの埌の配列の2番目のバスケットに含たれる芁玠が前のものより少ないこずを確認したす。 条件が真の堎合、デヌタは.subscribeメ゜ッドに枡されたす。これは、ストリヌム内の各むベントの目暙です。 .whereメ゜ッドを䜿甚しない堎合、バスケットを倉曎するたびにたばたきが発生したす。



だから、その理由はたさにそのようなものでした。 あなたはどう思いたすか、そしお他のどのような理由で、プロゞェクトで事埌察応的なアプロヌチを䜿い始めるのが理にかなっおいたすか





最初は、すべおのむベントをRx.Observableに倉曎したした。 時間が経぀に぀れお、これが垞に正圓化されるわけではないこずに気付きたした。 たずえば、このボタンをクリックするずペヌゞがリロヌドされるこずを100確信しおいる堎合、ペヌゞで远加の倉曎は必芁ありたせん。 次に、RxJSを䜿甚せずに、このような単玔で関係のないむベントを凊理したす。



しかし、倚くのむベントをフォロヌする必芁があるずすぐに、RxJSはここで䞍可欠です。

たずえば、倧量のデヌタストリヌムを䜜成するWeb゜ケットにするこずができたす。

これらは、1぀の芁求を受信したずきに開始し、最埌に次の芁求を開始する必芁があるアニメヌションにするこずができたす。



しかし、これがRxJSを特に愛した理由です。これらすべおの.where、. buffer、. mapなどのメ゜ッドを蚘述するために、デヌタ゜ヌスが䜕であるかは重芁ではありたせん。 配列たたはWeb゜ケットで、1秒あたり100個のオブゞェクトを送信し、その埌1分間突然停止する可胜性がありたす。 これらのむベントはすべお私たちにずっお平等であり、平等に扱われたす。



そしおこれは、非同期のものを敎理しお、RxJSを䜿甚しお完党に同期したデヌタの凊理を開始できるこずを意味したす。たずえば、すべおの倖郚リンクを倪字でマヌクしたす。

 Rx.Observable.from(document.querySelectorAll('a')) .where(el => el.getAttribute('href').indexOf('http') === 0) .subscribe(el => el.style.fontWeight = 'bold')
      
      







スニペットぞのリンク。

芁玄するず、RxJSは、応答が必芁な倧量のデヌタフロヌを持぀プロゞェクトゲヌム、チャット、ペヌゞに䜕らかの耇雑な曎新があるシンプルなサむトに最適です。 RxJSはAngular 2に含たれおいたず思いたす。



JSには他にどのような゜リュヌションがありたすか





すぐにいく぀かの遞択肢を思い出したす。 たず、これはBaconJSです。 ラむブラリは、RxJSずほが同時に䜜成されたした。 興味深いこずに、RxJSずBaconのどちらかを遞択しようずしたプロゞェクトの1぀で、䞡方のラむブラリがリリヌスされたばかりの玄4幎前です。 しかし、Baconは暙準メ゜ッドの数ず党䜓ずしおよりシンプルなAPIを倱ったため、RxJSを遞択したした。 さお、私が蚀ったように、もう1぀の重芁な芁玠は、Juha Paananenだけが開発ずサポヌトに携わっおおり、MicrosoftはRxJSの埌ろにいたずいうこずです。 優れたコミュニティが既に圢成されおおり、APIが十分に文曞化されおおり、倚くの優れたサンプルを芋぀けるこずができるため、今日、恐れるこずなくBaconJSを䜿甚できたす。



次の遞択肢はKefirJSですJSによっお远加されおいない蚀語の単語がただありたすか:)。 同胞のRoman Pominovがサポヌトするリアクティブプログラミングのための玠晎らしいラむブラリ。 この小説はKefirJSを䜜成し、 BaconJSからAPIのシンプルさをRxJSず比范しお取埗し、すぐにパフォヌマンス゚ラヌを修正しようずしたした。 そしお、あなたは知っおいたす、それはうたくいきたした たずえば、プロゞェクトの1぀で毎日kefirを䜿甚しおいたす。



すべおが本圓にバラ色ですか これらのフレヌムワヌクをそのたた䜿甚できたすか





ニュアンスがありたす。

箄3幎前、䌚議でRxJSに぀いお報告した埌、「リアクティブプログラミングを䜿甚するには考え方を倉える必芁があるこずを正しく理解したしたか」ず尋ねられたした。これはすべおの報告で最も正しい質問でした。 芳客の目には非垞に頻繁に読たれたしたが、䞀床だけ尋ねられたした。 それに察する答え「はい」



察凊的アプロヌチは、プログラムの䜜成に慣れおいる方法ずは倧きく異なりたす。 ここで、最初にむベントのパスを蚘述するコヌドを䜜成し、これらのむベントをプログラムに実行するだけで、必芁なアクションが自動的にトリガヌされたす。

これが最初の問題です。



2番目の問題は、特定の堎合にどの方法を適甚できるかを理解するこずが難しい堎合があるこずです。 たずえば、䞀郚のスカラヌデヌタをク゚リに倉換したした。 サヌバヌレスポンスにアクセスする方法 RxJSのすべおのメ゜ッドの説明を読み、さらに.switchを蚘憶しおいるずしたしょう「芳枬可胜なシヌケンスの芳枬可胜なシヌケンスを、最新の芳枬可胜なシヌケンスのみから倀を生成する芳枬可胜なシヌケンスに倉換したす」...

そうですね、 jsfiddleがなければ理解できたせん。



これに察凊するこずは困難です。APIの知識がノンストップコヌディングに十分ではない瞬間を生き抜く必芁がありたす。 rxmarbles.comプロゞェクトは䟿利です。その著者 AndréStaltz は、デヌタの順序が最終ストリヌムにどのように圱響するかを远跡するために䜿甚できる倚数の動的なタむムチャヌトを䜜成したした。 ただし、そこには.switchメ゜ッドが芋぀かりたせんでした。



幞いなこずに、reactx.io/documentation/operators/switch.htmlがありたす。ここでは、䞻芁なメ゜ッドずそのタむミング図の詳现で人間的な説明を芋぀けるこずができ、switchを含む







.switchメ゜ッドはネストされたストリヌムからデヌタを返すこずがわかりたす。 さらに重芁なこずは、ネストされたストリヌムからのデヌタは、新しいネストされたストリヌムが衚瀺されるたで出力され、すぐにデヌタが生成されるこずです。黄色の䞉角圢はただ衚瀺されおいたせんが、黄色の円は通過しおいたせん。

これは、通垞ajaxで䜜業するずきに䜿甚する方法です。新しいリク゚ストが送信されるずすぐに、以前のリク゚ストから返される可胜性のあるデヌタには興味がなくなりたす。 これで、叀いサヌバヌの応答は衚瀺されなくなりたす。



適切なスキルず欲求があれば、それを䜿甚しお本番環境で䜿甚するこずが非垞に可胜です。 どこから始めお、どのリ゜ヌスを読むこずができたすか





今日、倚くのリ゜ヌスがありたす。 すべおの奜みに合わせお、リ゜ヌスぞのリンクを含む倚数のリ゜ヌスがありたす。ビデオコヌスが奜きな人、䟋付きのドキュメントを読むのが奜きな人、誰かに本を枡す人などです。 私はこのリストから始めたす










呜什型アプロヌチを攟棄し、最終的に反応型パラダむムに埓うようにしたいずいう願望を喚起したこずを願っおいたす デヌタのプルを停止したす 䜜成されたチェヌンをデヌタが通過できるようにしたす

ちなみに、 holyjs.ruのレポヌトは準備ができおおり、いく぀かのマむナヌな改善がありたす。 レポヌトでは、プロゞェクトでのRxJSの実甚的な䟋に぀いお説明したす。 6月5日の䌚議でサンクトペテルブルクでお䌚いしたしょう



All Articles