在_document之外使用Next.js Head组件会使页面崩溃

幻影

我正在尝试将Next.jsTypescriptMaterial UI结合使用在线上有无数的教程,介绍如何设置Next.js以使其与Material UI一起使用,并且它们似乎都在_document.js和中_app.js分别使用了完全相同的代码

我都试过适应代码_document.js一点点为打字稿_document.tsx,并复制粘贴它就好了,但每次我得到了同样的问题,这是每当我尝试使用<Head />_document.tsx,甚至只是内_app.tsx设置一个如教程中的代码所示,标题和视口元数据显示了非常无用的错误消息(下面包括完整的stacktrace):

TypeError: Cannot destructure property 'styles' of 'this.context' as it is null.

我在上一个项目中遇到了完全相同的问题,这就是为什么它令我感到惊讶和沮丧,因为似乎没有人遇到与我相同的问题,而且我能找到的每个教程都包含完全相同的代码,似乎不适合我。

这是我的代码:

_document.tsx

import React from "react";
import Document, { DocumentContext, DocumentInitialProps, Head, Html, Main, NextScript } from "next/document";
import { ServerStyleSheets } from "@material-ui/core/styles";
import theme from "../constants/theme";

class MyDocument extends Document {
    render() {
        return (
            <Html lang="en">
                <Head>
                    <meta name="theme-color" content={theme.palette.primary.main} />
                </Head>
                <body>
                    <Main />
                    <NextScript />
                </body>
            </Html>
        );
    }

    static async getInitialProps(ctx: DocumentContext): Promise<DocumentInitialProps> {
        const sheets = new ServerStyleSheets();
        const originalRenderPage = ctx.renderPage;

        ctx.renderPage = () => originalRenderPage({
            enhanceApp: (App) => (props) => sheets.collect(<App {...props} />)
        });

        const initialProps = await Document.getInitialProps(ctx);

        return {
            ...initialProps,
            styles: [...React.Children.toArray(initialProps.styles), sheets.getStyleElement()]
        }
    }
}

export default MyDocument;

_app.tsx

import { CssBaseline, ThemeProvider } from "@material-ui/core";
import { Head } from "next/document";
import React from "react"
import theme from "../constants/theme";

function MyApp({ Component, pageProps }) {
  React.useEffect(() => {
    const jssStyles = document.querySelector("#jss-server-side");
    if (jssStyles) jssStyles.parentElement.removeChild(jssStyles);
  }, []);

  return (
    <React.Fragment>
      <Head>
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
      </Head>
      <ThemeProvider theme={theme}>
        <CssBaseline />
        <Component {...pageProps} />
      </ThemeProvider>
    </React.Fragment>
  )
}

export default MyApp

如果需要的话,我会很乐意提供更多信息,但是由于我不太了解问题所在,因此我真的不知道哪些部分与发布有关。

这是我得到的错误的完整stacktrace

TypeError: Cannot destructure property 'styles' of 'this.context' as it is null.
    at Head.render (E:\dev\weblore-web\.next\server\pages\_document.js:484:7)
    at processChild (E:\dev\weblore-web\node_modules\react-dom\cjs\react-dom-server.node.development.js:3450:18)
    at resolve (E:\dev\weblore-web\node_modules\react-dom\cjs\react-dom-server.node.development.js:3270:5)
    at ReactDOMServerRenderer.render (E:\dev\weblore-web\node_modules\react-dom\cjs\react-dom-server.node.development.js:3753:22)
    at ReactDOMServerRenderer.read (E:\dev\weblore-web\node_modules\react-dom\cjs\react-dom-server.node.development.js:3690:29)
    at renderToString (E:\dev\weblore-web\node_modules\react-dom\cjs\react-dom-server.node.development.js:4298:27)
    at renderPage (E:\dev\weblore-web\node_modules\next\dist\next-server\server\render.js:54:851)   
    at Object.ctx.renderPage (E:\dev\weblore-web\.next\server\pages\_document.js:963:28)
    at Function.getInitialProps (E:\dev\weblore-web\.next\server\pages\_document.js:310:19)
    at Function.getInitialProps (E:\dev\weblore-web\.next\server\pages\_document.js:971:85)
    at loadGetInitialProps (E:\dev\weblore-web\node_modules\next\dist\next-server\lib\utils.js:5:101)
    at renderToHTML (E:\dev\weblore-web\node_modules\next\dist\next-server\server\render.js:54:1142)    at async E:\dev\weblore-web\node_modules\next\dist\next-server\server\next-server.js:107:97     
    at async E:\dev\weblore-web\node_modules\next\dist\next-server\server\next-server.js:100:142    
    at async DevServer.renderToHTMLWithComponents (E:\dev\weblore-web\node_modules\next\dist\next-server\server\next-server.js:132:387)
    at async DevServer.renderToHTML (E:\dev\weblore-web\node_modules\next\dist\next-server\server\next-server.js:133:522)
JR

Head需要从“ next / head”而不是“ next / document”导入。请参阅文档:https : //nextjs.org/docs/api-reference/next/head

但是,这一次您必须使用默认导入:

import Head from "next/head";

_app.tsx需要相应地进行调整:

import { CssBaseline, ThemeProvider } from "@material-ui/core";
import Head from "next/head";
import React from "react"
import theme from "../constants/theme";

function MyApp({ Component, pageProps }) {
  React.useEffect(() => {
    const jssStyles = document.querySelector("#jss-server-side");
    if (jssStyles) jssStyles.parentElement.removeChild(jssStyles);
  }, []);

  return (
    <React.Fragment>
      <Head>
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
      </Head>
      <ThemeProvider theme={theme}>
        <CssBaseline />
        <Component {...pageProps} />
      </ThemeProvider>
    </React.Fragment>
  )
}

export default MyApp

我也遇到了这个问题,因为WebStorm中的代码完成提示错误的包含。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在React组件之外使用路由信息

来自分类Dev

在Angular JS之外使用JSP(或Velocity模板)

来自分类Dev

在命令之外使用 discord.js 模块

来自分类Dev

我可以在Angular组件之外使用AngularJS的$ q吗?

来自分类Dev

_document.js的<Head>中不应使用Next.js视口元标记

来自分类Dev

Node.js - 在字符串之外使用模板文字

来自分类Dev

在 Next.JS 6 中使用 _app.js 页面组件时,转换过早触发

来自分类Dev

React组件道具未在Next.js页面内呈现

来自分类Dev

Ember.js中的自定义视图助手,“您不能在呈现过程之外使用appendChild”

来自分类Dev

在roboactivity之外使用roboguice

来自分类Dev

在活动之外使用startActivity

来自分类Dev

在 Angular 之外使用 NgModule?

来自分类Dev

在 MockFactory 之外使用 scalamock

来自分类Dev

在 QObject 之外使用 QTimer

来自分类Dev

测试Stripe可与js一起使用:是,但会使其他组件无法正常工作

来自分类Dev

在Next.js的活动页面上时如何设置链接组件的样式

来自分类Dev

Next.js-页面无法将GetServerSideProps放入Page组件属性(带有自定义_app.js)

来自分类Dev

在onCreateView之外使用android Inflate

来自分类Dev

无法在Activity之外使用AsyncTask

来自分类Dev

在Controller类之外使用Session

来自分类Dev

如何在Play之外使用Anorm?

来自分类Dev

在ROS之外使用ROS消息类

来自分类Dev

如何在main之外使用Logger

来自分类Dev

如何在oncreate之外使用SharedPreferences?

来自分类Dev

在Vaadin之外使用Vaadin的Valo主题

来自分类Dev

在函数之外使用局部变量

来自分类Dev

在角度之外使用角度常数

来自分类Dev

在DOM之外使用jQuery克隆

来自分类Dev

在我的主窗体之外使用QtScript

Related 相关文章

热门标签

归档