Fixing My "Flickering" Issue With SvelteKit Server-Side Rendering
Last editedSince using SvelteKit, I have noticed an peculiar issue when loading data to a page. It is somewhat difficult for me to describe so I will link an example.
When you load this page, you should see a number between 0 and 99 which is quickly replaced by another such number. It might be really quick. Refreshing while disabling your browser cache might make it more pronounced. I’ve long wondered why such behavior existed, but I recently asked on the r/sveltejs subreddit and received two relevant suggestions.
The first was to load the data from
+page.server.js
instead of +page.js
. Because
+page.js
is run on both the server and the client while
+page.server.js
is only run on the server. Meaning the
value that I was seeing at first was from the server and then the
second value was from re-running +page.js
on the client.
Here is
an example of this technique.
However, on another project that already used
+page.server.js
to load its data was still experiencing
this issue. Another commenter explained that this was the result of
server-side rendering. Which makes sense. I don’t REALLY
understand server-side rendering, but my basic understanding is that
the server starts and then hands the website off to the client to
handle the rest. For this other project I went to the
+page.js
of the relevant route and added
export const ssr = false;
. This resolved the flickering
issue.
I have a feeling that this solution is bad practice and a hack.
A commenter suggested that I don’t need to set SSR to false and
instead can just use +page.server.js
“and the SSR
will take care of itself”.
By using console.log
I have noticed differences between
these 3 approaches. In the original approach it logs both the log from
the +page.js
and the +page.svelte
on the
server and in the browser (client). Only the numbers that are longed
are different.
By renaming +page.js
to +page.server.js
the
output on the server is the same but on the client it only logs from
+page.svelte
.
Lastly,
when I disable SSR
in +page.js
I get no logs on the server and get both
lines on the client. I think this illustrates how SSR works. Without
SSR, the client is responsible to run all scripts.
Anyways, server-side rendering is something I should understand more if I want to master web development.