From be7d22dec1b7fcae6bd638a2f877bce0644fcf4a Mon Sep 17 00:00:00 2001
From: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com>
Date: Mon, 5 Jun 2023 13:32:14 +0200
Subject: [PATCH] lazy-load routes
---
frontend/src/component/App.tsx | 11 +-
.../VirtualizedTable/VirtualizedTable.tsx | 12 +-
.../FeedbackCESProvider.tsx | 13 +-
frontend/src/component/menu/routes.ts | 204 ++++++++++++++----
frontend/src/index.tsx | 12 +-
5 files changed, 198 insertions(+), 54 deletions(-)
diff --git a/frontend/src/component/App.tsx b/frontend/src/component/App.tsx
index 65a50202c2..6264a7a70a 100644
--- a/frontend/src/component/App.tsx
+++ b/frontend/src/component/App.tsx
@@ -1,4 +1,4 @@
-import { Suspense, useEffect } from 'react';
+import { Fragment, Suspense, lazy, useEffect } from 'react';
import { Route, Routes } from 'react-router-dom';
import { ErrorBoundary } from 'react-error-boundary';
import { Error } from 'component/layout/Error/Error';
@@ -10,7 +10,6 @@ import NotFound from 'component/common/NotFound/NotFound';
import { ProtectedRoute } from 'component/common/ProtectedRoute/ProtectedRoute';
import { SWRProvider } from 'component/providers/SWRProvider/SWRProvider';
import { PlausibleProvider } from 'component/providers/PlausibleProvider/PlausibleProvider';
-import ToastRenderer from 'component/common/ToastRenderer/ToastRenderer';
import { routes } from 'component/menu/routes';
import { useAuthDetails } from 'hooks/api/getters/useAuth/useAuthDetails';
import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';
@@ -27,6 +26,10 @@ const StyledContainer = styled('div')(() => ({
},
}));
+const ToastRenderer = lazy(
+ () => import('component/common/ToastRenderer/ToastRenderer')
+);
+
export const App = () => {
const { authDetails } = useAuthDetails();
const { refetch: refetchUiConfig } = useUiConfig();
@@ -64,7 +67,9 @@ export const App = () => {
show={}
/>
-
+
+
+
{availableRoutes.map(route => (
+ import('component/feedback/FeedbackCES/FeedbackCES').then(module => ({
+ default: module.FeedbackCES,
+ }))
+);
+
interface IFeedbackProviderProps {
children: ReactNode;
}
@@ -54,7 +61,9 @@ export const FeedbackCESProvider = ({ children }: IFeedbackProviderProps) => {
return (
{children}
-
+
+
+
);
};
diff --git a/frontend/src/component/menu/routes.ts b/frontend/src/component/menu/routes.ts
index 6cfb5de0cd..5e47c87364 100644
--- a/frontend/src/component/menu/routes.ts
+++ b/frontend/src/component/menu/routes.ts
@@ -1,49 +1,175 @@
-import { FeatureToggleListTable } from 'component/feature/FeatureToggleList/FeatureToggleListTable';
-import { StrategyView } from 'component/strategies/StrategyView/StrategyView';
-import { StrategiesList } from 'component/strategies/StrategiesList/StrategiesList';
-import { TagTypeList } from 'component/tags/TagTypeList/TagTypeList';
-import { AddonList } from 'component/addons/AddonList/AddonList';
-import Login from 'component/user/Login/Login';
+import { lazy } from 'react';
import { EEA, P, RE, SE, UG } from 'component/common/flags';
-import { NewUser } from 'component/user/NewUser/NewUser';
-import ResetPassword from 'component/user/ResetPassword/ResetPassword';
-import ForgottenPassword from 'component/user/ForgottenPassword/ForgottenPassword';
-import { ProjectListNew } from 'component/project/ProjectList/ProjectList';
-import RedirectArchive from 'component/archive/RedirectArchive';
-import CreateEnvironment from 'component/environments/CreateEnvironment/CreateEnvironment';
-import EditEnvironment from 'component/environments/EditEnvironment/EditEnvironment';
-import { EditContext } from 'component/context/EditContext/EditContext';
-import EditTagType from 'component/tags/EditTagType/EditTagType';
-import CreateTagType from 'component/tags/CreateTagType/CreateTagType';
-import EditProject from 'component/project/Project/EditProject/EditProject';
-import CreateFeature from 'component/feature/CreateFeature/CreateFeature';
-import EditFeature from 'component/feature/EditFeature/EditFeature';
-import { ApplicationEdit } from 'component/application/ApplicationEdit/ApplicationEdit';
-import { ApplicationList } from 'component/application/ApplicationList/ApplicationList';
-import ContextList from 'component/context/ContextList/ContextList';
-import RedirectFeatureView from 'component/feature/RedirectFeatureView/RedirectFeatureView';
-import { CreateAddon } from 'component/addons/CreateAddon/CreateAddon';
-import { EditAddon } from 'component/addons/EditAddon/EditAddon';
-import { CopyFeatureToggle } from 'component/feature/CopyFeature/CopyFeature';
-import { EventPage } from 'component/events/EventPage/EventPage';
-import { CreateStrategy } from 'component/strategies/CreateStrategy/CreateStrategy';
-import { EditStrategy } from 'component/strategies/EditStrategy/EditStrategy';
-import { SplashPage } from 'component/splash/SplashPage/SplashPage';
-import { CreateUnleashContextPage } from 'component/context/CreateUnleashContext/CreateUnleashContextPage';
-import { CreateSegment } from 'component/segments/CreateSegment/CreateSegment';
-import { EditSegment } from 'component/segments/EditSegment/EditSegment';
+import Login from 'component/user/Login/Login';
import { INavigationMenuItem, IRoute } from 'interfaces/route';
-import { EnvironmentTable } from 'component/environments/EnvironmentTable/EnvironmentTable';
-import { SegmentTable } from '../segments/SegmentTable/SegmentTable';
-import { FeaturesArchiveTable } from '../archive/FeaturesArchiveTable';
+import { SplashPage } from 'component/splash/SplashPage/SplashPage';
import { LazyPlayground } from 'component/playground/Playground/LazyPlayground';
-import { Profile } from 'component/user/Profile/Profile';
import { LazyCreateProject } from 'component/project/Project/CreateProject/LazyCreateProject';
import { LazyFeatureView } from 'component/feature/FeatureView/LazyFeatureView';
import { LazyAdmin } from 'component/admin/LazyAdmin';
import { LazyProject } from 'component/project/Project/LazyProject';
-import { AdminRedirect } from 'component/admin/AdminRedirect';
-import { LoginHistory } from 'component/loginHistory/LoginHistory';
+
+const ResetPassword = lazy(
+ () => import('component/user/ResetPassword/ResetPassword')
+);
+const FeatureToggleListTable = lazy(() =>
+ import('component/feature/FeatureToggleList/FeatureToggleListTable').then(
+ module => ({ default: module.FeatureToggleListTable })
+ )
+);
+const ForgottenPassword = lazy(
+ () => import('component/user/ForgottenPassword/ForgottenPassword')
+);
+const RedirectArchive = lazy(() => import('component/archive/RedirectArchive'));
+const CreateEnvironment = lazy(
+ () => import('component/environments/CreateEnvironment/CreateEnvironment')
+);
+const EditEnvironment = lazy(
+ () => import('component/environments/EditEnvironment/EditEnvironment')
+);
+const EditTagType = lazy(
+ () => import('component/tags/EditTagType/EditTagType')
+);
+const CreateTagType = lazy(
+ () => import('component/tags/CreateTagType/CreateTagType')
+);
+const EditProject = lazy(
+ () => import('component/project/Project/EditProject/EditProject')
+);
+const CreateFeature = lazy(
+ () => import('component/feature/CreateFeature/CreateFeature')
+);
+const EditFeature = lazy(
+ () => import('component/feature/EditFeature/EditFeature')
+);
+const ContextList = lazy(
+ () => import('component/context/ContextList/ContextList')
+);
+const RedirectFeatureView = lazy(
+ () => import('component/feature/RedirectFeatureView/RedirectFeatureView')
+);
+const StrategyView = lazy(() =>
+ import('component/strategies/StrategyView/StrategyView').then(module => ({
+ default: module.StrategyView,
+ }))
+);
+const StrategiesList = lazy(() =>
+ import('component/strategies/StrategiesList/StrategiesList').then(
+ module => ({ default: module.StrategiesList })
+ )
+);
+const TagTypeList = lazy(() =>
+ import('component/tags/TagTypeList/TagTypeList').then(module => ({
+ default: module.TagTypeList,
+ }))
+);
+const AddonList = lazy(() =>
+ import('component/addons/AddonList/AddonList').then(module => ({
+ default: module.AddonList,
+ }))
+);
+const NewUser = lazy(() =>
+ import('component/user/NewUser/NewUser').then(module => ({
+ default: module.NewUser,
+ }))
+);
+const ProjectListNew = lazy(() =>
+ import('component/project/ProjectList/ProjectList').then(module => ({
+ default: module.ProjectListNew,
+ }))
+);
+const EditContext = lazy(() =>
+ import('component/context/EditContext/EditContext').then(module => ({
+ default: module.EditContext,
+ }))
+);
+const ApplicationEdit = lazy(() =>
+ import('component/application/ApplicationEdit/ApplicationEdit').then(
+ module => ({ default: module.ApplicationEdit })
+ )
+);
+const ApplicationList = lazy(() =>
+ import('component/application/ApplicationList/ApplicationList').then(
+ module => ({ default: module.ApplicationList })
+ )
+);
+const CreateAddon = lazy(() =>
+ import('component/addons/CreateAddon/CreateAddon').then(module => ({
+ default: module.CreateAddon,
+ }))
+);
+const EditAddon = lazy(() =>
+ import('component/addons/EditAddon/EditAddon').then(module => ({
+ default: module.EditAddon,
+ }))
+);
+const CopyFeatureToggle = lazy(() =>
+ import('component/feature/CopyFeature/CopyFeature').then(module => ({
+ default: module.CopyFeatureToggle,
+ }))
+);
+const EventPage = lazy(() =>
+ import('component/events/EventPage/EventPage').then(module => ({
+ default: module.EventPage,
+ }))
+);
+const CreateStrategy = lazy(() =>
+ import('component/strategies/CreateStrategy/CreateStrategy').then(
+ module => ({ default: module.CreateStrategy })
+ )
+);
+const EditStrategy = lazy(() =>
+ import('component/strategies/EditStrategy/EditStrategy').then(module => ({
+ default: module.EditStrategy,
+ }))
+);
+const CreateUnleashContextPage = lazy(() =>
+ import(
+ 'component/context/CreateUnleashContext/CreateUnleashContextPage'
+ ).then(module => ({ default: module.CreateUnleashContextPage }))
+);
+const CreateSegment = lazy(() =>
+ import('component/segments/CreateSegment/CreateSegment').then(module => ({
+ default: module.CreateSegment,
+ }))
+);
+const EditSegment = lazy(() =>
+ import('component/segments/EditSegment/EditSegment').then(module => ({
+ default: module.EditSegment,
+ }))
+);
+const EnvironmentTable = lazy(() =>
+ import('component/environments/EnvironmentTable/EnvironmentTable').then(
+ module => ({ default: module.EnvironmentTable })
+ )
+);
+const SegmentTable = lazy(() =>
+ import('../segments/SegmentTable/SegmentTable').then(module => ({
+ default: module.SegmentTable,
+ }))
+);
+const FeaturesArchiveTable = lazy(() =>
+ import('../archive/FeaturesArchiveTable').then(module => ({
+ default: module.FeaturesArchiveTable,
+ }))
+);
+const Profile = lazy(() =>
+ import('component/user/Profile/Profile').then(module => ({
+ default: module.Profile,
+ }))
+);
+
+const AdminRedirect = lazy(() =>
+ import('component/admin/AdminRedirect').then(module => ({
+ default: module.AdminRedirect,
+ }))
+);
+
+const LoginHistory = lazy(() =>
+ import('component/loginHistory/LoginHistory').then(module => ({
+ default: module.LoginHistory,
+ }))
+);
export const routes: IRoute[] = [
// Splash
diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx
index 4354f6a52e..63ff79295a 100644
--- a/frontend/src/index.tsx
+++ b/frontend/src/index.tsx
@@ -2,6 +2,7 @@ import 'whatwg-fetch';
import 'themes/app.css';
import 'regenerator-runtime/runtime';
+import { Fragment, Suspense, lazy } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { ThemeProvider } from 'themes/ThemeProvider';
@@ -13,7 +14,12 @@ import { FeedbackCESProvider } from 'component/feedback/FeedbackCESContext/Feedb
import { AnnouncerProvider } from 'component/common/Announcer/AnnouncerProvider/AnnouncerProvider';
import { InstanceStatus } from 'component/common/InstanceStatus/InstanceStatus';
import { UIProviderContainer } from 'component/providers/UIProvider/UIProviderContainer';
-import { MessageBanner } from 'component/common/MessageBanner/MessageBanner';
+
+const MessageBanner = lazy(() =>
+ import('component/common/MessageBanner/MessageBanner').then(module => ({
+ default: module.MessageBanner,
+ }))
+);
window.global ||= window;
@@ -25,7 +31,9 @@ ReactDOM.render(
-
+
+
+