Skip to content

Commit c1dbdb0

Browse files
committed
live-elements-web-server: Added route style prerendering for CSR routes.
1 parent 7426fef commit c1dbdb0

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

packages/live-elements-web-server/lib/routes.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export class ServerViewRoute extends ServerRoute{
6767
this._page = page
6868
this._renders = []
6969
this._scripts = []
70+
this._styles = []
7071
this._bundleScript = null
7172
}
7273

@@ -76,8 +77,10 @@ export class ServerViewRoute extends ServerRoute{
7677
get data(){ return this._data }
7778
get page(){ return this._page }
7879
get scripts(){ return this._scripts }
80+
get styles(){ return this._styles }
7981
get bundleScript(){ return this._bundleScript }
8082

83+
addStyle(style){ this._styles.push(style) }
8184
addScript(script){ this._scripts.push(script) }
8285
setBundleScript(script){ this._bundleScript = script }
8386

packages/live-elements-web-server/lib/web-server.mjs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ export default class WebServer extends EventEmitter{
259259

260260
const placementSource = '[' + viewLoaderData.placements.map(p => `{ module: import("${p.url}"), name: "${p.name}" }`).join(',') + ']'
261261
const viewAssignmentsSource = JSON.stringify(viewLoaderData.assignments)
262+
const viewAssignmentsStyles = viewLoaderData.assignments.scopedStyleLinks
262263

263264
const clientLoader = ClassInfo.extends(view, ComponentRegistry.Components.PageView) ? clientPageViewLoader : clientApplicationLoader
264265
const moduleVirtualLoader = path.join(path.dirname(viewLoaderData.path), bundleName + '.loader.mjs')
@@ -453,7 +454,9 @@ export default class WebServer extends EventEmitter{
453454
if ( !route.pageDOM ){
454455
page.entryScript = '/scripts/' + route.bundleScript
455456
route.pageDOM = page.captureDOM(this._domEmulator)
457+
route.pageContent = this._domEmulator.serializeDOM(route.pageDOM)
456458
}
459+
let pageContent = route.pageContent
457460
if ( route.data ){
458461
let data = null
459462
if ( typeof route.data === 'function' ){
@@ -481,13 +484,15 @@ export default class WebServer extends EventEmitter{
481484
scriptEl.text = scriptContent
482485
route.pageDOM.window.document.head.appendChild(scriptEl)
483486
}
484-
route.pageContent = this._domEmulator.serializeDOM(route.pageDOM)
485-
} else {
486-
if ( !route.pageContent )
487-
route.pageContent = this._domEmulator.serializeDOM(route.pageDOM)
487+
pageContent = this._domEmulator.serializeDOM(route.pageDOM)
488+
}
489+
if ( route.styles.length ){
490+
const location = pageContent.indexOf('</head>')
491+
const insertString = route.styles.map(s => `<link rel="stylesheet" data-purpose="scoped" type="text/css" href="${s}" />`)
492+
pageContent = pageContent.slice(0, location) + insertString + pageContent.slice(location)
488493
}
489494

490-
res.send(route.pageContent)
495+
res.send(pageContent)
491496
res.end()
492497
}
493498

0 commit comments

Comments
 (0)