Skip to content

Commit 1857104

Browse files
Stefan Buhrmesterreinink
Stefan Buhrmester
andauthored
Svelte SSR (#1349)
* add Svelte SSR support * Formatting Co-authored-by: Jonathan Reinink <jonathan@reinink.ca>
1 parent 5298add commit 1857104

File tree

5 files changed

+47
-25
lines changed

5 files changed

+47
-25
lines changed

packages/svelte/package.json

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
"keywords": [
2020
"svelte"
2121
],
22+
"exports": {
23+
".": "./src/index.js",
24+
"./server": "./src/server.js"
25+
},
2226
"main": "src/index.js",
2327
"peerDependencies": {
2428
"svelte": "^3.20.0"

packages/svelte/src/App.svelte

-15
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,7 @@
11
<script>
2-
import { router } from '@inertiajs/core'
32
import Render, { h } from './Render.svelte'
43
import store from './store'
54
6-
export let initialPage, resolveComponent
7-
8-
router.init({
9-
initialPage,
10-
resolveComponent,
11-
swapComponent: async ({ component, page, preserveState }) => {
12-
store.update((current) => ({
13-
component,
14-
page,
15-
key: preserveState ? current.key : Date.now(),
16-
}))
17-
},
18-
})
19-
205
$: child = $store.component && h($store.component.default, $store.page.props)
216
$: layout = $store.component && $store.component.layout
227
$: components = layout

packages/svelte/src/SSR.svelte

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
import App from './App.svelte'
3+
export let id, initialPage
4+
</script>
5+
6+
<div data-server-rendered="true" {id} data-page={JSON.stringify(initialPage)}>
7+
<App />
8+
</div>
+34-10
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,56 @@
1-
import { setupProgress } from '@inertiajs/core'
1+
import { router, setupProgress } from '@inertiajs/core'
22
import App from './App.svelte'
3+
import SSR from './SSR.svelte'
4+
import store from './store'
35

4-
export default async function createInertiaApp({ id = 'app', resolve, setup, progress = {}, page, render }) {
6+
export default async function createInertiaApp({ id = 'app', resolve, setup, progress = {}, page, visitOptions }) {
57
const isServer = typeof window === 'undefined'
68
const el = isServer ? null : document.getElementById(id)
79
const initialPage = page || JSON.parse(el.dataset.page)
810
const resolveComponent = (name) => Promise.resolve(resolve(name))
11+
const initialComponent = await resolveComponent(initialPage.component)
912

10-
let head = []
13+
if (!isServer) {
14+
router.init({
15+
initialPage,
16+
resolveComponent,
17+
swapComponent: async ({ component, page, preserveState }) => {
18+
store.update((current) => ({
19+
component,
20+
page,
21+
key: preserveState ? current.key : Date.now(),
22+
}))
23+
},
24+
})
25+
26+
if (progress) {
27+
setupProgress(progress)
28+
}
1129

12-
const svelteApp = await resolveComponent(initialPage.component).then((initialComponent) => {
1330
return setup({
1431
el,
1532
App,
1633
props: {
1734
initialPage,
1835
initialComponent,
1936
resolveComponent,
20-
onHeadUpdate: isServer ? (elements) => (head = elements) : null,
37+
visitOptions,
2138
},
2239
})
23-
})
24-
25-
if (!isServer && progress) {
26-
setupProgress(progress)
2740
}
2841

2942
if (isServer) {
30-
// TODO
43+
store.set({
44+
component: initialComponent,
45+
page: initialPage,
46+
key: null,
47+
})
48+
49+
const { html, head } = SSR.render({ id, initialPage })
50+
51+
return {
52+
body: html,
53+
head: [head],
54+
}
3155
}
3256
}

packages/svelte/src/server.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as default } from '@inertiajs/core/server'

0 commit comments

Comments
 (0)