mirror of
https://github.com/kevin-DL/sapper.git
synced 2026-01-19 22:05:20 +00:00
serialized preloaded data and send to client as initial payload - fixes #3
This commit is contained in:
29
lib/index.js
29
lib/index.js
@@ -1,5 +1,6 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const serialize = require('serialize-javascript');
|
||||||
const route_manager = require('./route_manager.js');
|
const route_manager = require('./route_manager.js');
|
||||||
const templates = require('./templates.js');
|
const templates = require('./templates.js');
|
||||||
const create_app = require('./utils/create_app.js');
|
const create_app = require('./utils/create_app.js');
|
||||||
@@ -144,15 +145,25 @@ function get_route_handler(fn) {
|
|||||||
|
|
||||||
if (mod.preload) {
|
if (mod.preload) {
|
||||||
const promise = Promise.resolve(mod.preload(req)).then(preloaded => {
|
const promise = Promise.resolve(mod.preload(req)).then(preloaded => {
|
||||||
|
const serialized = try_serialize(preloaded);
|
||||||
Object.assign(data, preloaded);
|
Object.assign(data, preloaded);
|
||||||
return mod.render(data);
|
|
||||||
|
return { rendered: mod.render(data), serialized };
|
||||||
});
|
});
|
||||||
|
|
||||||
return templates.stream(res, 200, {
|
return templates.stream(res, 200, {
|
||||||
scripts: `<script src='${client.main_file}'></script>`,
|
scripts: promise.then(({ serialized }) => {
|
||||||
html: promise.then(rendered => rendered.html),
|
const main = `<script src='${client.main_file}'></script>`;
|
||||||
head: promise.then(({ head }) => `<noscript id='sapper-head-start'></noscript>${head}<noscript id='sapper-head-end'></noscript>`),
|
|
||||||
styles: promise.then(({ css }) => (css && css.code ? `<style>${css.code}</style>` : ''))
|
if (serialized) {
|
||||||
|
return `<script>__SAPPER__ = { preloaded: ${serialized} };</script>${main}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return main;
|
||||||
|
}),
|
||||||
|
html: promise.then(({ rendered }) => rendered.html),
|
||||||
|
head: promise.then(({ rendered }) => `<noscript id='sapper-head-start'></noscript>${rendered.head}<noscript id='sapper-head-end'></noscript>`),
|
||||||
|
styles: promise.then(({ rendered }) => (rendered.css && rendered.css.code ? `<style>${rendered.css.code}</style>` : ''))
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
const { html, head, css } = mod.render(data);
|
const { html, head, css } = mod.render(data);
|
||||||
@@ -250,3 +261,11 @@ function compose_handlers(handlers) {
|
|||||||
function read_json(file) {
|
function read_json(file) {
|
||||||
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function try_serialize(data) {
|
||||||
|
try {
|
||||||
|
return serialize(data);
|
||||||
|
} catch (err) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,6 +26,7 @@
|
|||||||
"relative": "^3.0.2",
|
"relative": "^3.0.2",
|
||||||
"require-relative": "^0.8.7",
|
"require-relative": "^0.8.7",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
|
"serialize-javascript": "^1.4.0",
|
||||||
"webpack": "^3.10.0",
|
"webpack": "^3.10.0",
|
||||||
"webpack-hot-middleware": "^2.21.0"
|
"webpack-hot-middleware": "^2.21.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -68,10 +68,16 @@ function render(Component: ComponentConstructor, data: any, scroll: ScrollPositi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepare_route(Component, data) {
|
function prepare_route(Component: ComponentConstructor, data: RouteData) {
|
||||||
return Promise.resolve(
|
if (!Component.preload) {
|
||||||
Component.preload ? Component.preload(data) : {}
|
return { Component, data };
|
||||||
).then(preloaded => {
|
}
|
||||||
|
|
||||||
|
if (!component && window.__SAPPER__ && window.__SAPPER__.preloaded) {
|
||||||
|
return { Component, data: Object.assign(data, window.__SAPPER__.preloaded) };
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.resolve(Component.preload(data)).then(preloaded => {
|
||||||
Object.assign(data, preloaded)
|
Object.assign(data, preloaded)
|
||||||
return { Component, data };
|
return { Component, data };
|
||||||
});
|
});
|
||||||
@@ -176,10 +182,10 @@ export function prefetch(href: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handle_touchstart_mouseover(event: MouseEvent | TouchEvent) {
|
function handle_touchstart_mouseover(event: MouseEvent | TouchEvent) {
|
||||||
const a: HTMLAnchorElement = <HTMLAnchorElement>findAnchor(<Node>event.target);
|
const a: HTMLAnchorElement = <HTMLAnchorElement>findAnchor(<Node>event.target);
|
||||||
if (!a || a.rel !== 'prefetch') return;
|
if (!a || a.rel !== 'prefetch') return;
|
||||||
|
|
||||||
prefetch(a.href);
|
prefetch(a.href);
|
||||||
}
|
}
|
||||||
|
|
||||||
let inited: boolean;
|
let inited: boolean;
|
||||||
|
|||||||
@@ -3628,6 +3628,10 @@ send@0.16.1:
|
|||||||
range-parser "~1.2.0"
|
range-parser "~1.2.0"
|
||||||
statuses "~1.3.1"
|
statuses "~1.3.1"
|
||||||
|
|
||||||
|
serialize-javascript@^1.4.0:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
|
||||||
|
|
||||||
serve-static@1.13.1:
|
serve-static@1.13.1:
|
||||||
version "1.13.1"
|
version "1.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
|
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
|
||||||
|
|||||||
Reference in New Issue
Block a user