<?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>Forem: Justin Ramel</title>
    <description>The latest articles on Forem by Justin Ramel (@justinramel).</description>
    <link>https://forem.com/justinramel</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%2F104657%2F385d444f-529d-4d2a-8d4e-359b65308a99.jpg</url>
      <title>Forem: Justin Ramel</title>
      <link>https://forem.com/justinramel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/justinramel"/>
    <language>en</language>
    <item>
      <title>Embed FREE video conferencing into your React app in minutes</title>
      <dc:creator>Justin Ramel</dc:creator>
      <pubDate>Tue, 26 May 2020 22:14:19 +0000</pubDate>
      <link>https://forem.com/justinramel/embed-free-video-conferencing-into-your-react-app-in-minutes-27ak</link>
      <guid>https://forem.com/justinramel/embed-free-video-conferencing-into-your-react-app-in-minutes-27ak</guid>
      <description>&lt;p&gt;Impossible you say? That's what I thought until I found Jitsi...&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Jitsi?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jitsi.org/jitsi-meet/"&gt;Jitsi Meet&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;More secure, more flexible, and completely free video conferencing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Is it really possible to get a video conference up and running in minutes? Lets find out...&lt;/p&gt;

&lt;h2&gt;
  
  
  Dev notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/jitsi/jitsi-meet"&gt;Jitsi Meet source&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md"&gt;Web development notes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://meetrix.io/blog/webrtc/integrate-jitsi-meet-to-react-app.html"&gt;React Integration Guide&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  React Component
&lt;/h2&gt;

&lt;p&gt;There is an (unofficial) React component that wraps the standard Jitsi Meet JS API, we'll use it to speed up the React integration process. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/react-jitsi"&gt;npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gatteo/react-jitsi"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add react-jitsi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Add Jitsi to your index.html in my case &lt;code&gt;public\index.html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;body&amp;gt;
...
  &amp;lt;script src='https://meet.jit.si/external_api.js'&amp;gt;&amp;lt;/script&amp;gt;
...
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a basic meeting window
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react';
import Jitsi from 'react-jitsi';

const roomName = 'my-super-secret-meeting-1234567-e89b-12d3-a456-426655440000';
const userFullName = 'Justin';

export const App = () =&amp;gt; (
    &amp;lt;&amp;gt;
        &amp;lt;h2&amp;gt;My First Meeting!&amp;lt;/h2&amp;gt;
        &amp;lt;Jitsi roomName={roomName} displayName={userFullName}/&amp;gt;
    &amp;lt;/&amp;gt;
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Run you app and you should have a running video conference 😀&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;We got quite a bit done in a few minutes 😀&lt;/p&gt;

&lt;p&gt;If you're looking for an embeddable video conference solution, I say give Jitsi a shot!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to setup&lt;/li&gt;
&lt;li&gt;Easy to integrate with React&lt;/li&gt;
&lt;li&gt;Open source&lt;/li&gt;
&lt;li&gt;Free servers all for the cost of the Jitsi logo!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's not to like?&lt;/p&gt;

&lt;h3&gt;
  
  
  BONUS End meeting
&lt;/h3&gt;

&lt;p&gt;You may want to run some code when the user clicks End Meeting. You can do that by subscribing to the 'videoConferenceLeft' event.&lt;/p&gt;

&lt;p&gt;Here I'm redirecting the user to the root of my site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;Jitsi
    ...
    onAPILoad={(api: any) =&amp;gt; {
      api.addEventListener('videoConferenceLeft', () =&amp;gt; {
        navigate('/');
      });
    }}
    ...
  /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>react</category>
      <category>jitsi</category>
      <category>video</category>
      <category>conference</category>
    </item>
    <item>
      <title>React Data Fetching</title>
      <dc:creator>Justin Ramel</dc:creator>
      <pubDate>Sun, 22 Mar 2020 23:06:02 +0000</pubDate>
      <link>https://forem.com/justinramel/react-data-fetching-20ij</link>
      <guid>https://forem.com/justinramel/react-data-fetching-20ij</guid>
      <description>&lt;h1&gt;
  
  
  React Data Fetching
&lt;/h1&gt;

&lt;p&gt;I'm looking for a better way to handle data fetching and updating in React, when I say better I mean something more than my current bare bones Axios implementation.&lt;/p&gt;

&lt;p&gt;Things that are important to me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Size&lt;/li&gt;
&lt;li&gt;Typescript&lt;/li&gt;
&lt;li&gt;Active Community/Support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To the cloud! After searching &lt;a href="https://www.reddit.com/r/reactjs/"&gt;reddit &lt;code&gt;r/reactjs&lt;/code&gt;&lt;/a&gt; for &lt;code&gt;fetch&lt;/code&gt; and picking through the posts I came up with a few libraries that seemed to fit the bill. In no particular order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tannerlinsley/react-query/"&gt;React Query - Hooks for fetching, caching and updating asynchronous data in React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://resthooks.io/"&gt;Rest Hooks - Delightful Data Fetching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swr.now.sh/"&gt;SWR - React Hooks for Remote Data Fetching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.react-async.com/"&gt;React Async - Flexible promise-based React data loader &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stats
&lt;/h2&gt;

&lt;p&gt;First, let's look at the stats at the date of writing this post:&lt;/p&gt;

&lt;h3&gt;
  
  
  Github
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Github&lt;/th&gt;
&lt;th&gt;Contributors&lt;/th&gt;
&lt;th&gt;Issues&lt;/th&gt;
&lt;th&gt;Last change&lt;/th&gt;
&lt;th&gt;Stars&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Query&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;15 hours&lt;/td&gt;
&lt;td&gt;4k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rest Hooks&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2 days&lt;/td&gt;
&lt;td&gt;924&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWR&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;5 days&lt;/td&gt;
&lt;td&gt;7.3k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React Async&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;18 Hours&lt;/td&gt;
&lt;td&gt;1.7k&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  npm
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;npm&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Weekly&lt;/th&gt;
&lt;th&gt;Published&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Query&lt;/td&gt;
&lt;td&gt;1.0.7&lt;/td&gt;
&lt;td&gt;10,583&lt;/td&gt;
&lt;td&gt;16 hours&lt;/td&gt;
&lt;td&gt;357kb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rest Hooks&lt;/td&gt;
&lt;td&gt;4.5.2&lt;/td&gt;
&lt;td&gt;2,871&lt;/td&gt;
&lt;td&gt;3 days&lt;/td&gt;
&lt;td&gt;725kb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWR&lt;/td&gt;
&lt;td&gt;0.1.18&lt;/td&gt;
&lt;td&gt;31,103&lt;/td&gt;
&lt;td&gt;5 days&lt;/td&gt;
&lt;td&gt;76.7kb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React Async&lt;/td&gt;
&lt;td&gt;10.0.0&lt;/td&gt;
&lt;td&gt;15,637&lt;/td&gt;
&lt;td&gt;3 months&lt;/td&gt;
&lt;td&gt;337kb&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SWR wins on stats it's the smallest and most popular of the bunch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playtime
&lt;/h2&gt;

&lt;p&gt;I'm going to try each of the libraries for a couple of hours and see how far I can get converting a page over from vanilla Axios calls to use the library. The page I'm trying has a nested data model of a Story with many Tasks and many Comments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3xNtFUqe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/05a5ucscb41zv4q85rfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3xNtFUqe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/05a5ucscb41zv4q85rfr.png" alt="Story Data Model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  React Query
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/tannerlinsley/react-query#installation"&gt;Installation&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Simple install then straight into sample code, looks simple enough will try fetching my top level, Story model.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/tannerlinsley/react-query/tree/master/examples"&gt;Usage&lt;/a&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tannerlinsley/react-query#query-keys"&gt;Query keys are important&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PROBLEM&lt;/strong&gt; - Typescript typings don't seem to work out of the box ☹️&lt;/p&gt;

&lt;p&gt;Seems the @types/react-search typings are out of sync with the current version too. Ho hum, I've stuck a global module typing in for now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;declare module 'react-query';
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The fetch status returned from &lt;code&gt;useQuery&lt;/code&gt; match exactly the ones I'm using in my vanilla Axios fetcher, handy!&lt;/p&gt;

&lt;p&gt;The first call to the backend failed but error handling picked it up nicely, its&lt;br&gt;
also retrying a few times at different intervals 😀 &lt;a href="https://github.com/tannerlinsley/react-query/tree/92bdf704d3ab776d26b7759e0e95fefa9796e0f7#retries"&gt;Retry Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page is also auto refreshing when I move away and back to the browser, another plus for react-query 😀&lt;/p&gt;

&lt;p&gt;Fixed the query problem and top level Story being returned and cached 😀&lt;/p&gt;

&lt;p&gt;Onto the child data...&lt;/p&gt;

&lt;p&gt;Works exactly the same as the parent component just run the &lt;code&gt;useQuery&lt;/code&gt; hook in the child components.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/tannerlinsley/react-query/tree/92bdf704d3ab776d26b7759e0e95fefa9796e0f7#mutations"&gt;Mutations&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;As well as queries the library also allows mutations, will try sending some updates...&lt;/p&gt;

&lt;p&gt;Updates work but I couldn't get the cache manual update to work. I was hoping to push an updated task into the cache an have it render immediately. Then call a server refresh but I couldn't get that to work. Maybe with a little more time but my few hours are up. It does look like this is worth coming back to revisit.&lt;/p&gt;

&lt;p&gt;My couple of hours are up, how was it?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very easy to get going, I was querying data with very few changes to my current code base&lt;/li&gt;
&lt;li&gt;Auto refresh was an unexpected surprise&lt;/li&gt;
&lt;li&gt;Query and caching worked well but mutation took more work which is to be expected&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rest Hooks
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://resthooks.io/docs/getting-started/installation"&gt;Installation&lt;/a&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Babel config&lt;/li&gt;
&lt;li&gt;Add Cache Provider&lt;/li&gt;
&lt;li&gt;Add Suspense and ErrorBoundary&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://resthooks.io/docs/getting-started/usage"&gt;Usage&lt;/a&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Define a resource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looks promising my project is using Typescript and already uses typed data models so this should be a good fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROBLEM&lt;/strong&gt; - Resources need a defined url, the url I use for the Story model is not static 🙃&lt;br&gt;
How do we handle that? My url would have to be &lt;code&gt;/backlog/{id}/stories&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Looks like we can handle this: &lt;a href="https://resthooks.io/docs/guides/url"&gt;https://resthooks.io/docs/guides/url&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Loading state and error states are handled at a high level on the component tree, or it looks like you can have lower level handlers if you like.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cool we have top level data returned, now can we get the child data...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No problem with child data we just define Resource models for Tasks and Comments and they work&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My couple of hours are up, how was it? Good mostly 'it just worked'.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good docs&lt;/li&gt;
&lt;li&gt;Suspense support was nice&lt;/li&gt;
&lt;li&gt;High level Error handling&lt;/li&gt;
&lt;li&gt;Felt opinionated which is not a bad thing as long as you agree with the opinions 😀&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SWR
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The name “SWR” is derived from stale-while-revalidate, a cache invalidation&lt;br&gt;
strategy popularized by HTTP RFC 5861. SWR first returns the data from cache&lt;br&gt;
(stale), then sends the fetch request (revalidate), and finally comes with the&lt;br&gt;
up-to-date data again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/zeit/swr#usage"&gt;Installation&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Quick start guide seems simple enough, let's give it a try.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Loading of top level data working first time, either this is an easy to use library or I'm getting better using the libraries 😉&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On to the child data... Looks like SWR has us covered here using &lt;a href="https://github.com/zeit/swr#dependent-fetching"&gt;Dependent Fetching&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;SWR also allows you to fetch data that depends on other data. It ensures the&lt;br&gt;
maximum possible parallelism (avoiding waterfalls), as well as serial&lt;br&gt;
fetching when a piece of dynamic data is required for the next data fetch to&lt;br&gt;
happen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Child data working first time too, so far so good. On to mutation!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Mutations
&lt;/h4&gt;

&lt;p&gt;Got it working after wrestling with React Array item mutations, think I now know how to get the mutations working in react-query 😀&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://swr.now.sh/#suspense"&gt;Suspense support&lt;/a&gt; too 😀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How did it go? Really well, there is a lot to like about SWR. No wonder it's so popular!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small&lt;/li&gt;
&lt;li&gt;Typescript working out of the box&lt;/li&gt;
&lt;li&gt;Refresh on re-focus&lt;/li&gt;
&lt;li&gt;Suspense support&lt;/li&gt;
&lt;li&gt;Popular&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  React Async
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation &amp;amp; usage
&lt;/h3&gt;

&lt;p&gt;Installation was straight forward, there are 3 different ways to use the library:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;React Async offers three primary APIs: the useAsync hook, the &lt;br&gt;
component and the createInstance factory function. Each has its unique&lt;br&gt;
benefits and downsides.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'll be trying the &lt;code&gt;useAsync&lt;/code&gt; hook as it most closely matches the other libraries but the &lt;code&gt;Async&lt;/code&gt; components look interesting.&lt;/p&gt;

&lt;p&gt;Let's try and load the top level data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROBLEM&lt;/strong&gt; Typescript setup was a bit funky, good description on how to get it working here &lt;a href="https://www.schannak.com/posts/2019-15-03---React-Async-Typescript/"&gt;React-Async with TypeScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the TypeScript problem was sorted it was onto loading the child data which was straight forward 😀&lt;/p&gt;

&lt;p&gt;Now does it handle mutations? React Async has us covered with &lt;a href="https://docs.react-async.com/guide/optimistic-updates"&gt;optimistic updates&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How did it go? The typescript problems at the start slowed me down for a while but it was all go after that.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cuts out a lot of the component boilerplate&lt;/li&gt;
&lt;li&gt;The helper components look great&lt;/li&gt;
&lt;li&gt;Suspense support&lt;/li&gt;
&lt;li&gt;No caching 🙃&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://swr.now.sh/"&gt;SWR&lt;/a&gt; wins for me, it easily meets my criteria of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Size&lt;/li&gt;
&lt;li&gt;Typescript&lt;/li&gt;
&lt;li&gt;Active Community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I though its popularity might have been due to its &lt;a href="https://nextjs.org/"&gt;next.js&lt;/a&gt; roots but it really stands out on its own. Definitely worth further investigation!&lt;/p&gt;

&lt;p&gt;Maybe you have some other favourite?&lt;/p&gt;

</description>
      <category>react</category>
      <category>fetch</category>
    </item>
  </channel>
</rss>
