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"