Skip to main content

Build and deploy

Single-page apps

Edit this page on GitHub

You can turn any SvelteKit app, using any adapter, into a fully client-rendered single-page app (SPA) by disabling SSR at the root layout:

src/routes/+layout.js
ts
export const ssr = false;
src/routes/+layout.ts
ts
export const ssr = false;

SPA mode is highly discouraged: it destroys performance by forcing two network round trips before rendering can begin; harms SEO by downranking your page which is likely to fail core web vitals, excluding engines that don't render JS, and receiving less frequent updates from those that do; and it makes your app inaccessible to users if JavaScript fails or is disabled (which happens more often than you probably think).

You can avoid these drawbacks on a given page by prerendering it. You should thus prerender as many pages as possible when using SPA mode — especially your homepage.

If you don't have any server-side logic (i.e. +page.server.js, +layout.server.js or +server.js files) you can use adapter-static to create your SPA by adding a fallback page.

Usage

Install with npm i -D @sveltejs/adapter-static, then add the adapter to your svelte.config.js with the following options:

svelte.config.js
ts
import adapter from '@sveltejs/adapter-static';
Cannot find module '@sveltejs/adapter-static' or its corresponding type declarations.2307Cannot find module '@sveltejs/adapter-static' or its corresponding type declarations.
export default {
kit: {
adapter: adapter({
fallback: '200.html' // may differ from host to host
})
}
};

The fallback page is an HTML page created by SvelteKit from your page template (e.g. app.html) that loads your app and navigates to the correct route. For example Surge, a static web host, lets you add a 200.html file that will handle any requests that don't correspond to static assets or prerendered pages.

On some hosts it may be index.html or something else entirely — consult your platform's documentation.

Note that the fallback page will always contain absolute asset paths (i.e. beginning with / rather than .) regardless of the value of paths.relative, since it is used to respond to requests for arbitrary paths.

Prerendering individual pages

If you want certain pages to be prerendered, you can re-enable ssr alongside prerender for just those parts of your app:

src/routes/my-prerendered-page/+page.js
ts
export const prerender = true;
export const ssr = true;
src/routes/my-prerendered-page/+page.ts
ts
export const prerender = true;
export const ssr = true;

Apache

To run an SPA on Apache, you should add a static/.htaccess file to route requests to the fallback page:

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteBase /
	RewriteRule ^200\.html$ - [L]
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule . /200.html [L]
</IfModule>