Skip to content

Commit 1ff5e96

Browse files
Daryl ThayilDaryl Thayil
authored andcommitted
add hydrateRender to Resolver
Lets us take advantage of the ReactDOM.hydrate method
1 parent 7b1e3a7 commit 1ff5e96

File tree

6 files changed

+72
-2
lines changed

6 files changed

+72
-2
lines changed

docs/getting-started/ClientRendering.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,18 @@ import { Resolver } from "react-resolver";
2020
Resolver.render(
2121
() => <Router ... />,
2222
document.getElementById("app")
23-
);
23+
);
2424
```
25+
26+
If you want to take advantage of the `hydrate()` method available on `ReactDOM` [React Dom Docs]('https://reactjs.org/docs/react-dom.html#hydrate'), `Resolver` supports this with the `hydrateRender()` method.
27+
28+
Use this just like `Resolver.render()`;
29+
30+
```js
31+
import { Resolver } from "react-resolver";
32+
33+
Resolver.hydrateRender(
34+
() => <Router ... />,
35+
document.getElementById("app")
36+
);
37+
```

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"gitbook-cli": "2.3.0",
1717
"gitbook-plugin-prism": "^1.1.0",
1818
"gitbook-plugin-todo": "0.1.2",
19+
"jsdom": "^11.11.0",
1920
"mocha": "2.3.4",
2021
"prop-types": "^15.5.8",
2122
"react": "^16.0.0",

src/Resolver.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,23 @@ export default class Resolver extends React.Component {
4545
delete window[PAYLOAD];
4646
}
4747

48+
static hydrateRender = function(render, node, data = window[PAYLOAD]) {
49+
ReactDOM.hydrate((
50+
<Resolver data={data}>
51+
{render}
52+
</Resolver>
53+
), node);
54+
55+
delete window[PAYLOAD];
56+
}
57+
4858
static resolve = function(render, initialData = {}) {
4959
const queue = [];
5060

5161
renderToStaticMarkup(
5262
<Resolver data={initialData} onResolve={((promise) => {
5363
queue.push(promise);
54-
return Promise.resolve(true);
64+
return Promise.resolve(true);
5565
})}>
5666
{render}
5767
</Resolver>

test/mocha.opts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
--compilers js:babel/register
2+
--require ./test/setup.js
23
--recursive
34
--reporter spec
45
--ui bdd

test/resolve.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,28 @@ describe("@resolve", function() {
6868
);
6969
});
7070
});
71+
72+
context("browser render and hydrateRender", function() {
73+
74+
it("browser render", () => {
75+
return Resolver.render(() => (<Test actual="testRender" expected="testRender" />), document.getElementById("resolver"))
76+
})
77+
78+
it("browser hydrateRender", () => {
79+
return Resolver.hydrateRender(() => (<Test actual="testHydrateRender" expected="testHydrateRender" />), document.getElementById("resolver"))
80+
})
81+
82+
it("browser render markup", function() {
83+
Resolver.render(() => (<Test actual="testRender" expected="testRender" />), document.getElementById("resolver"));
84+
const markup = document.getElementById("resolver").innerHTML;
85+
assert.equal(markup, "<pre>testRender</pre>");
86+
});
87+
88+
it("browser hydrateRender markup", function() {
89+
Resolver.hydrateRender(() => (<Test actual="testHydrateRender" expected="testHydrateRender" />), document.getElementById("resolver"))
90+
const markup = document.getElementById("resolver").innerHTML;
91+
assert.equal(markup, "<pre>testHydrateRender</pre>");
92+
});
93+
94+
});
7195
});

test/setup.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const { JSDOM } = require('jsdom');
2+
3+
const jsdom = new JSDOM('<!doctype html><html><body><div id="resolver"/></body></html>');
4+
const { window } = jsdom;
5+
6+
function copyProps(src, target) {
7+
const props = Object.getOwnPropertyNames(src)
8+
.filter(prop => typeof target[prop] === 'undefined')
9+
.reduce((result, prop) => ({
10+
...result,
11+
[prop]: Object.getOwnPropertyDescriptor(src, prop)
12+
}), {});
13+
Object.defineProperties(target, props);
14+
}
15+
16+
global.window = window;
17+
global.document = window.document;
18+
global.navigator = {
19+
userAgent: 'node.js'
20+
};
21+
copyProps(window, global);

0 commit comments

Comments
 (0)