<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kyle Nazario</title>
    <description>The latest articles on DEV Community by Kyle Nazario (@kbn_au).</description>
    <link>https://dev.to/kbn_au</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F729591%2F802835f6-e5ac-45c0-9740-8da9482adf42.jpg</url>
      <title>DEV Community: Kyle Nazario</title>
      <link>https://dev.to/kbn_au</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kbn_au"/>
    <language>en</language>
    <item>
      <title>What’s New in RxJS 7: Small Bundles and Big Changes to share()</title>
      <dc:creator>Kyle Nazario</dc:creator>
      <pubDate>Mon, 18 Oct 2021 20:29:16 +0000</pubDate>
      <link>https://dev.to/bitovi/whats-new-in-rxjs-7-small-bundles-and-big-changes-to-share-4eg9</link>
      <guid>https://dev.to/bitovi/whats-new-in-rxjs-7-small-bundles-and-big-changes-to-share-4eg9</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmudmf5khzjrh41bqox9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmudmf5khzjrh41bqox9.png" alt="Image description" width="600" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RxJS 7 has shipped! For us Angular developers, it unfortunately &lt;a href="https://github.com/angular/angular/issues/41897#issuecomment-831981692"&gt;did not ship in time for Angular 12&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've summarized key takeaways from &lt;a href="https://youtu.be/0S5ISwDaFHI?t=1893"&gt;Ben Lesh’s talk from RxJS Live Asia&lt;/a&gt; and his &lt;a href="https://docs.google.com/presentation/d/1-LU7YE3NWw8jHeAgdmLu4CBfG7osCx6MsSIeFs16k60/edit?usp=sharing"&gt;slides&lt;/a&gt; below. &lt;a href="https://twitter.com/benlesh?lang=en"&gt;Lesh&lt;/a&gt; is a member of the RxJS core team and formerly worked at Google on the Angular team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Big Feature: Smaller Bundle Sizes
&lt;/h2&gt;

&lt;p&gt;Lesh said while RxJS 7 was “a bit faster,” the big improvement for the new version is its bundle size. RxJS 7 is 53% the size of RxJS 6. If your app used every operator in version 6, that would require 52 KB, but the same thing in RxJS 7 requires just 19 KB.&lt;/p&gt;

&lt;p&gt;“This was done via a refactor, a hundred-point improvement of going around and individually moving around code, keeping the same tests, keeping the same code, and moving things around slowly but surely until we got to a place where we could see daylight and we were able to refactor larger portions of the code,” Lesh said in his talk.&lt;/p&gt;

&lt;p&gt;See this chart of operator sizes in RxJS 6:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6fvUzbsS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.bitovi.com/hs-fs/hubfs/Image-Jun-01-2021-06-28-15-06-PM.png%3Fwidth%3D1454%26name%3DImage-Jun-01-2021-06-28-15-06-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6fvUzbsS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.bitovi.com/hs-fs/hubfs/Image-Jun-01-2021-06-28-15-06-PM.png%3Fwidth%3D1454%26name%3DImage-Jun-01-2021-06-28-15-06-PM.png" alt="Chart of operator sizes in RxJS 6" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this chart of the same operator sizes in RxJS 7:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_rxu9LGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.bitovi.com/hs-fs/hubfs/Image-Jun-01-2021-06-28-42-31-PM.png%3Fwidth%3D1453%26name%3DImage-Jun-01-2021-06-28-42-31-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_rxu9LGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.bitovi.com/hs-fs/hubfs/Image-Jun-01-2021-06-28-42-31-PM.png%3Fwidth%3D1453%26name%3DImage-Jun-01-2021-06-28-42-31-PM.png" alt="Chart of operator sizes in RxJS 7" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Consolidating Sharing Operators
&lt;/h2&gt;

&lt;p&gt;Lesh’s talk includes a long discussion about how many ways RxJS lets you share a stream (&lt;code&gt;multicast&lt;/code&gt;, &lt;code&gt;shareReplay&lt;/code&gt;, &lt;code&gt;refCount&lt;/code&gt;, etc).&lt;/p&gt;

&lt;p&gt;RxJS 7 deprecates &lt;code&gt;multicast&lt;/code&gt;, &lt;code&gt;publish&lt;/code&gt;, &lt;code&gt;publishReplay&lt;/code&gt;, &lt;code&gt;publishLast&lt;/code&gt;, and &lt;code&gt;refCount&lt;/code&gt;. &lt;code&gt;shareReplay&lt;/code&gt; was too popular to deprecate in 7, but Lesh said it's next because it is "full of footguns.” Long term, the only sharing operators will be &lt;code&gt;share&lt;/code&gt;, &lt;code&gt;connect&lt;/code&gt; and &lt;code&gt;connectable&lt;/code&gt;. He recommends moving to &lt;code&gt;share&lt;/code&gt; now.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;share&lt;/code&gt; is picking up some new features as the single solution operator. It takes an optional config object as a parameter, where you can define custom behavior for the stream.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;share&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;connector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ReplaySubject&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;resetOnRefCountZero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;resetOnComplete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;resetOnError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Better TypeScript Typings
&lt;/h2&gt;

&lt;p&gt;RxJS 7 &lt;a href="https://github.com/ReactiveX/rxjs/blob/6bd1c5f3cf0e387973b44698c48bc933e8c528aa/package.json#L9"&gt;requires TypeScript 4.2&lt;/a&gt;, Lesh said, because it contains features that enable more accurate, stricter types. One example he gave in his slides involved &lt;code&gt;Subject&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// allowed in RxJS 6, errors in 7 because next() must be called with a number&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For teams that are unable to upgrade to TypeScript 4.2, Lesh recommended staying on RxJS 6, which the RxJS team will continue to support.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;toPromise()&lt;/code&gt; Deprecated
&lt;/h2&gt;

&lt;p&gt;The problem with &lt;code&gt;toPromise()&lt;/code&gt;, Lesh explained, was that it didn't make sense with Observables. Should a promise created by &lt;code&gt;toPromise()&lt;/code&gt; resolve with the first or last value emitted from the source Observable?&lt;/p&gt;

&lt;p&gt;So, &lt;code&gt;toPromise()&lt;/code&gt; is deprecated in favor of &lt;code&gt;lastValueFrom()&lt;/code&gt; and &lt;code&gt;firstValueFrom()&lt;/code&gt;. These new functions still convert Observables to Promises, but in a way that clarifies that value the Promise will resolve with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;firstValueFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstVal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;lastValueFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lastVal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an Observable completes without emitting a value, the Promise created by &lt;code&gt;lastValueFrom&lt;/code&gt; or &lt;code&gt;firstValueFrom&lt;/code&gt; rejects. If that is not desired behavior, you can configure the new Promise to resolve with a &lt;code&gt;defaultValue&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emptyVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;firstValueFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;defaultValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;empty&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emptyVal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 'empty'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AsyncIterable Support
&lt;/h2&gt;

&lt;p&gt;Anywhere you can pass an Observable, RxJS 7 also lets you pass an AsyncIterable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Other Updates
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;finalize()&lt;/code&gt; operators now run in the order in which they are written in &lt;code&gt;pipe()&lt;/code&gt;. In contrast, RxJS 6 ran them in reverse.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;subscription.add(someSubscription)&lt;/code&gt; now returns void so people will stop writing &lt;code&gt;add()&lt;/code&gt; chains, which Lesh says never worked.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// add() returns void, cannot be chained&lt;/span&gt;

&lt;span class="nx"&gt;subscription&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subOne&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subTwo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// errors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;animationFrames()&lt;/code&gt; creates Observables to do animation logic reactively&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;switchScan()&lt;/code&gt; operator, aka switchMap with an accumulator&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throwError()&lt;/code&gt; requires a callback, not an error, as the error captures the current stack at the moment of its creation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Your &lt;code&gt;with&lt;/code&gt; Is My Command
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;combineLatest&lt;/code&gt; operator renamed to &lt;code&gt;combineLatestWith&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;merge&lt;/code&gt; operator renamed to &lt;code&gt;mergeWith&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zip&lt;/code&gt; operator renamed to &lt;code&gt;zipWith&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;race&lt;/code&gt; operator renamed to &lt;code&gt;raceWith&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;concat&lt;/code&gt; operator renamed to &lt;code&gt;concatWith&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommendations for Migrating to RxJS 7
&lt;/h2&gt;

&lt;p&gt;If your project can be upgraded to RxJS 7, I would recommend doing so. The speed and bundle size improvements offer tangible, immediate benefits to end users.&lt;/p&gt;

&lt;p&gt;Important points to remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace your &lt;code&gt;toPromise&lt;/code&gt; calls with &lt;code&gt;firstValueFrom&lt;/code&gt; and &lt;code&gt;lastValueFrom&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace your &lt;code&gt;shareReplay&lt;/code&gt; calls with &lt;code&gt;share&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Stop using &lt;code&gt;.add&lt;/code&gt; chains to manage your subscriptions. Lesh &lt;a href="https://medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87"&gt;recommends &lt;code&gt;takeUntil&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need help upgrading to RxJS 7, &lt;a href="https://www.bitovi.com/contact"&gt;fill out this form&lt;/a&gt;. Bitovi has a team of Angular and RxJS experts who can help your team.&lt;/p&gt;

</description>
      <category>rxjs</category>
      <category>angular</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
