Encountering an "invalid element type" error while attempting to add material-ui to a Next.js project

Hey there, I've been working on integrating Material UI into my Next.js project. I followed the example on Next Js GitHub as well as a helpful YouTube tutorial. Unfortunately, I encountered an error that reads:

Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. This could be due to forgetting to export your component from the file it's defined in, or possibly mixing up default and named imports.

Below is the code snippet from _document.js:

import React from 'react';
import Document, { Html, Head, Main, NextScript } from 'next/document';
import { ServerStyleSheets } from '@material-ui/core/styles';
import theme from '../src/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} />
          <link
            rel="stylesheet"
            href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
          />
        </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()],
  };
};

Snippet causing the error -

pages/_document.js (57:4) @ Object.ctx.renderPage

  55 | 
  56 |   ctx.renderPage = () =>
> 57 |     originalRenderPage({
     |    ^
  58 |       enhanceApp: (App) => (props) => sheets.collect(<App {...props} />),
  59 |     });
  60 | 

view image description here

Answer №1

The issue has been successfully resolved. Even though the error was initially displayed on the app.js page, it was ultimately rectified by eliminating brackets from the {link} import statement present on my index page.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Load Angular modules dynamically

Is there a way to dynamically load a module (js, css and html) using a single directive at any point during the app's lifecycle? <my-module id="contacts"></my-module> The template for this directive looks like this <my-module id="con ...

Leveraging conditional statements for dynamically computed Vue properties

In the Vue site I'm working on, there is a functional button that changes its state when clicked (from "pause" to "resume" and also changes colors). The button functionality itself works perfectly, but I am facing an issue in aligning it with another ...

Posting forms in NextJS can be optimized by utilizing onChange and keypress events for input fields

I am currently working on my first Edit/Update form within a newly created NextJs application as I am in the process of learning the framework. I seem to be facing an issue where the form constantly posts back to the server and causes the page to refresh ...

How is it possible for this variable to be altered without any modifications made to it in the current function?

This particular function receives two arrays as input: arrOne, which is an array comprising arrays of numbers, and arrTwo, which is an array containing numbers. My goal here is to generate every possible combination, followed by obtaining the unique combin ...

"Converting an array within a single object into an object: step-by-step

After retrieving a single row of record from MySQL using Node.js and Express.js, I found that the result was returned as an array inside an object. Here is the output of the result: [ { "user_id": 1, "name": "Aravinth", "email ...

What is the best way to turn off the automatic capitalization of text in a Button component using Material UI v5

Is there a way to disable the automatic uppercase feature on the <Button> component in material UI 5? <Button variant="contained">Hello</Button> By default, the text will be displayed as HELLO, but I prefer it to remain as Hell ...

Switch up your Vue filters with ease

I'm struggling to create filters in Vue that work with arrays of colors and objects called products. I also have a property called count to keep track of clicks: data() { return { count: 0, colors: [ 'red', ...

What are the steps to effectively utilize data retrieved from readFragment using Apollo?

Once a user logs in, the system returns a jwt token and a user object containing the id and firstName, which are then stored in cache (refer to the image link provided below). https://i.stack.imgur.com/oSXZ5.png I aim to retrieve the user information fro ...

There seems to be a styling glitch with Material UI. Both the text and bottom navigation are

Struggling to build a basic website featuring bottom tabs and a drawer, I encountered two main issues. Firstly, despite being logged in the console as clicked (0,1, etc...), the color of the selected bottom tab does not change as expected. Additionally, th ...

The Axios GET request was not functioning properly after attempting to use Axios stream.on("data")

I am working with a backend API that has an endpoint named /subscribe, which gives back a continuous stream of data. Along with this, I have a node process, and I am utilizing axios to send a request to my backend API with a response type of "stream& ...

At what stage of the Angular JS application life cycle is this code being loaded?

I am facing a difficult issue with the timing of Angular JS life cycle in relation to the code snippet below. There seems to be a random occurrence where controllers dependent on this code are loaded before it, leading to errors. Even after multiple atte ...

Building a hyperlink from a textbox input: A step-by-step guide

I am attempting to modify the href of my link based on the content of the textbox with id="serie". However, Firefox is indicating that el is null. Can you help me identify where the issue lies? (The top section is the Page, the middle part shows the debug ...

Is there a way to obtain two different colors from a single color?

Is there a way to use a method that displays two different colored borders in a specific color? Is it possible to implement this using PHP or jQuery? Apologies for my poor English Thank you, Rory McCrossan ...

Sending a JavaScript array along with a form using the jQuery ajax function

I am working on an ASP.NET MVC5 app where I have a JavaScript array called 'selectElementList' that contains multiple data. I am attempting to post back this data along with form values using an AJAX jQuery function. While I am able to get the fo ...

Why is AngularJS redirection not retrieving the value from window.localStorage?

After utilizing local storage, I encountered an issue where upon logging in and being redirected to the myprofile page, the local storage value was not loading properly. Instead, I was getting a null value. It wasn't until I manually reloaded the page ...

What is the process for creating a client-side Java script that can be executed on a Node JS server?

I attempted to implement a basic client-side JavaScript code in my Node.js server but encountered difficulties. The snippet from my index.js file is as follows: response.writeHead(200, { 'Content-Type': 'text/html'}); response.write( ...

What is the best way to hear an event emitted by a component?

I am trying to listen for an event in Chrome DevTools Vue, but I'm not sure how to target it. For a Root event, I typically use: this.$root.$on("note_id", (note_id) => (this.note_id = note_id)); But how do I address an event that origina ...

Consecutive AJAX requests triggered by previous response

While there are numerous resources available regarding making synchronous AJAX calls using deferred promises, my specific issue presents a unique challenge. The process I am attempting to facilitate is as follows: Initiate an AJAX call. If the response i ...

Guide to sending parameters to the getInitialProps function in the _app.js file within Next.js by extracting them from the URL

Shown below is the getInitialProps function for my custom MyApp. MyApp.getInitialProps = async ({ctx}) => { const { siteHeaderCollection } = await getHeaderData(ctx.query.lang) const { siteFooterCollection } = await getFooterData(ctx.query.lang) ...

Concealing certain elements within a loop using a "show more" button

In my PHP code, I am utilizing a foreach loop in the following manner: <div class="items"> @foreach($results as $details) <div class="col s2 l2"> {{ $details }} </div></div> My approach involves using the blade templating feature ...