From e63b2b1c03e13af95a1af4c66344526503723341 Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Sun, 19 May 2019 20:14:32 +1200 Subject: [PATCH] WIP: Use react-ssr-prepass to fetchData TODO: State does not update correctly. Need to figure out why. --- package-lock.json | 15 ++++++++++++ package.json | 1 + .../client/src/renderer/ServerRenderer.tsx | 24 +++++++++++++++---- packages/client/types/react-ssr-prepass.d.ts | 12 ++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 packages/client/types/react-ssr-prepass.d.ts diff --git a/package-lock.json b/package-lock.json index 03f536a..1bb628c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10719,6 +10719,12 @@ } } }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -11873,6 +11879,15 @@ "tiny-warning": "^1.0.0" } }, + "react-ssr-prepass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.0.5.tgz", + "integrity": "sha512-A8QXXIHBpzr5/bnG3rwFgJWU6gLo7/dcW1bBIluoBI2hMyC+uuMRO+rXEtUpX6AVDhWfdFVi2I7kvWUDIRgDtA==", + "dev": true, + "requires": { + "object-is": "^1.0.1" + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", diff --git a/package.json b/package.json index d5edcaa..44bb936 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "react-redux": "^6.0.0", "react-router-config": "^5.0.0", "react-router-dom": "^4.3.1", + "react-ssr-prepass": "^1.0.5", "redux": "^4.0.1", "sanitize-html": "^1.20.0", "sourceify": "git+https://github.com/jeremija/sourceify.git#sources-content", diff --git a/packages/client/src/renderer/ServerRenderer.tsx b/packages/client/src/renderer/ServerRenderer.tsx index 6141ef5..109f367 100644 --- a/packages/client/src/renderer/ServerRenderer.tsx +++ b/packages/client/src/renderer/ServerRenderer.tsx @@ -1,4 +1,5 @@ import React from 'react' +import ssrPrepass from 'react-ssr-prepass' import {Action} from 'redux' import {IAPIDef} from '@rondo/common' import {IClientConfig} from './IClientConfig' @@ -18,17 +19,23 @@ export class ServerRenderer http: IHTTPClient }>, ) {} - render( + async render( url: string, store: Store, config: IClientConfig, host: string = '', + headers: Record = {}, ) { const {RootComponent} = this - const http = new HTTPClient(host + config.baseUrl + '/api') + // TODO set cookie in headers here... + const http = new HTTPClient( + 'http://' + host + config.baseUrl + '/api', + headers, + ) const context: StaticRouterContext = {} - const stream = renderToNodeStream( + + const element = ( > - , + ) + + console.log('prepass') + await ssrPrepass(element, async (el, component) => { + if (component && 'fetchData' in component) { + await (component as any).fetchData() + } + }) + console.log('prepass done') + const stream = renderToNodeStream(element) return stream } } diff --git a/packages/client/types/react-ssr-prepass.d.ts b/packages/client/types/react-ssr-prepass.d.ts new file mode 100644 index 0000000..a171530 --- /dev/null +++ b/packages/client/types/react-ssr-prepass.d.ts @@ -0,0 +1,12 @@ +declare module 'react-ssr-prepass' { + import {Component, ReactElement} from 'react' + + export type Visitor = ( + element: ReactElement, + instance?: Component, + ) => void | Promise + + function ssrPrepass(node: ReactElement, visitor?: Visitor): Promise + + export = ssrPrepass +}