<?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: Apoorv Saxena</title>
    <description>The latest articles on DEV Community by Apoorv Saxena (@apoorv_saxena).</description>
    <link>https://dev.to/apoorv_saxena</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%2F33386%2Fc9863625-3458-4c49-af55-f0b88da8863b.jpg</url>
      <title>DEV Community: Apoorv Saxena</title>
      <link>https://dev.to/apoorv_saxena</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apoorv_saxena"/>
    <language>en</language>
    <item>
      <title>Introducing AsyncResolver.js: Resolve async subscribed decisions</title>
      <dc:creator>Apoorv Saxena</dc:creator>
      <pubDate>Mon, 18 Jun 2018 19:39:33 +0000</pubDate>
      <link>https://dev.to/apoorv_saxena/introducing-asyncresolverjs-resolve-async-subscribed-decisions-3ci1</link>
      <guid>https://dev.to/apoorv_saxena/introducing-asyncresolverjs-resolve-async-subscribed-decisions-3ci1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;PubSub architecture implements a disjointed paradigm where subscribers just listen when an event is published. There are situations where we want to maintain multiple listeners/subscribers of an event, though want to act on the basis of how subscribers react.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Let's consider a case where there are several components on a webpage, whose state can be changed by the user and we make every component to subscribe as listener to listen to a page transition so that we can check if a user is trying to move without saving data.&lt;/p&gt;

&lt;p&gt;Now, when a user clicks on a link, we publish an event mentioning of the transition of user from the page, though we want to ask every listener (or component) if user has made any changes to their state and is moving without saving them. &lt;/p&gt;

&lt;p&gt;In case there are any unsaved changes in any of the component, then we cancel the transition and instead display an information dialog to the user asking him to save information before proceeding further. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nwNvuWrf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/972g7aw2yqoo34qvrgzq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nwNvuWrf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/972g7aw2yqoo34qvrgzq.png" alt="AsyncResolver.js Asynchronously resolve subscribed decisions" title="AsyncResolver.js Asynchronously resolve subscribed decisions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AsyncResolver.js&lt;/strong&gt; is the solution for this need, it's an amalgamation of pub sub architecture and promises to provide decision making capability in asynchronous environment.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;### NPM&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;async-resolver

&lt;span class="c"&gt;### Yarn&lt;/span&gt;
yarn add async-resolver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AsyncResolver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;async-resolver&lt;/span&gt;&lt;span class="dl"&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;resolver&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;AsyncResolver&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;resolver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;locationChange&lt;/span&gt;&lt;span class="dl"&gt;'&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;resolver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;locationChange&lt;/span&gt;&lt;span class="dl"&gt;'&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;resolver&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;locationChange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;promiseMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;any&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;location change allowed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;location change denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;For details, checkout &lt;a href="https://github.com/ApoorvSaxena/async-resolver"&gt;AsyncResolver.js repo on Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>🚀 Introducing Lozad.js: Performant &amp; light lazy loading library</title>
      <dc:creator>Apoorv Saxena</dc:creator>
      <pubDate>Tue, 19 Sep 2017 04:09:44 +0000</pubDate>
      <link>https://dev.to/apoorv_saxena/-introducing-lozadjs-performant--light-lazy-loading-library</link>
      <guid>https://dev.to/apoorv_saxena/-introducing-lozadjs-performant--light-lazy-loading-library</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnptus1dcu12hkhdnjghc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnptus1dcu12hkhdnjghc.png" title="lozad.js lazy loading javascript library" alt="lozad.js lazy loading javascript library"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lazy loading is a programming practice in which a component is loaded only at the time of need. This gives great performance boost especially when the time taken to load a component is significant, and there are several such components in an application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In webpages, images/social-widgets/ads/videos etc. contribute majorly to the increase in page load time because of their size or the resources loaded by them. Thus, to decrease page load time, it's absolutely necessary to lazy load all such components which are not critical, at the time of need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yet another Lazy Loading JavaScript library, why?
&lt;/h3&gt;

&lt;p&gt;Existing lazy loading libraries hook up to the scroll event or use a periodic timer and call &lt;code&gt;getBoundingClientRect()&lt;/code&gt; on elements that need to be lazy loaded. This approach, however, is painfully slow as each call to &lt;code&gt;getBoundingClientRect()&lt;/code&gt; forces the browser to re-layout the entire page and will introduce considerable jank to your website.&lt;/p&gt;

&lt;p&gt;Making this more efficient and performant is what &lt;a href="https://developers.google.com/web/updates/2016/04/intersectionobserver" rel="noopener noreferrer"&gt;IntersectionObserver&lt;/a&gt; is designed for, and it’s landed in Chrome 51. IntersectionObservers let you know when an observed element enters or exits the browser’s viewport.&lt;/p&gt;




&lt;h3&gt;
  
  
  Introducing &lt;strong&gt;Lozad.js&lt;/strong&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;lazy loads elements performantly using pure JavaScript,&lt;/li&gt;
&lt;li&gt;is a light-weight library, just &lt;strong&gt;535 bytes&lt;/strong&gt; minified &amp;amp; gzipped,&lt;/li&gt;
&lt;li&gt;has NO DEPENDENCIES :)&lt;/li&gt;
&lt;li&gt;allows lazy loading of dynamically added elements as well.&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You can install lozad with npm&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; lozad

&lt;span class="c"&gt;# Alternatively you can use Yarn.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn add lozad

&lt;span class="c"&gt;# Another option is to use Bower.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bower &lt;span class="nb"&gt;install &lt;/span&gt;lozad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or load via &lt;strong&gt;CDN&lt;/strong&gt; and include in the &lt;code&gt;head&lt;/code&gt; tag of your page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/javascript"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/lozad/dist/lozad.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;In HTML, add an identifier to the element (default selector identified is &lt;code&gt;lozad&lt;/code&gt; class):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"lozad"&lt;/span&gt; &lt;span class="na"&gt;data-src=&lt;/span&gt;&lt;span class="s"&gt;"image.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All you need to do now is just instantiate Lozad as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lazy loads elements with default selector as '.lozad'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lozad&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;For details, checkout &lt;a href="https://github.com/ApoorvSaxena/lozad.js" rel="noopener noreferrer"&gt;Lozad.js repo on Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Hi, I'm Apoorv Saxena</title>
      <dc:creator>Apoorv Saxena</dc:creator>
      <pubDate>Sat, 16 Sep 2017 03:51:08 +0000</pubDate>
      <link>https://dev.to/apoorv_saxena/hi-im-apoorv-saxena</link>
      <guid>https://dev.to/apoorv_saxena/hi-im-apoorv-saxena</guid>
      <description>&lt;p&gt;I am a polygot programmer from India.&lt;/p&gt;

&lt;p&gt;You can find me on GitHub as &lt;a href="https://github.com/ApoorvSaxena/" rel="noopener noreferrer"&gt;ApoorvSaxena&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most recent open source contribution is &lt;a href="https://github.com/ApoorvSaxena/lozad.js" rel="noopener noreferrer"&gt;Lozad.js&lt;/a&gt;, light and performant lazy loading library.&lt;/p&gt;

&lt;p&gt;Big fan of performance optimisations in webpages, checkout publications and links to conference talks on &lt;a href="https://in.linkedin.com/in/saxenaapoorv" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nice to meet you.&lt;/p&gt;

</description>
      <category>introduction</category>
    </item>
  </channel>
</rss>
