File tree Expand file tree Collapse file tree 5 files changed +38
-9
lines changed Expand file tree Collapse file tree 5 files changed +38
-9
lines changed Original file line number Diff line number Diff line change @@ -41,7 +41,7 @@ export class WCOElementPage extends LitElement {
41
41
}
42
42
` ;
43
43
44
- @property ( )
44
+ @property ( { attribute : false } )
45
45
elementData ?: ElementData ;
46
46
47
47
render ( ) {
Original file line number Diff line number Diff line change
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 ) ;
Original file line number Diff line number Diff line change 5
5
*/
6
6
7
7
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 > ` ;
Original file line number Diff line number Diff line change 8
8
import { render } from '@lit-labs/ssr/lib/render-with-global-dom-shim.js' ;
9
9
10
10
import { DefaultContext , DefaultState , ParameterizedContext } from 'koa' ;
11
- import { html } from 'lit' ;
12
11
import { Readable } from 'stream' ;
13
12
import { gql } from '@apollo/client/core/index.js' ;
14
13
import Router from '@koa/router' ;
15
14
16
- import '@webcomponents/internal-site-client/lib/entrypoints/element.js' ;
15
+ import { renderElementPage } from '@webcomponents/internal-site-client/lib/entrypoints/element.js' ;
17
16
import { renderPage } from '../../../templates/base.js' ;
18
17
import { client } from '../../graphql.js' ;
19
18
@@ -96,12 +95,11 @@ export const handleElementRoute = async (
96
95
renderPage ( {
97
96
title : `${ packageName } /${ elementName } ` ,
98
97
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
+ ] ,
105
103
} )
106
104
) ;
107
105
} ;
Original file line number Diff line number Diff line change @@ -9,6 +9,8 @@ export function* renderPage(data: {
9
9
scripts ?: Array < string > ;
10
10
title ?: string ;
11
11
content : string | Iterable < string > ;
12
+ initialData ?: object ;
13
+ initScript ?: string ;
12
14
} ) {
13
15
yield `<!doctype html>
14
16
<html lang="en">
@@ -58,6 +60,17 @@ export function* renderPage(data: {
58
60
} else {
59
61
yield * data . content ;
60
62
}
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
+
61
74
yield `
62
75
</body>
63
76
</html>
You can’t perform that action at this time.
0 commit comments