Skip to content

Commit 5962c6d

Browse files
authored
feat: optimize initial load performance by implementing lazy loading and code splitting (#4445)
1 parent bef6763 commit 5962c6d

File tree

2 files changed

+112
-32
lines changed

2 files changed

+112
-32
lines changed

web/src/router/index.tsx

+98-31
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
1+
import { Suspense, lazy } from "react";
12
import { createBrowserRouter } from "react-router-dom";
23
import App from "@/App";
34
import HomeLayout from "@/layouts/HomeLayout";
45
import RootLayout from "@/layouts/RootLayout";
5-
import About from "@/pages/About";
6-
import AdminSignIn from "@/pages/AdminSignIn";
7-
import Archived from "@/pages/Archived";
8-
import AuthCallback from "@/pages/AuthCallback";
9-
import Explore from "@/pages/Explore";
106
import Home from "@/pages/Home";
11-
import Inboxes from "@/pages/Inboxes";
12-
import MemoDetail from "@/pages/MemoDetail";
13-
import NotFound from "@/pages/NotFound";
14-
import PermissionDenied from "@/pages/PermissionDenied";
15-
import Resources from "@/pages/Resources";
16-
import Setting from "@/pages/Setting";
17-
import SignIn from "@/pages/SignIn";
18-
import SignUp from "@/pages/SignUp";
19-
import UserProfile from "@/pages/UserProfile";
20-
import MemoDetailRedirect from "./MemoDetailRedirect";
7+
import Loading from "@/pages/Loading";
8+
9+
const About = lazy(() => import("@/pages/About"));
10+
const AdminSignIn = lazy(() => import("@/pages/AdminSignIn"));
11+
const Archived = lazy(() => import("@/pages/Archived"));
12+
const AuthCallback = lazy(() => import("@/pages/AuthCallback"));
13+
const Explore = lazy(() => import("@/pages/Explore"));
14+
const Inboxes = lazy(() => import("@/pages/Inboxes"));
15+
const MemoDetail = lazy(() => import("@/pages/MemoDetail"));
16+
const NotFound = lazy(() => import("@/pages/NotFound"));
17+
const PermissionDenied = lazy(() => import("@/pages/PermissionDenied"));
18+
const Resources = lazy(() => import("@/pages/Resources"));
19+
const Setting = lazy(() => import("@/pages/Setting"));
20+
const SignIn = lazy(() => import("@/pages/SignIn"));
21+
const SignUp = lazy(() => import("@/pages/SignUp"));
22+
const UserProfile = lazy(() => import("@/pages/UserProfile"));
23+
const MemoDetailRedirect = lazy(() => import("./MemoDetailRedirect"));
2124

2225
export enum Routes {
2326
ROOT = "/",
@@ -40,19 +43,35 @@ const router = createBrowserRouter([
4043
children: [
4144
{
4245
path: "",
43-
element: <SignIn />,
46+
element: (
47+
<Suspense fallback={<Loading />}>
48+
<SignIn />
49+
</Suspense>
50+
),
4451
},
4552
{
4653
path: "admin",
47-
element: <AdminSignIn />,
54+
element: (
55+
<Suspense fallback={<Loading />}>
56+
<AdminSignIn />
57+
</Suspense>
58+
),
4859
},
4960
{
5061
path: "signup",
51-
element: <SignUp />,
62+
element: (
63+
<Suspense fallback={<Loading />}>
64+
<SignUp />
65+
</Suspense>
66+
),
5267
},
5368
{
5469
path: "callback",
55-
element: <AuthCallback />,
70+
element: (
71+
<Suspense fallback={<Loading />}>
72+
<AuthCallback />
73+
</Suspense>
74+
),
5675
},
5776
],
5877
},
@@ -69,54 +88,102 @@ const router = createBrowserRouter([
6988
},
7089
{
7190
path: Routes.EXPLORE,
72-
element: <Explore />,
91+
element: (
92+
<Suspense fallback={<Loading />}>
93+
<Explore />
94+
</Suspense>
95+
),
7396
},
7497
{
7598
path: Routes.ARCHIVED,
76-
element: <Archived />,
99+
element: (
100+
<Suspense fallback={<Loading />}>
101+
<Archived />
102+
</Suspense>
103+
),
77104
},
78105
{
79106
path: "u/:username",
80-
element: <UserProfile />,
107+
element: (
108+
<Suspense fallback={<Loading />}>
109+
<UserProfile />
110+
</Suspense>
111+
),
81112
},
82113
],
83114
},
84115
{
85116
path: Routes.RESOURCES,
86-
element: <Resources />,
117+
element: (
118+
<Suspense fallback={<Loading />}>
119+
<Resources />
120+
</Suspense>
121+
),
87122
},
88123
{
89124
path: Routes.INBOX,
90-
element: <Inboxes />,
125+
element: (
126+
<Suspense fallback={<Loading />}>
127+
<Inboxes />
128+
</Suspense>
129+
),
91130
},
92131
{
93132
path: Routes.SETTING,
94-
element: <Setting />,
133+
element: (
134+
<Suspense fallback={<Loading />}>
135+
<Setting />
136+
</Suspense>
137+
),
95138
},
96139
{
97140
path: "memos/:uid",
98-
element: <MemoDetail />,
141+
element: (
142+
<Suspense fallback={<Loading />}>
143+
<MemoDetail />
144+
</Suspense>
145+
),
99146
},
100147
{
101148
path: Routes.ABOUT,
102-
element: <About />,
149+
element: (
150+
<Suspense fallback={<Loading />}>
151+
<About />
152+
</Suspense>
153+
),
103154
},
104155
// Redirect old path to new path.
105156
{
106157
path: "m/:uid",
107-
element: <MemoDetailRedirect />,
158+
element: (
159+
<Suspense fallback={<Loading />}>
160+
<MemoDetailRedirect />
161+
</Suspense>
162+
),
108163
},
109164
{
110165
path: "403",
111-
element: <PermissionDenied />,
166+
element: (
167+
<Suspense fallback={<Loading />}>
168+
<PermissionDenied />
169+
</Suspense>
170+
),
112171
},
113172
{
114173
path: "404",
115-
element: <NotFound />,
174+
element: (
175+
<Suspense fallback={<Loading />}>
176+
<NotFound />
177+
</Suspense>
178+
),
116179
},
117180
{
118181
path: "*",
119-
element: <NotFound />,
182+
element: (
183+
<Suspense fallback={<Loading />}>
184+
<NotFound />
185+
</Suspense>
186+
),
120187
},
121188
],
122189
},

web/vite.config.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,21 @@ export default defineConfig({
4444
rollupOptions: {
4545
output: {
4646
entryFileNames: "app.[hash].js",
47-
chunkFileNames: "assets/chunk-vendors.[hash].js",
47+
chunkFileNames: (chunkInfo) => {
48+
const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split("/") : [];
49+
const name = facadeModuleId[facadeModuleId.length - 2] || "[name]";
50+
return `assets/${name}/[name].[hash].js`;
51+
},
4852
assetFileNames: "assets/[name].[hash][extname]",
53+
manualChunks: {
54+
"react-vendor": ["react", "react-dom", "react-router-dom"],
55+
"mui-vendor": ["@mui/joy", "@emotion/react", "@emotion/styled"],
56+
"utils-vendor": ["dayjs", "lodash-es", "mobx", "mobx-react-lite"],
57+
"katex-vendor": ["katex"],
58+
"highlight-vendor": ["highlight.js"],
59+
"mermaid-vendor": ["mermaid"],
60+
"map-vendor": ["leaflet", "react-leaflet"],
61+
},
4962
},
5063
},
5164
},

0 commit comments

Comments
 (0)