Content that requires JavaScript

highrendering-content-requires-js

If content only exists after JavaScript runs, crawlers and most AI fetchers never see it. How this scanner detects it without a browser of its own.

What it is

This compares the DOM node count and text length in the HTML a server actually sent against the DOM Google's Lighthouse run produces after rendering the page. When the rendered page has several times more nodes than the raw HTML did, and the raw HTML had very little text to begin with, that's the signature of a client-rendered shell rather than a page with real content.

It skips rather than fails when no Lighthouse run is available, since there's nothing to compare the raw HTML against.

Why it matters

Search crawlers, link-preview generators and most AI fetchers read the HTML a server sends — they don't run the JavaScript that would otherwise fill in a client-rendered page. A site that looks complete in a browser can be functionally empty to every one of those systems, which never see anything past an empty <div id="root">.

The fix is architectural — server-render or statically pre-render the route's initial HTML — rather than a tweak: it's a decision made when a rendering approach is chosen, which is why this check exists to catch it early rather than after a whole site is built one way.

How to fix it

with a reference doc
next.config.js
// Use a Server Component, getServerSideProps, or generateStaticParams
// so the route's HTML is rendered on the server, not left empty for
// client JS to fill in.

Reference documentation

Related checks

3
mediumStructured data (JSON-LD)Structured data is a <script type="application/ld+json"> block declaring what a page is, using schema.org vocabulary — Article, Product, Organization, FAQPage and similar types. This check looks for at least one such block that parses as valid JSON and declares a recognizable @type; it isn't a full schema.org validator checking that a given type's required fields are present.mediumAI crawler accessThis reads robots.txt and checks whether it blocks any of the named AI crawlers — OpenAI's GPTBot and OAI-SearchBot, Anthropic's ClaudeBot and Claude-SearchBot, PerplexityBot, Google-Extended, Common Crawl's CCBot and others — distinct from the general-purpose search crawlers (Googlebot, Applebot) that index for classic search.highLargest Contentful Paint (LCP)Largest Contentful Paint (LCP) measures the time from navigation start until the largest image or text block in the viewport has rendered — a stand-in for 'when does this page feel loaded' rather than 'when did the first byte arrive'. It's one of Google's three Core Web Vitals.

This is one of the 75 checks the scanner runs. See what we check for the full list, every severity weight, and how the score is computed from them.

See whether your own site passes content that requires javascript.

One page, all 75 checks, free. No account, no card.

Run a scan