Javascript 如何将材质UI与Next.js一起使用?
我希望在我的React应用程序中使用带有材质UI的Next.js。我一直在关注这个问题 虽然,当我尝试运行Javascript 如何将材质UI与Next.js一起使用?,javascript,reactjs,material-ui,next.js,server-side-rendering,Javascript,Reactjs,Material Ui,Next.js,Server Side Rendering,我希望在我的React应用程序中使用带有材质UI的Next.js。我一直在关注这个问题 虽然,当我尝试运行next dev或next build时,会出现以下错误 我已经运行了npm ls react,以确保我只有一个版本的react,并确认react dom和react是相同的版本(6.13.1) 它似乎将原始渲染页面视为一个钩子。尽管如此,该官员还详细说明了自定义文档页面,并在类组件中具有相同的原始渲染页面 我已经尝试将\u document.js组件转换为功能组件而不是类,但它不起作用
next dev
或next build
时,会出现以下错误
我已经运行了npm ls react
,以确保我只有一个版本的react
,并确认react dom
和react
是相同的版本(6.13.1)
它似乎将原始渲染页面
视为一个钩子。尽管如此,该官员还详细说明了自定义文档页面,并在类组件中具有相同的原始渲染页面
我已经尝试将\u document.js
组件转换为功能组件而不是类,但它不起作用
\u document.js
页面的内容(直接来自上面的Material UI/Next.js示例)包括:
从“React”导入React;
从“next/Document”导入文档,{Html,Head,Main,NextScript};
从“@material ui/core/styles”导入{ServerStyleSheets}”;
从“./组件/主题”导入主题;
导出默认类MyDocument扩展文档{
render(){
返回(
{/*PWA原色*/}
);
}
}
//`getInitialProps`属于`U文档`(而不是`U应用`),
//它与服务器端生成(SSG)兼容。
MyDocument.getInitialProps=async(ctx)=>{
//决议顺序
//
//在服务器上:
//1.app.getInitialProps
//2.page.getInitialProps
//3.document.getInitialProps
//4.app.render
//5.page.render
//6.document.render
//
//在服务器上,出现以下错误:
//1.document.getInitialProps
//2.app.render
//3.page.render
//4.document.render
//
//论客户
//1.app.getInitialProps
//2.page.getInitialProps
//3.app.render
//4.page.render
//呈现应用程序和页面,并获取包含收集的副作用的页面上下文。
const sheets=新服务器样式表();
const originalRenderPage=ctx.renderPage;
ctx.renderPage=()=>
原始渲染图({
enhanceApp:(应用)=>(道具)=>sheets.collect(),
});
const initialProps=wait Document.getInitialProps(ctx);
返回{
…初始道具,
//样式片段在应用程序和页面呈现完成后呈现。
样式:[…React.Children.toArray(initialProps.styles),sheets.getStyleElement(),
};
};
我从中派生了官方示例,在本地运行,运行起来没有问题。这让我相信这是一个只与codesandbox相关的错误。注意,请确保您至少使用了节点v10+,并在本地使用react 16.10+。此外,当存在无效的导入或无效的导入组件模块使用时,错误堆栈跟踪有时可能无效并指向错误的文件。也就是说,如果您仍然遇到问题,请发布一份github回购协议,并附上一个可复制的示例。在相关说明中,当我制作codesandbox示例时,我注意到useRouter
不是从next/router
导出的,而是导致了一个错误。再一次,这似乎是一个问题
import React from "react";
import Document, { Html, Head, Main, NextScript } from "next/document";
import { ServerStyleSheets } from "@material-ui/core/styles";
import theme from "../components/theme";
export default class MyDocument extends Document {
render() {
return (
<Html lang="en">
<Head>
{/* PWA primary color */}
<meta name="theme-color" content={theme.palette.primary.main} />
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}
// `getInitialProps` belongs to `_document` (instead of `_app`),
// it's compatible with server-side generation (SSG).
MyDocument.getInitialProps = async (ctx) => {
// Resolution order
//
// On the server:
// 1. app.getInitialProps
// 2. page.getInitialProps
// 3. document.getInitialProps
// 4. app.render
// 5. page.render
// 6. document.render
//
// On the server with error:
// 1. document.getInitialProps
// 2. app.render
// 3. page.render
// 4. document.render
//
// On the client
// 1. app.getInitialProps
// 2. page.getInitialProps
// 3. app.render
// 4. page.render
// Render app and page and get the context of the page with collected side effects.
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 fragment is rendered after the app and page rendering finish.
styles: [...React.Children.toArray(initialProps.styles), sheets.getStyleElement()],
};
};