reactjslazy-loadingcode-splitting

Undefined Promise Error Lazy Loading Routes in React Application


I am trying to split my React code using lazy loading. First I receive the warning regarding the result of dynamic imports, suggesting how my code should look. Then I receive the Uncaught Error regarding element type being invalid. The result in the browser is a blank screen.

what gives? Ironman

App.js

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import * as React from 'react';

const HomePage = React.lazy(() => import('./pages/HomePage'));
const AboutPage = React.lazy(() => import('./pages/AboutPage'));
const PortfolioPage = React.lazy(() => import('./pages/PortfolioPage'));
const ContactPage = React.lazy(() => import('./pages/ContactPage'));
const LogInPage = React.lazy(() => import('./pages/LogInPage'));

export const App = () => {
    return (
        <div className="App">
        <div className="page-container bg-gradient-to-t from-gray-400 to-blue-400">
            
            {/* <Routes /> */}

            <Router>
                <Switch>
                    <React.Suspense fallback='Loading...'>
                            <Route exact path="/">
                                <HomePage />
                            </Route>
                    
                            <Route path="/login">
                                <LogInPage />
                            </Route>

                            <Route path="/about">
                                <AboutPage />
                            </Route>

                            <Route path="/portfolio">
                                <PortfolioPage />
                            </Route>

                            <Route path="/contact">
                                <ContactPage />
                            </Route>
                    </React.Suspense>
                </Switch>
            </Router>

            
        </div>
        </div>
    
    );
}

Console Warnings/Errors

Warning: lazy: Expected the result of a dynamic import() call. Instead received: [object Module]

Your code should look like: 
  const MyComponent = lazy(() => import('./MyComponent'))


Uncaught Error: Element type is invalid. Received a promise that resolves to: undefined. Lazy element type must resolve to a class or function.

HomePage.js

import logo from '../logo.svg';
import { useEffect } from 'react';
import { useHistory } from 'react-router-dom';
import { Navigation } from '../components/Navigation';
import '../critical.css';


export const HomePage = () => {
    
    const history = useHistory();

    useEffect(() => {
        
            history.push('/');
    });

    return(
       
        <div class="content-container w-screen md:w-7/12  ">
            <img src={logo} className="App-logo" alt="logo" />
            <Navigation/>
            <h1 className="heading my-5 font-le-havre text-4xl">Chris Mazzochi, King React Developer</h1>
            <div class="imageDiv flex-wrap-nowrap ">
                <p class="aboutText font-raleway">
                This web application demonstrates a full stack React login authentication flow, using Google OAuth, SendGrid, and JSON Web tokens.   

                </p>
            </div>
        
            {/* <div class="underline" id="loginLink" onClick={() => window.location.href = "/login"}>Login</div> */}
        </div>
    )  
}

Solution

  • I think the possibility of getting this error is by missing the default export in your Component which becomes a named export. Please check your exports