What does Google say about SEO? /
Quick SEO Quiz

Test your SEO knowledge in 5 questions

Less than a minute. Find out how much you really know about Google search.

🕒 ~1 min 🎯 5 questions

Official statement

Using lazy-loading libraries like echo.js for deferred image loading can be effective. However, it is crucial to ensure that these images are made visible to Google crawlers, possibly by enclosing them in noscript tags or using structured data.
6:14
🎥 Source video

Extracted from a Google Search Central video

⏱ 1h27 💬 EN 📅 17/12/2018 ✂ 10 statements
Watch on YouTube (6:14) →
Other statements from this video 9
  1. 15:06 La puissance de domaine d'un CMS influence-t-elle vraiment le classement SEO ?
  2. 19:26 Comment Google génère-t-il vraiment vos snippets dans les SERP ?
  3. 24:40 Faut-il vraiment retirer l'HTTP du sitemap lors d'une migration HTTPS ?
  4. 31:30 Faut-il paniquer face aux alertes 'téléchargement non commun' dans la Search Console ?
  5. 34:50 Les hreflang mal configurés sabotent-ils vraiment votre visibilité locale ?
  6. 37:46 Faut-il vraiment resoumettre son sitemap après chaque mise à jour ?
  7. 51:08 Le budget de crawl est-il vraiment un facteur limitant pour votre site ?
  8. 53:54 Les redirections 301 sont-elles vraiment indispensables pour conserver le jus de lien d'une page supprimée ?
  9. 55:18 Pourquoi une page qui retire son noindex tarde-t-elle tant à se réindexer ?
📅
Official statement from (7 years ago)
TL;DR

Google accepts lazy-loading libraries like echo.js, but it imposes a strict condition: images must remain accessible to crawlers. Specifically, if your implementation hides images from the bot, you risk losing their indexing in Google Images and weakening your page relevance. Solutions include using noscript tags or structured data—two approaches, each with its technical constraints.

What you need to understand

Why does Google specifically mention echo.js in this statement?

Echo.js is a minimalist JavaScript lazy-loading library that peaked in adoption between 2015 and 2018. At that time, it represented a lightweight solution to defer loading images, but its approach posed a fundamental problem: it replaced the src attribute with a data-echo attribute, making the images invisible to any browser—or crawler—without JavaScript enabled.

Google mentions echo.js not for its current relevance (the library is now largely outdated) but as a case study of a problematic implementation. The real message here? Any lazy-loading technique that hides the real image URL from the crawler exposes you to risks of indexing loss.

What does it really mean to make images visible to crawlers?

The Googlebot executes JavaScript since 2015, but this execution comes with limitations: restricted crawl budget, deferred rendering, timeouts. If your lazy-loading relies solely on JavaScript without a fallback, you create a total dependency on Google's ability to execute your code under optimal conditions.

“Visible to crawlers” means that the image URL must be present in the initial HTML, before any JavaScript processing. No promises, no “maybe”—a technical guarantee that the bot will find the image even if JS fails or is not executed.

What is the practical difference between noscript tags and structured data?

The noscript tag is an elegant solution in appearance: it displays an alternative version of the content when JavaScript is disabled. For lazy-loading, this means duplicating each <img> that is lazy-loaded in a noscript tag that contains the actual image. Googlebot can then extract the URL even if JS crashes.

Structured data (Schema.org ImageObject) offers a different approach: you explicitly declare your images in a JSON-LD block that Google can parse without rendering. It's cleaner from a code perspective, but it doubles the maintenance—any image modification requires updates in two places.

  • Echo.js and similar libraries hide actual URLs in data-* attributes, invisible to crawlers without JavaScript
  • The Googlebot executes JavaScript, but this execution is not guaranteed 100%—crawl budget, timeouts, and JS errors can block rendering
  • Fallbacks using noscript or Schema.org ensure that the image URL remains accessible in raw HTML, regardless of JavaScript
  • Native loading="lazy" (HTML5 attribute) does not have this issue: the src is present from the start; only the actual loading is deferred on the browser side
  • Google Images is particularly sensitive: an uncrawled image will never be indexed in image search, cutting off a significant source of traffic

SEO Expert opinion

Is this recommendation still relevant with Google's modern JavaScript rendering?

Let’s be honest: Google has significantly improved its ability to interpret JavaScript since 2015. The modern Chrome crawler executes most frameworks, and under ideal conditions, it should detect your lazy-loaded images. So why this warning?

Because “most of the time” is not an acceptable SEO strategy. I have seen sites lose 40% of their Google Images traffic after migrating to a poorly configured lazy-loading solution. The issue is not that Google cannot see the images—it’s that it does not always see them, and you have no way to predict when that failure will occur. [To verify]: Google does not publish any data on the success rate of JavaScript rendering by site category.

Are Google's suggested solutions truly feasible at scale?

The suggestion of noscript tags poses a concrete implementation problem: you double the HTML weight of each page containing images. On an e-commerce product page with 20-30 visuals, it quickly becomes unmanageable. And in terms of maintenance, it’s a nightmare—every image change requires synchronizing two places in the DOM.

Structured data ImageObject is more elegant technically but introduces a complexity of dynamic generation. Your CMS or tech stack needs to automatically generate the JSON-LD from the images present on the page—which is not trivial on custom sites or legacy stacks.

Should you abandon lazy-loading to prioritize SEO?

Absolutely not. Lazy-loading is an essential Core Web Vitals optimization, particularly for LCP (Largest Contentful Paint) and CLS (Cumulative Layout Shift). Google itself recommends it through the native loading="lazy" attribute. The real issue is the artisanal JavaScript implementation that hides URLs.

The real lesson here? Always prefer the native loading="lazy" attribute over a third-party library. It offers exactly the same performance benefits without any SEO risk, as the src attribute remains present in the initial HTML. The only cases where you might need a custom library are for advanced behaviors (conditional lazy-loading, custom thresholds)—and even then, ensure the src is indeed present.

Warning: If you are still using echo.js, Lozad.js, or any library that stores the URL in a data attribute, you may be at risk. Check in Google Search Console > Page Indexing if any URLs are returning image-related errors, and test your pages in the URL inspection tool to see what Googlebot is actually seeing.

Practical impact and recommendations

How can I check if my current lazy-loading is problematic?

Use the URL inspection tool in Google Search Console and look at the rendered version. Click on “Test live URL,” then “View tested page” > “Screenshot.” If your images do not appear, it means Googlebot does not see them. Then compare with the raw HTML (tab “More info” > “Rendered HTML”): look for your img tags and verify if the src attribute contains the actual URL or a placeholder.

Another quick check: inspect the source code of your pages (Ctrl+U in Chrome) and look for the URLs of your images. If they only appear in data-src, data-lazy, or similar attributes, you have a problem. The initial HTML must contain the real URLs, end of story.

What is the best technical implementation today?

The simplest and most effective solution in 2024 remains the native loading="lazy" attribute, supported by all modern browsers since 2020. You simply add loading="lazy" to your img tags, and the browser takes care of the rest—no JavaScript, no third-party libraries, no SEO risk. The src attribute remains intact, so Googlebot sees the image immediately.

If you absolutely must use a JavaScript library (for example, for conditional lazy-loading based on network connection), choose a modern library like LazySizes in “noscript” mode: it automatically generates noscript fallbacks and preserves the initial src. But honestly? In 95% of cases, loading="lazy" is more than sufficient.

What should I do if I'm already in production with a problematic implementation?

Don’t panic, but plan a gradual migration. Start with high-traffic pages—product sheets, main landing pages—and test the new implementation on a sample before rolling it out widely. Monitor the evolution of your Google Images traffic in Analytics: it will be the first indicator to change.

During the transition, you can implement a temporary hybrid solution: keep your current JavaScript lazy-loading, but add noscript tags containing the full images. It’s redundant code, sure, but it secures your SEO while you cleanly refactor. These technical optimizations may seem straightforward theoretically, but implementing them on a large scale across complex architectures often requires sharp expertise. If your tech stack is custom or you manage thousands of pages, enlisting a specialized SEO agency can help you avoid costly mistakes and significantly speed up deployment.

  • Audit all pages using lazy-loading via Google Search Console > URL Inspection Tool
  • Check that the src attribute contains the actual URL of the image in the initial HTML (not a placeholder or data attribute)
  • Prioritize the native loading="lazy" attribute for any new implementation
  • If using custom JS, add noscript fallbacks or structured data ImageObject
  • Test the rendered version seen by Googlebot: images should appear in the screenshot from GSC
  • Monitor Google Images traffic in Analytics after any implementation changes
Lazy-loading is essential for performance, but its implementation must ensure that image URLs remain visible in the raw HTML. The native loading="lazy" attribute solves 95% of cases without SEO risk. For the remaining 5% that require custom JavaScript, plan for noscript fallbacks or Schema.org—and always test systematically with Google Search Console tools before deploying.

❓ Frequently Asked Questions

L'attribut loading="lazy" natif HTML5 pose-t-il les mêmes problèmes SEO qu'echo.js ?
Non, aucun risque. L'attribut natif loading="lazy" préserve l'URL dans l'attribut src, donc Googlebot voit l'image immédiatement dans le HTML brut. Seul le chargement effectif côté navigateur est différé, ce qui n'affecte pas le crawl.
Dois-je ajouter des balises noscript même si j'utilise loading="lazy" natif ?
Non, c'est inutile. Les balises noscript ne sont nécessaires que si vous utilisez une bibliothèque JavaScript qui masque l'URL réelle dans un data-attribute. Avec loading="lazy" natif, le src est déjà présent.
Les données structurées ImageObject améliorent-elles le référencement dans Google Images ?
Elles facilitent l'extraction des métadonnées (licence, crédit, légende), mais n'améliorent pas directement le ranking. Leur principal intérêt ici est de servir de fallback si le lazy-loading JavaScript échoue. Pour Google Images, c'est surtout la présence du src dans le HTML et la qualité de l'image qui comptent.
Comment savoir si mes images lazy-loadées sont indexées dans Google Images ?
Faites une recherche site:votredomaine.com dans Google Images pour voir quelles images sont indexées. Comparez avec le nombre total d'images sur votre site. Un écart important peut signaler un problème de crawl lié au lazy-loading.
Le lazy-loading JavaScript sans fallback peut-il affecter le ranking global de la page, pas seulement Google Images ?
Oui, potentiellement. Si vos images portent du contenu sémantique important (schémas, infographies, captures d'interface produit) et que Googlebot ne les voit pas, la pertinence globale de la page peut être sous-évaluée. C'est particulièrement vrai pour les requêtes à intention visuelle forte.
🏷 Related Topics
Domain Age & History Crawl & Indexing Images & Videos JavaScript & Technical SEO PDF & Files

🎥 From the same video 9

Other SEO insights extracted from this same Google Search Central video · duration 1h27 · published on 17/12/2018

🎥 Watch the full video on YouTube →

Related statements

💬 Comments (0)

Be the first to comment.

2000 characters remaining
🔔

Get real-time analysis of the latest Google SEO declarations

Be the first to know every time a new official Google statement drops — with full expert analysis.

No spam. Unsubscribe in one click.