Skip to content

fix(solid-router): loaders being called twice during SSR#4574

Merged
schiller-manuel merged 7 commits into
TanStack:mainfrom
brenelz:fix/loaders-getting-called-twice
Jul 6, 2025
Merged

fix(solid-router): loaders being called twice during SSR#4574
schiller-manuel merged 7 commits into
TanStack:mainfrom
brenelz:fix/loaders-getting-called-twice

Conversation

@brenelz

@brenelz brenelz commented Jul 4, 2025

Copy link
Copy Markdown
Contributor

Basically my understanding is that the load function gets called once during SSR but right now our Transitioner calls it again as it appears createRenderEffect run on the server too where as the useEffect in React doesn't.

The fix is just to bail out if its running on the server. Feels kinda hacky but it works.

@nx-cloud

nx-cloud Bot commented Jul 4, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit b0dc899

Command Status Duration Result
nx affected --targets=test:eslint,test:unit,tes... ✅ Succeeded 4m 25s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 30s View ↗

☁️ Nx Cloud last updated this comment at 2025-07-05 02:08:09 UTC

@pkg-pr-new

pkg-pr-new Bot commented Jul 4, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4574

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4574

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4574

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4574

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4574

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4574

@tanstack/react-router-with-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-with-query@4574

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4574

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4574

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4574

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4574

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4574

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4574

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4574

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4574

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4574

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4574

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4574

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4574

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4574

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4574

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4574

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4574

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4574

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4574

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4574

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4574

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4574

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4574

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4574

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4574

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4574

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4574

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4574

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4574

commit: b0dc899

@Ingramz

Ingramz commented Jul 5, 2025

Copy link
Copy Markdown
Contributor

Pointing out that the React version is using a useLayoutEffect utility function which corresponds to React.useLayoutEffect or React.useEffect depending on the environment.

export const useLayoutEffect =
typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect

This is then used throughout the Transitioner.

import { useLayoutEffect, usePrevious } from './utils'

There is also a rough equivalent for this in Solid version, but it isn't used anywhere.

export const useLayoutEffect =
typeof window !== 'undefined' ? Solid.createRenderEffect : Solid.createEffect

Instead, all such occurrences are currently using Solid.createRenderEffect directly.

Solid.createRenderEffect(() => {

Currently the pull request only changes the behavior of the first Solid.createRenderEffect to be not ran on server, but the 3 other occurrences still might. Shouldn't all of the Solid.createRenderEffect usages be uniformly treated to be not executed on the server and not just the first one?

@brenelz

brenelz commented Jul 6, 2025

Copy link
Copy Markdown
Contributor Author

Yeah i tried to touch as little as possible. I tried changing from a renderEffect to a createEffect but that broke some unit tests. Didn't look too much further after that

@SeanCassiere SeanCassiere changed the title fix: solid loaders getting called twice on ssr fix(solid-router): loaders being called twice during SSR Jul 6, 2025
@schiller-manuel
schiller-manuel merged commit eb8a5f0 into TanStack:main Jul 6, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants