diff --git a/lib/index.js b/lib/index.js
index 720d114..4d76472 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,5 +1,6 @@
const fs = require('fs');
const path = require('path');
+const serialize = require('serialize-javascript');
const route_manager = require('./route_manager.js');
const templates = require('./templates.js');
const create_app = require('./utils/create_app.js');
@@ -144,15 +145,25 @@ function get_route_handler(fn) {
if (mod.preload) {
const promise = Promise.resolve(mod.preload(req)).then(preloaded => {
+ const serialized = try_serialize(preloaded);
Object.assign(data, preloaded);
- return mod.render(data);
+
+ return { rendered: mod.render(data), serialized };
});
return templates.stream(res, 200, {
- scripts: ``,
- html: promise.then(rendered => rendered.html),
- head: promise.then(({ head }) => `${head}`),
- styles: promise.then(({ css }) => (css && css.code ? `` : ''))
+ scripts: promise.then(({ serialized }) => {
+ const main = ``;
+
+ if (serialized) {
+ return `${main}`;
+ }
+
+ return main;
+ }),
+ html: promise.then(({ rendered }) => rendered.html),
+ head: promise.then(({ rendered }) => `${rendered.head}`),
+ styles: promise.then(({ rendered }) => (rendered.css && rendered.css.code ? `` : ''))
});
} else {
const { html, head, css } = mod.render(data);
@@ -249,4 +260,12 @@ function compose_handlers(handlers) {
function read_json(file) {
return JSON.parse(fs.readFileSync(file, 'utf-8'));
+}
+
+function try_serialize(data) {
+ try {
+ return serialize(data);
+ } catch (err) {
+ return null;
+ }
}
\ No newline at end of file
diff --git a/package.json b/package.json
index 14785de..71ab91b 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
"relative": "^3.0.2",
"require-relative": "^0.8.7",
"rimraf": "^2.6.2",
+ "serialize-javascript": "^1.4.0",
"webpack": "^3.10.0",
"webpack-hot-middleware": "^2.21.0"
},
diff --git a/src/runtime/index.ts b/src/runtime/index.ts
index 02f15ae..b7144b2 100644
--- a/src/runtime/index.ts
+++ b/src/runtime/index.ts
@@ -68,10 +68,16 @@ function render(Component: ComponentConstructor, data: any, scroll: ScrollPositi
}
}
-function prepare_route(Component, data) {
- return Promise.resolve(
- Component.preload ? Component.preload(data) : {}
- ).then(preloaded => {
+function prepare_route(Component: ComponentConstructor, data: RouteData) {
+ if (!Component.preload) {
+ return { Component, data };
+ }
+
+ 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)
return { Component, data };
});
@@ -176,10 +182,10 @@ export function prefetch(href: string) {
}
function handle_touchstart_mouseover(event: MouseEvent | TouchEvent) {
- const a: HTMLAnchorElement = findAnchor(event.target);
- if (!a || a.rel !== 'prefetch') return;
+ const a: HTMLAnchorElement = findAnchor(event.target);
+ if (!a || a.rel !== 'prefetch') return;
- prefetch(a.href);
+ prefetch(a.href);
}
let inited: boolean;
diff --git a/yarn.lock b/yarn.lock
index 2b9a749..88d001e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3628,6 +3628,10 @@ send@0.16.1:
range-parser "~1.2.0"
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:
version "1.13.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"