introduction
一个自定义的Document
通常被使用在应用的<html>
以及 <body>
标签中,这是必要的,因为Next.js 页面跳过了周围文档的定义 ..
为了避免使用默认的Document
,创建一个文件名叫做./pages/_document.js
并扩展Document
类
import Document, { Html, Head, Main, NextScript } from 'next/document'
class MyDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx)
return { ...initialProps }
}
render() {
return (
<Html>
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
export default MyDocument
这上面的代码是Next.js 默认增加的Document
, 随便移除getInitialProps
或者render
函数,如果你不需要改变它们 …
<Html>
,<Head/>
,<Main/>
以及 <Nextscript />
是必须的,为了让页面能够正确的渲染 …
自定义属性允许作为props, 例如 lang
<Head />
组件并不是等同于next/head
的,<Head />
组件仅仅能够使用在Document组件中,但是<head>
能够应用在各个页面中 …
对于其他的情况,例如<title>
标签,我们推荐使用next/head
在页面或者组件中 …
这个ctx
对象能够等价于在getInitialProps
中接收的 …,但是具有一个例外:
renderPage
:Function
他是一个回调用来实际进行React逻辑(同步),它被用来装饰这个函数为了支持服务器渲染包装器(例如 Aphrodite’s 的renderStatic) …
注意
Document
仅仅在服务器上渲染,事件处理器例如onClick
不会工作 … ..
- 在
<Main />
外的React 组件将不会被浏览器初始化,不要在这里增加应用逻辑或者自定义CSS(例如styled-jsx
),如果你需要在所有页面中共享组件(例如菜单或者工具栏),查看
进行替代 …
Document
的getInitialProps
函数将不会在客户端过渡的时候进行调用,或者当一个页面时静态优化的 …Document
当前不支持Next.js 数据抓取函数(例如getStaticProps
或者getServerSideProps
) …
自定义renderPage
应该注意到仅仅有一种原因进行renderPage
的自定义(对于使用了css-in-js的库才需要包装这个应用正确的进行服务端渲染) …
他接收一个选项参数(是一个选项对象) …
import Document from 'next/document'
class MyDocument extends Document {
static async getInitialProps(ctx) {
const originalRenderPage = ctx.renderPage
ctx.renderPage = () =>
originalRenderPage({
// useful for wrapping the whole react tree
enhanceApp: (App) => App,
// useful for wrapping in a per-page basis
enhanceComponent: (Component) => Component,
})
// Run the parent `getInitialProps`, it now includes the custom `renderPage`
const initialProps = await Document.getInitialProps(ctx)
return initialProps
}
}
export default MyDocument
TypeScript
你能够使用内置的DocumentContext
类型并改变文件名为./pages/_document.tsx
import Document, { DocumentContext } from 'next/document'
class MyDocument extends Document {
static async getInitialProps(ctx: DocumentContext) {
const initialProps = await Document.getInitialProps(ctx)
return initialProps
}
}
export default MyDocument