Skip to content

Commit 466afe7

Browse files
committed
Extract rendering outside createInertiaApp to allow Svelte 4 & 5 compatibility
1 parent e3752b3 commit 466afe7

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

packages/svelte/src/createInertiaApp.js

+11-13
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
import { VERSION } from 'svelte/compiler';
21
import { router, setupProgress } from '@inertiajs/core'
32
import App from './App.svelte'
43
import SSR from './SSR.svelte'
54
import store from './store'
65

7-
const SVELTE_MAJOR_VERSION = parseInt(VERSION.split('.')[0]);
8-
9-
export default async function createInertiaApp({ id = 'app', resolve, setup, progress = {}, page }) {
6+
export default async function createInertiaApp({ id = 'app', resolve, setup, progress = {}, page, ssr }) {
107
const isServer = typeof window === 'undefined'
118
const el = isServer ? null : document.getElementById(id)
129
const initialPage = page || JSON.parse(el.dataset.page)
@@ -47,18 +44,19 @@ export default async function createInertiaApp({ id = 'app', resolve, setup, pro
4744
}
4845

4946
if (isServer) {
50-
const { html, head } = await (async () => {
51-
if (SVELTE_MAJOR_VERSION < 5) {
52-
return SSR.render({ id, initialPage })
53-
} else {
54-
const { render } = await import('svelte/server')
55-
return render(SSR, { props: { id, initialPage } })
56-
}
57-
})()
47+
if (!ssr) {
48+
throw new Error(`createInertiaApp must provide ssr(...) for server-side rendering.`)
49+
}
50+
51+
const { html, head, css } = ssr(SSR, { id, initialPage })
5852

5953
return {
6054
body: html,
61-
head: [head],
55+
head: [
56+
head,
57+
// Note: Svelte 5 no longer output CSS
58+
...(css?.code ? [`<style data-vite-css>${css?.code}</style>`] : []),
59+
],
6260
}
6361
}
6462
}

playgrounds/svelte/resources/js/app.js

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ createInertiaApp({
77
return pages[`./Pages/${name}.svelte`]
88
},
99
setup({ el, App }) {
10+
// Svelte 4: new App({ target: el, hydrate: true })
11+
12+
// Svelte 5
1013
if (el.dataset.serverRendered === 'true') {
1114
hydrate(App, { target: el })
1215
} else {
+6-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
import { createInertiaApp } from '@inertiajs/svelte'
22
import createServer from '@inertiajs/svelte/server'
3-
3+
import { render } from 'svelte/server'
44
createServer((page) =>
55
createInertiaApp({
66
page,
77
resolve: (name) => {
88
const pages = import.meta.glob('./Pages/**/*.svelte', { eager: true })
99
return pages[`./Pages/${name}.svelte`]
1010
},
11+
ssr: (AppSSR, props) => {
12+
// Svelte 4: return AppSSR.render(props)
13+
// Svelte 5: return render(AppSSR, { props })
14+
return render(AppSSR, { props })
15+
},
1116
}),
1217
)

playgrounds/svelte/vite.config.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ export default defineConfig({
99
ssr: 'resources/js/ssr.js',
1010
refresh: true,
1111
}),
12-
svelte(),
12+
svelte({
13+
compilerOptions: {
14+
// Svelte 4 only
15+
// hydratable: true
16+
}
17+
}),
1318
],
1419
})

0 commit comments

Comments
 (0)