Skip to content
Permalink
Newer
Older
100644 99 lines (90 sloc) 2.39 KB
Aug 23, 2017
1
import React from 'react';
2
import PropTypes from 'prop-types';
3
import Document, { Head, Main, NextScript } from 'next/document';
4
import flush from 'styled-jsx/server';
6
class MyDocument extends Document {
8
const { pageContext } = this.props;
9
11
<html lang="en" dir="ltr">
12
<Head>
13
<meta charSet="utf-8" />
14
{/* Use minimum-scale=1 to enable GPU rasterization */}
15
<meta
16
name="viewport"
17
content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no"
18
/>
19
{/* PWA primary color */}
20
<meta
21
name="theme-color"
22
content={pageContext ? pageContext.theme.palette.primary.main : null}
23
/>
24
<link
25
rel="stylesheet"
26
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500"
27
/>
28
</Head>
29
<body>
30
<Main />
31
<NextScript />
32
</body>
33
</html>
34
);
35
}
36
}
37
38
MyDocument.getInitialProps = ctx => {
39
// Resolution order
40
//
41
// On the server:
42
// 1. app.getInitialProps
43
// 2. page.getInitialProps
44
// 3. document.getInitialProps
45
// 4. app.render
46
// 5. page.render
47
// 6. document.render
48
//
49
// On the server with error:
50
// 1. document.getInitialProps
51
// 2. app.render
52
// 3. page.render
53
// 4. document.render
54
//
55
// On the client
56
// 1. app.getInitialProps
57
// 2. page.getInitialProps
58
// 3. app.render
59
// 4. page.render
60
61
// Render app and page and get the context of the page with collected side effects.
62
let pageContext;
63
const page = ctx.renderPage(Component => {
64
const WrappedComponent = props => {
65
pageContext = props.pageContext;
66
return <Component {...props} />;
67
};
68
69
WrappedComponent.propTypes = {
70
pageContext: PropTypes.object.isRequired,
71
};
76
let css;
77
// It might be undefined, e.g. after an error.
78
if (pageContext) {
79
css = pageContext.sheetsRegistry.toString();
80
}
81
82
return {
83
...page,
84
pageContext,
85
// Styles fragment is rendered after the app and page rendering finish.
86
styles: (
87
<React.Fragment>
88
<style
89
id="jss-server-side"
90
// eslint-disable-next-line react/no-danger
91
dangerouslySetInnerHTML={{ __html: css }}
92
/>
93
{flush() || null}
94
</React.Fragment>
95
),
96
};
97
};
98
99
export default MyDocument;