Permalink
material-ui/examples/nextjs/pages/_document.js
Newer
100644
90 lines (82 sloc)
2.23 KB
2
import PropTypes from 'prop-types';
3
import Document, { Head, Main, NextScript } from 'next/document';
4
import flush from 'styled-jsx/server';
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 name="theme-color" content={pageContext.theme.palette.primary.main} />
21
<link
22
rel="stylesheet"
23
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500"
24
/>
25
</Head>
26
<body>
27
<Main />
28
<NextScript />
29
</body>
30
</html>
31
);
32
}
33
}
34
35
MyDocument.getInitialProps = ctx => {
36
// Resolution order
37
//
38
// On the server:
39
// 1. app.getInitialProps
40
// 2. page.getInitialProps
41
// 3. document.getInitialProps
42
// 4. app.render
43
// 5. page.render
44
// 6. document.render
47
// 1. document.getInitialProps
48
// 2. app.render
49
// 3. page.render
50
// 4. document.render
51
//
52
// On the client
53
// 1. app.getInitialProps
54
// 2. page.getInitialProps
55
// 3. app.render
56
// 4. page.render
57
58
// Render app and page and get the context of the page with collected side effects.
59
let pageContext;
60
const page = ctx.renderPage(Component => {
61
const WrappedComponent = props => {
62
pageContext = props.pageContext;
63
return <Component {...props} />;
64
};
65
66
WrappedComponent.propTypes = {
67
pageContext: PropTypes.object.isRequired,
68
};
70
return WrappedComponent;
71
});
76
// Styles fragment is rendered after the app and page rendering finish.
78
<React.Fragment>
79
<style
80
id="jss-server-side"
81
// eslint-disable-next-line react/no-danger
82
dangerouslySetInnerHTML={{ __html: pageContext.sheetsRegistry.toString() }}
83
/>
84
{flush() || null}
85
</React.Fragment>