<?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: Hamza Hameed</title>
    <description>The latest articles on DEV Community by Hamza Hameed (@hamza95hameed).</description>
    <link>https://dev.to/hamza95hameed</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4229012%2F108b190a-7f30-458e-8b76-65a4fbf06b58.jpg</url>
      <title>DEV Community: Hamza Hameed</title>
      <link>https://dev.to/hamza95hameed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hamza95hameed"/>
    <language>en</language>
    <item>
      <title>How I Optimized a Shopify Store to Score 95+ on Mobile PageSpeed (Real Case Study)</title>
      <dc:creator>Hamza Hameed</dc:creator>
      <pubDate>Thu, 05 Nov 2026 16:58:33 +0000</pubDate>
      <link>https://dev.to/hamza95hameed/how-i-optimized-a-shopify-store-to-score-95-on-mobile-pagespeed-real-case-study-1b2l</link>
      <guid>https://dev.to/hamza95hameed/how-i-optimized-a-shopify-store-to-score-95-on-mobile-pagespeed-real-case-study-1b2l</guid>
      <description>&lt;p&gt;Most Shopify stores struggle with poor mobile performance. Out of the box, even modern Shopify 2.0 themes can score &lt;strong&gt;under 40 on Google PageSpeed Insights (Mobile)&lt;/strong&gt; once apps, tracking scripts, and oversized product media get added.&lt;/p&gt;

&lt;p&gt;As a full-stack Shopify developer who has delivered &lt;strong&gt;350+ commercial projects&lt;/strong&gt;, slow load times are the #1 complaint I hear from e-commerce store owners. Every 1-second delay in page load can drop conversion rates by &lt;strong&gt;up to 7%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, I’ll break down the exact technical blueprint I used to take a client's production Shopify store from a &lt;strong&gt;34 Mobile Performance Score to a 96+&lt;/strong&gt;, without removing essential features or tracking apps.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Starting Benchmark: Why Most Shopify Stores Fail
&lt;/h2&gt;

&lt;p&gt;Before making changes, we ran an in-depth audit using &lt;strong&gt;Google PageSpeed Insights&lt;/strong&gt; and &lt;strong&gt;WebPageTest&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Score:&lt;/strong&gt; &lt;code&gt;34 / 100&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First Contentful Paint (FCP):&lt;/strong&gt; &lt;code&gt;2.9s&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Largest Contentful Paint (LCP):&lt;/strong&gt; &lt;code&gt;5.8s&lt;/code&gt; (Failing Core Web Vitals)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total Blocking Time (TBT):&lt;/strong&gt; &lt;code&gt;940ms&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cumulative Layout Shift (CLS):&lt;/strong&gt; &lt;code&gt;0.32&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The culprits were classic e-commerce bottlenecks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Render-blocking third-party scripts loaded in &lt;code&gt;theme.liquid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Hero banner images lacking responsive &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;fetchpriority="high"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Multiple unoptimized CSS files and unused legacy plugins.&lt;/li&gt;
&lt;li&gt;Zombie app snippets left behind after apps were uninstalled.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Step 1: Purging "Zombie" Liquid Snippets &amp;amp; App Bloat
&lt;/h2&gt;

&lt;p&gt;When merchants uninstall apps from the Shopify App Store, apps frequently leave behind orphaned Liquid includes, tracking pixels, and CSS files in the theme codebase.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;layout/theme.liquid&lt;/code&gt;, we audited all &lt;code&gt;{% render %}&lt;/code&gt; and &lt;code&gt;{% include %}&lt;/code&gt; tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;comment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-%}&lt;/span&gt;&lt;span class="c"&gt; 
BEFORE: Unused legacy apps executing on every page 
{% render 'old-review-widget-header' %}
{% render 'uninstalled-upsell-tracker' %}
&lt;/span&gt;&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endcomment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Removing dead snippets alone eliminated &lt;strong&gt;18 external HTTP network requests&lt;/strong&gt; and shaved &lt;strong&gt;380 KB&lt;/strong&gt; of uncompressed JavaScript from the initial document head.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Step 2: Optimizing LCP (Largest Contentful Paint)
&lt;/h2&gt;

&lt;p&gt;The hero banner on the homepage was the primary &lt;strong&gt;LCP element&lt;/strong&gt;. It was being lazy-loaded by default, delaying its render until long after JavaScript finished parsing!&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rule for E-Commerce Images:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Above-the-fold (Hero/Main Banner):&lt;/strong&gt; Eager load, high fetch priority, no lazy loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Below-the-fold (Product Grids, Reviews, Footer):&lt;/strong&gt; Lazy load with native &lt;code&gt;loading="lazy"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the optimized Liquid pattern used for the hero image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;section&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-%}&lt;/span&gt;
  &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;section&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;image_tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;widths&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'375, 550, 750, 1100, 1500'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'100vw'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;loading&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'eager'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;fetchpriority&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'high'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;decoding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'async'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'hero-banner__image'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;section&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;alt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-%}&lt;/span&gt;
  &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;section&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;image_tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;widths&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'375, 550, 750, 1100'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'(min-width: 768px) 50vw, 100vw'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;loading&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'lazy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;decoding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'async'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'content-image'&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; LCP dropped from &lt;strong&gt;5.8s down to 1.8s&lt;/strong&gt; immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Step 3: Eliminating Cumulative Layout Shift (CLS)
&lt;/h2&gt;

&lt;p&gt;CLS kills user experience when elements jump around while assets download.&lt;/p&gt;

&lt;p&gt;We fixed layout shifts with two key changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Explicit Aspect Ratios on Image Containers:&lt;/strong&gt;
Always declare explicit &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes or use CSS &lt;code&gt;aspect-ratio&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;   &lt;span class="nc"&gt;.product-card__media&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nl"&gt;aspect-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#f4f4f4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* placeholder color prevents visual jumping */&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Announcement Bar Height Reservation:&lt;/strong&gt;
Dynamic announcement bars or countdown timers often push the entire navbar down when they mount. Reserving a min-height via CSS prevents the layout from reflowing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; CLS plummeted from &lt;code&gt;0.32&lt;/code&gt; down to &lt;strong&gt;&lt;code&gt;0.01&lt;/code&gt;&lt;/strong&gt; (well within Google's "Good" green threshold).&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Step 4: Deferring Third-Party Scripts with &lt;code&gt;requestIdleCallback&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Analytics tags, chat widgets (Gorgias, Zendesk), and review stars (Klaviyo, Yotpo) don't need to load during the critical 1.5-second rendering window.&lt;/p&gt;

&lt;p&gt;Instead of inserting them as synchronous scripts in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, we delayed non-critical scripts until the browser's main thread becomes idle:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadNonCriticalScripts&lt;/span&gt;&lt;span class="p"&gt;()&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;scripts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=YOUR_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// other third-party services&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="nx"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;script&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;span class="c1"&gt;// Execute when browser is idle or after first interaction&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;requestIdleCallback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestIdleCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loadNonCriticalScripts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;load&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loadNonCriticalScripts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&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;p&gt;This reduced &lt;strong&gt;Total Blocking Time (TBT)&lt;/strong&gt; from &lt;code&gt;940ms&lt;/code&gt; down to &lt;strong&gt;&lt;code&gt;85ms&lt;/code&gt;&lt;/strong&gt;, liberating the main thread for smooth scrolling and instant touch responsiveness.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. The Final Results
&lt;/h2&gt;

&lt;p&gt;After testing the optimizations on production:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before Optimization&lt;/th&gt;
&lt;th&gt;After Optimization&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mobile Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;34 / 100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;96 / 100&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Passed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desktop Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;68 / 100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;99 / 100&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Passed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LCP (Largest Contentful Paint)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5.8s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;1.6s&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FCP (First Contentful Paint)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.9s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.9s&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TBT (Total Blocking Time)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;940ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;85ms&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLS (Cumulative Layout Shift)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.01&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Key Takeaways for Developers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit your Liquid assets:&lt;/strong&gt; Don't trust theme uninstalls; check &lt;code&gt;theme.liquid&lt;/code&gt; manually for leftover app code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master &lt;code&gt;fetchpriority="high"&lt;/code&gt;:&lt;/strong&gt; Always use eager loading and high priority for your primary hero image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control third-party execution:&lt;/strong&gt; Never let non-essential tracking scripts block the primary rendering thread.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Need Help Optimizing Your Shopify Store?
&lt;/h3&gt;

&lt;p&gt;I am a Shopify &amp;amp; Laravel Full-Stack Developer specializing in custom theme builds, Vue.js storefronts, and conversion-rate optimization.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore my portfolio and past projects: &lt;strong&gt;&lt;a href="https://hamzahameed.dev/" rel="noopener noreferrer"&gt;hamzahameed.dev&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Need an audit or custom development? &lt;strong&gt;&lt;a href="https://cal.com/hamza95hameed" rel="noopener noreferrer"&gt;Book a Consultation on Cal.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Connect on &lt;strong&gt;&lt;a href="https://github.com/hamza95hameed" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>shopify</category>
      <category>webdev</category>
      <category>performance</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
