Repository navigation
Expand file tree
/
Copy pathmain.js
More file actions
90 lines (85 loc) · 1.96 KB
/
Copy pathmain.js
File metadata and controls
90 lines (85 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import {
createApp,
createSignal,
defineApp,
defineCache,
defineRoute,
html,
readSnapshot
} from "../../src/index.js";
function sharedDefinition() {
return {
signal: {
ssrDemo: createSignal({
productId: null,
selected: false
})
},
cache: {
browser: {
"ssrDemo.product": defineCache({ ttl: 60_000 })
}
},
handler: {
"ssrDemo.selectProduct"() {
this.signals.set("ssrDemo.selected", true);
}
},
route: {
"/ssr/:id": defineRoute("ssrDemo.product.page")
}
};
}
const serverApp = defineApp(sharedDefinition());
serverApp.use({
cache: {
server: {
"ssrDemo.products.get": defineCache({ ttl: 30_000 })
}
},
server: {
async "ssrDemo.products.get"(id) {
return this.cache.getOrSet(`ssrDemo.products:${id}`, () => {
return {
id,
title: "SSR Keyboard"
};
}, { cache: "ssrDemo.products.get" });
}
},
partial: {
async "ssrDemo.product.page"({ id }) {
const product = await this.server.ssrDemo.products.get(id);
return {
__async_server_result__: 1,
html: html`
<article>
<h1>${product.title}</h1>
<p>${product.id}</p>
<button type="button" on:click="ssrDemo.selectProduct" class:selected="ssrDemo.selected">
Select
</button>
</article>
`,
signals: {
"ssrDemo.productId": id
},
cache: {
browser: {
[`ssrDemo.product:${id}`]: product
}
}
};
}
}
});
const serverRuntime = createApp(serverApp, { target: "server" });
const response = await serverRuntime.render("/ssr/sku-1");
serverRuntime.destroy();
document.querySelector("#app").innerHTML = response.html;
const browserApp = defineApp(sharedDefinition());
createApp(browserApp, {
root: document,
router: false,
snapshot: readSnapshot(document)
}).start();