Search code examples
reactjscreate-react-appreact-scripts

create-react-app: how to load html before React renders


I am trying to add a splash screen before React loads.

since i am using react scripts / react-app my index.tsx only has this part:

ReactDOM.render(<App />, document.getElementById("root"));

i tried adding my own div on the same page but it doesn't show.

i would like to display a simple blank screen with my splash image on a 1 second timer before react loads to avoid/hide the shifting of the rendering elements.

** if i do add the screen in app.tsx, the shifting happens before the screen loads

update

as Rishabh pointed out below, index.html is in /public folder. So I ended up combining 2 approaches.

  1. add a screen before react starts:

    <div id="root">
      <div id="dimScreen">
        <img src="/img/logo.png" />
      </div>
    </div>
    
  2. 2.

loading a proper loader non top for .5 - 1 sec

class App extends Component {
    state = {
        loading: true
    }
    componentDidMount() {
        setTimeout(() => {
            this.setState({ loading: false });
        }, 1000);
    }
    render() {
        return (
            <React.Fragment>
                {
                    this.state.loading ?
                        <Loader />
                        : (
                            <div className="app">
                                <Header />
                                <MyComponent />
                            </div>
                        )
                }
            </React.Fragment>
        );
    }
}

so far this approach is working best but will update if i find issues or something better


Solution

  • This is an example to show loader for five seconds using state and setTimeout(), In place of <Loader/> you can give splash screen component.

    import React, { Component } from 'react';
    
    import Drawer from '../Drawer/Drawer';
    import Loader from '../../components/UI/Spinner/Loader/Loader';
    
    class App extends Component {
      state = {
        loading: true
      }
    
      componentDidMount(){
        setTimeout(() => {
          this.setState({loading: false});
        }, 5000);
      }
    
      render() {  
        return (
          <React.Fragment>
            {
              this.state.loading ? <Loader />: <Drawer />
            }
          </React.Fragment>
        );
      }
    }
    
    export default App;
    

    i hope it helps!