After adding emoji trends charts on emojigraph.org/chart-decreasing/, I faced a significant drop 📉 in page loading speed on mobile devices. And the same problem I had with ads.
I’ve already used lazysizes.js for lazy loading images, so I started to search for a way to use the same library to lazy load charts and ads.
Hopefully, there is a lazybeforeunveil event fired on each lazyload element right before the “unveil” transformation.
First, add your chart library dns-prefetch in <head>…</head>
section, so you won’t waste time loading the library but will be ready to load a bit faster once you need it:
<link rel=”preconnect dns-prefetch” href="https://cdn.jsdelivr.net/npm/apexcharts@3.19.3/dist/apexcharts.min.js" crossorigin=”anonymous”>
Then add thelazyload
class to the div containing your chart.
<div id="tracker_chart" class="chart lazyload" data-expand="-150" style="height: 510px;"></div>
You can also set data-expand
attribute to set in pixels when to start to lazy preload images/iframes. It could be set to a negative value, I usedata-expand="-150"
to load chart only after 150px of my chart placeholder are in the viewport area.
I’m using an URL-encoded SVG to make a nice looking chart placeholder.
<div id="chart_brush" style=" height: 510px; width: 100%; background-image: url('data:image/svg+xml;charset=utf8,%3Csvg xmlns="[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)" ...%3E ... %3C/svg%3E'); background-repeat: no-repeat;" >
Add following js code before closing </body>
tag:
<script type="text/javascript"> document.getElementById("tracker_chart").addEventListener("lazybeforeunveil", function() { var scriptLibrary = document.createElement('script'); scriptLibrary.onload = function () { var scriptChart = document.createElement('script'); scriptChart.src = '/js/chart.js'; document.body.appendChild(scriptChart); }; scriptLibrary.src = 'https://cdn.jsdelivr.net/npm/apexcharts@3.19.3/dist/apexcharts.min.js'; document.head.appendChild(scriptLibrary); }); </script>
Here we add EventListener to your chart div, which loads your chart library and javascript to plot the chart after the event is fired.
Where scriptLibrary.src — link to your library, and scriptChart.src — link to js plotting a chart that is dependent on that library.
✅ And that’s all!
To lazy load ads — we can use the same technique:
<script type="text/javascript"> window.addEventListener('DOMContentLoaded', (event) => { if (window.innerWidth<992){ /*your functions for big screen*/ document.getElementById("widget_ad_mobile").addEventListener("lazybeforeunveil", function() { var scriptAds = document.createElement('script'); scriptAds.onload = function () { (adsbygoogle = window.adsbygoogle || []).push({}); }; scriptAds.src = '[https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js'](https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js'); document.getElementById("widget_ad_mobile").appendChild(scriptAds); }); } }); </script>
In my case I use lazy ads loading only on mobile devices (window.innerWidth<992) for widget that are way below the fold (“widget_ad_mobile”).
After implementing chart and ads lazy load I got back to 90+ score and <3s load time on Google PageSpeed for mobile.
If you have any questions, or suggestions for improvement — please let me know in the comments.
Top comments (0)