Skip to content

Keep the current page rendered as a fallback until the new page is loaded with React.lazy and React.Suspense. Route level code splitting in react without screen flickering (React Suspense + React Router Dom + React Topbar Progress Indicator)

License

asifvora/react-current-page-fallback

Repository files navigation

react-current-page-fallback

Keep the current page rendered as a fallback until the new page is loaded with React.lazy and React.Suspense. Route level code splitting in react without screen flickering (React Suspense + React Router Dom + React Topbar Progress Indicator)

react-current-page-fallback licence react-current-page-fallback forks react-current-page-fallback stars react-current-page-fallback issues react-current-page-fallback pull-requests

React TypeScript ReactRouter

πŸ› οΈ Installation Steps

Using npm:

npm i --save react-current-page-fallback

Using yarn:

yarn add react-current-page-fallback

πŸ“– Usage

import { FallbackProvider } from "react-current-page-fallback";

// Wrapp root FallbackProvider for all routes
<FallbackProvider>
  your app routes here...
</FallbackProvider>

// Wrapp every page using FallbackPageWrapper 
import { FallbackPageWrapper } from "react-current-page-fallback";

<FallbackPageWrapper>
  your page-1 here...
</FallbackPageWrapper>


<FallbackPageWrapper>
  your page-2 here...
</FallbackPageWrapper>

...

πŸ“‚ Code Example

index.js

import React from "react";
import { createRoot } from "react-dom/client";
import App from "./App";

const container = document.getElementById("root");
const root = createRoot(container); // createRoot(container!) if you use TypeScript

root.render(<><App/></>);

App.js

react-router-dom V6

import React from "react";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import { FallbackProvider } from "react-current-page-fallback";

const Home = React.lazy(() => import("./pages/Home"));
const About = React.lazy(() => import("./pages/About"));
const Contact = React.lazy(() => import("./pages/Contact"));

// react-router-dom V6
const App = () => {
  return (
    <Router>
      <div>
        <FallbackProvider>
          <Routes>
            <Route path="/about" element={ <About />} />
            <Route path="/contact" element={ <Contact />} />
            <Route path="/" element={ <Home />} />
          </Routes>
        </FallbackProvider>
      </div>
    </Router>
  );
};
export default App;

App.js

react-router-dom V5

import React from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import { FallbackProvider } from "react-current-page-fallback";

// react-router-dom V5
const App = () => {
  return (
    <Router>
      <div>
        <FallbackProvider>
          <Switch>
            <Route path="/about">
              <About />
            </Route>
            <Route path="/contact">
              <Contact />
            </Route>
            <Route path="/">
              <Home />
            </Route>
          </Switch>
        </FallbackProvider>
      </div>
    </Router>
  );
};
export default App;

Nav.js

import React from 'react';
import { Link } from 'react-router-dom';

export const Nav = () => {
  return (
    <>
        <Link to="/">Home</Link>
        <Link to="/about">About</Link> 
        <Link to="/contact">Contact</Link>
    </>
  );
};

export default Nav;

Home.js

import React from 'react';
import { Nav } from '../components/Nav';
import { FallbackPageWrapper } from "react-current-page-fallback";

const Home  = () => {
  return (
    <FallbackPageWrapper>
      <div>
        <Nav />
        <h1>Home</h1>
      </div>
    </FallbackPageWrapper>
  );
};

export default Home;

About.js

import React from 'react';
import { Nav } from '../components/Nav';
import { FallbackPageWrapper } from "react-current-page-fallback";

const About  = () => {
  return (
    <FallbackPageWrapper>
      <div>
        <Nav />
        <h1>About</h1>
      </div>
    </FallbackPageWrapper>
  );
};

export default About;

Contact.js

import React from 'react';
import { Nav } from '../components/Nav';
import { FallbackPageWrapper } from "react-current-page-fallback";

const Contact  = () => {
  return (
    <FallbackPageWrapper>
      <div>
        <Nav />
        <h1>Contact</h1>
      </div>
    </FallbackPageWrapper>
  );
};

export default Contact;

Preview

Test this using Slow 3G for better results

Example

You can run the example by cloning the repo:

git clone https://github.com/asifvora/react-current-page-fallback.git
yarn
yarn start

πŸ›‘οΈ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ‘¨β€πŸ’» Author

πŸ‘€ Asif Vora

🍰 Contributing

πŸ™ Support

This project needs a ⭐️ from you. Don't forget to leave a star ⭐️

About

Keep the current page rendered as a fallback until the new page is loaded with React.lazy and React.Suspense. Route level code splitting in react without screen flickering (React Suspense + React Router Dom + React Topbar Progress Indicator)

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published