Skip to content

Commit 4a2e41a

Browse files
committed
Hydrate the element page
1 parent c90d56d commit 4a2e41a

File tree

5 files changed

+38
-9
lines changed

5 files changed

+38
-9
lines changed

packages/site-client/src/components/wco-element-page.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export class WCOElementPage extends LitElement {
4141
}
4242
`;
4343

44-
@property()
44+
@property({attribute: false})
4545
elementData?: ElementData;
4646

4747
render() {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* @license
3+
* Copyright 2022 Google LLC
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
import {renderElementPage} from './element.js';
8+
import {hydrate} from 'lit/experimental-hydrate.js';
9+
10+
const data = (
11+
window as unknown as {__ssrData: Parameters<typeof renderElementPage>}
12+
).__ssrData;
13+
hydrate(renderElementPage(...data), document.body);

packages/site-client/src/entrypoints/element.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@
55
*/
66

77
import '../components/wco-element-page.js';
8+
import type {ElementData} from '../components/wco-element-page.js';
9+
import {html} from 'lit';
10+
11+
export const renderElementPage = (elementData: ElementData) =>
12+
html`<wco-element-page .elementData=${elementData}></wco-element-page>`;

packages/site-server/src/catalog/routes/element/element-route.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88
import {render} from '@lit-labs/ssr/lib/render-with-global-dom-shim.js';
99

1010
import {DefaultContext, DefaultState, ParameterizedContext} from 'koa';
11-
import {html} from 'lit';
1211
import {Readable} from 'stream';
1312
import {gql} from '@apollo/client/core/index.js';
1413
import Router from '@koa/router';
1514

16-
import '@webcomponents/internal-site-client/lib/entrypoints/element.js';
15+
import {renderElementPage} from '@webcomponents/internal-site-client/lib/entrypoints/element.js';
1716
import {renderPage} from '../../../templates/base.js';
1817
import {client} from '../../graphql.js';
1918

@@ -96,12 +95,11 @@ export const handleElementRoute = async (
9695
renderPage({
9796
title: `${packageName}/${elementName}`,
9897
scripts: ['/js/hydrate.js', '/js/element.js'],
99-
// TODO (justinfagnani): If we want to hydrate, we need to serialize the
100-
// initial data and embed in the response
101-
content: render(
102-
html`<wco-element-page .elementData=${elementData}></wco-element-page>`,
103-
{deferHydration: true}
104-
),
98+
initScript: '/js/element-hydrate.js',
99+
content: render(renderElementPage(elementData), {deferHydration: true}),
100+
initialData: [
101+
elementData
102+
],
105103
})
106104
);
107105
};

packages/site-server/src/templates/base.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export function* renderPage(data: {
99
scripts?: Array<string>;
1010
title?: string;
1111
content: string | Iterable<string>;
12+
initialData?: object;
13+
initScript?: string;
1214
}) {
1315
yield `<!doctype html>
1416
<html lang="en">
@@ -58,6 +60,17 @@ export function* renderPage(data: {
5860
} else {
5961
yield* data.content;
6062
}
63+
64+
if (data.initialData !== undefined) {
65+
yield `<script>window.__ssrData = ${JSON.stringify(
66+
data.initialData
67+
).replace(/</g, '\\u003c')}</script>`;
68+
}
69+
70+
if (data.initScript !== undefined) {
71+
yield `<script type="module" src="${data.initScript}"></script>`;
72+
}
73+
6174
yield `
6275
</body>
6376
</html>

0 commit comments

Comments
 (0)