Skip to content

fix(site): work around Astro SSR false "Invalid hook call" warnings#600

Merged
decepulis merged 2 commits intomainfrom
fix/astro-ssr-null-workaround
Feb 24, 2026
Merged

fix(site): work around Astro SSR false "Invalid hook call" warnings#600
decepulis merged 2 commits intomainfrom
fix/astro-ssr-null-workaround

Conversation

@decepulis
Copy link
Copy Markdown
Collaborator

Summary

  • Replace return null with return <></> in three React components that trigger false SSR warnings
  • Workaround for withastro/astro#12283

Problem

Astro's SSR renderer logs false "Invalid hook call" warnings when a React component with hooks returns null instead of JSX. Three components were affected, producing 3 warnings per docs page request:

  1. PreferenceSync — rendered once per page (Base layout)
  2. PreferenceUpdater — rendered twice per docs page (DocsSidebar in desktop + mobile)
  3. TableOfContents — when heading list is empty

How we confirmed

  • Replacing return nullreturn <></> in PreferenceSync dropped errors from 3 → 2
  • Same for PreferenceUpdater → 2 → 0
  • Reverting any single change increases the count back by 1
  • Ruled out: dual React instances, React Compiler, @videojs imports, Astro version (tested 5.17.3)

Test plan

  • pnpm -F site test — 244 tests pass
  • pnpm dev:site — 0 "Invalid hook call" warnings on guide and reference pages

Closes #596

🤖 Generated with Claude Code

Astro's SSR renderer logs false "Invalid hook call" warnings when a
React component with hooks returns `null` (withastro/astro#12283).

Replace `return null` with `return <></>` in three components:
- PreferenceSync (Base layout, every page)
- PreferenceUpdater (DocsSidebar, rendered twice per docs page)
- TableOfContents (empty headings branch)

These three components produced the 3 warnings per docs page request.
Verified: 0 warnings after the change.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel bot commented Feb 24, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
vjs-10-demo-react Ignored Ignored Preview Feb 24, 2026 9:17pm

Request Review

@netlify
Copy link
Copy Markdown

netlify bot commented Feb 24, 2026

Deploy Preview for vjs10-site ready!

Name Link
🔨 Latest commit ef8d819
🔍 Latest deploy log https://app.netlify.com/projects/vjs10-site/deploys/699e15514774ff0008f3fbe2
😎 Deploy Preview https://deploy-preview-600--vjs10-site.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 24, 2026

📦 Bundle Size Report

Package Size Diff %
@videojs/core 5.68 kB 0 B ░░░░░░░░ 0%
@videojs/element 1.60 kB 0 B ░░░░░░░░ 0%
@videojs/html 8.63 kB 0 B ░░░░░░░░ 0%
@videojs/icons 3.46 kB 0 B ░░░░░░░░ 0%
@videojs/react 14.89 kB 0 B ░░░░░░░░ 0%
@videojs/store 1.94 kB 0 B ░░░░░░░░ 0%
@videojs/utils 2.47 kB 0 B ░░░░░░░░ 0%

Total: 38.68 kB · 0 B · 0%


Entry Breakdown

Subpath sizes are the additional bytes on top of the root entry point, measured by bundling root + subpath together and subtracting the root-only size.

@videojs/core
Entry Base PR Diff %
. 3.10 kB 3.10 kB 0 B 0%
./dom 2.58 kB 2.58 kB 0 B 0%
total 5.68 kB 5.68 kB 0 B 0%
@videojs/element
Entry Base PR Diff %
. 817 B 817 B 0 B 0%
./context 823 B 823 B 0 B 0%
total 1.60 kB 1.60 kB 0 B 0%
@videojs/icons
Entry Base PR Diff %
./react 2.10 kB 2.10 kB 0 B 0%
./html 1.37 kB 1.37 kB 0 B 0%
total 3.46 kB 3.46 kB 0 B 0%
@videojs/react
Entry Base PR Diff %
. 7.69 kB 7.69 kB 0 B 0%
./audio 266 B 266 B 0 B 0%
./background 268 B 268 B 0 B 0%
./video 6.69 kB 6.69 kB 0 B 0%
total 14.89 kB 14.89 kB 0 B 0%
@videojs/store
Entry Base PR Diff %
. 1.29 kB 1.29 kB 0 B 0%
./html 468 B 468 B 0 B 0%
./react 199 B 199 B 0 B 0%
total 1.94 kB 1.94 kB 0 B 0%
@videojs/utils
Entry Base PR Diff %
./array 104 B 104 B 0 B 0%
./dom 684 B 684 B 0 B 0%
./events 227 B 227 B 0 B 0%
./function 197 B 197 B 0 B 0%
./object 119 B 119 B 0 B 0%
./predicate 265 B 265 B 0 B 0%
./string 110 B 110 B 0 B 0%
./style 185 B 185 B 0 B 0%
./time 478 B 478 B 0 B 0%
./number 158 B 158 B 0 B 0%
total 2.47 kB 2.47 kB 0 B 0%

ℹ️ How to interpret

Sizes are minified + brotli, measured with esbuild.
Package totals are computed as root size + marginal subpath costs.
Subpath marginal cost = (root + subpath bundled together) − root alone.

Icon Meaning
No change
🔺 Increased ≤ 10%
🔴 Increased > 10%
🔽 Decreased
🆕 New (no baseline)

Run pnpm size locally to check current sizes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@decepulis decepulis merged commit c11395e into main Feb 24, 2026
12 checks passed
@decepulis decepulis deleted the fix/astro-ssr-null-workaround branch February 24, 2026 21:21
return null;
// Workaround: Astro SSR logs false "Invalid hook call" when a React
// component with hooks returns null. See withastro/astro#12283.
return <></>;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feels like a bug with Astro, null is valid. You may need to add a comment to get Biome to ignore this?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh yeah totally a bug with Astro. I didn't notice Biome was warning about it though. Thanks for the heads up!

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah maybe Biome is cool with it now. I think I originally switched it to null as it (or maybe ESLint back then) was complaining.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been seeing these rule of hooks errors for AGES. I don't think you exclusively started this? (#597 was happening, too, so, who knows)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(site): Invalid hook call warnings during SSR (Astro bug with return null)

2 participants