mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
feat: optimize initial load performance by implementing lazy loading and code splitting (#4445)
This commit is contained in:
@@ -1,23 +1,26 @@
|
|||||||
|
import { Suspense, lazy } from "react";
|
||||||
import { createBrowserRouter } from "react-router-dom";
|
import { createBrowserRouter } from "react-router-dom";
|
||||||
import App from "@/App";
|
import App from "@/App";
|
||||||
import HomeLayout from "@/layouts/HomeLayout";
|
import HomeLayout from "@/layouts/HomeLayout";
|
||||||
import RootLayout from "@/layouts/RootLayout";
|
import RootLayout from "@/layouts/RootLayout";
|
||||||
import About from "@/pages/About";
|
|
||||||
import AdminSignIn from "@/pages/AdminSignIn";
|
|
||||||
import Archived from "@/pages/Archived";
|
|
||||||
import AuthCallback from "@/pages/AuthCallback";
|
|
||||||
import Explore from "@/pages/Explore";
|
|
||||||
import Home from "@/pages/Home";
|
import Home from "@/pages/Home";
|
||||||
import Inboxes from "@/pages/Inboxes";
|
import Loading from "@/pages/Loading";
|
||||||
import MemoDetail from "@/pages/MemoDetail";
|
|
||||||
import NotFound from "@/pages/NotFound";
|
const About = lazy(() => import("@/pages/About"));
|
||||||
import PermissionDenied from "@/pages/PermissionDenied";
|
const AdminSignIn = lazy(() => import("@/pages/AdminSignIn"));
|
||||||
import Resources from "@/pages/Resources";
|
const Archived = lazy(() => import("@/pages/Archived"));
|
||||||
import Setting from "@/pages/Setting";
|
const AuthCallback = lazy(() => import("@/pages/AuthCallback"));
|
||||||
import SignIn from "@/pages/SignIn";
|
const Explore = lazy(() => import("@/pages/Explore"));
|
||||||
import SignUp from "@/pages/SignUp";
|
const Inboxes = lazy(() => import("@/pages/Inboxes"));
|
||||||
import UserProfile from "@/pages/UserProfile";
|
const MemoDetail = lazy(() => import("@/pages/MemoDetail"));
|
||||||
import MemoDetailRedirect from "./MemoDetailRedirect";
|
const NotFound = lazy(() => import("@/pages/NotFound"));
|
||||||
|
const PermissionDenied = lazy(() => import("@/pages/PermissionDenied"));
|
||||||
|
const Resources = lazy(() => import("@/pages/Resources"));
|
||||||
|
const Setting = lazy(() => import("@/pages/Setting"));
|
||||||
|
const SignIn = lazy(() => import("@/pages/SignIn"));
|
||||||
|
const SignUp = lazy(() => import("@/pages/SignUp"));
|
||||||
|
const UserProfile = lazy(() => import("@/pages/UserProfile"));
|
||||||
|
const MemoDetailRedirect = lazy(() => import("./MemoDetailRedirect"));
|
||||||
|
|
||||||
export enum Routes {
|
export enum Routes {
|
||||||
ROOT = "/",
|
ROOT = "/",
|
||||||
@@ -40,19 +43,35 @@ const router = createBrowserRouter([
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "",
|
path: "",
|
||||||
element: <SignIn />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<SignIn />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "admin",
|
path: "admin",
|
||||||
element: <AdminSignIn />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<AdminSignIn />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "signup",
|
path: "signup",
|
||||||
element: <SignUp />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<SignUp />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "callback",
|
path: "callback",
|
||||||
element: <AuthCallback />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<AuthCallback />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -69,54 +88,102 @@ const router = createBrowserRouter([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: Routes.EXPLORE,
|
path: Routes.EXPLORE,
|
||||||
element: <Explore />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<Explore />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: Routes.ARCHIVED,
|
path: Routes.ARCHIVED,
|
||||||
element: <Archived />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<Archived />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "u/:username",
|
path: "u/:username",
|
||||||
element: <UserProfile />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<UserProfile />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: Routes.RESOURCES,
|
path: Routes.RESOURCES,
|
||||||
element: <Resources />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<Resources />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: Routes.INBOX,
|
path: Routes.INBOX,
|
||||||
element: <Inboxes />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<Inboxes />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: Routes.SETTING,
|
path: Routes.SETTING,
|
||||||
element: <Setting />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<Setting />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "memos/:uid",
|
path: "memos/:uid",
|
||||||
element: <MemoDetail />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<MemoDetail />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: Routes.ABOUT,
|
path: Routes.ABOUT,
|
||||||
element: <About />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<About />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
// Redirect old path to new path.
|
// Redirect old path to new path.
|
||||||
{
|
{
|
||||||
path: "m/:uid",
|
path: "m/:uid",
|
||||||
element: <MemoDetailRedirect />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<MemoDetailRedirect />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "403",
|
path: "403",
|
||||||
element: <PermissionDenied />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<PermissionDenied />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "404",
|
path: "404",
|
||||||
element: <NotFound />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<NotFound />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "*",
|
path: "*",
|
||||||
element: <NotFound />,
|
element: (
|
||||||
|
<Suspense fallback={<Loading />}>
|
||||||
|
<NotFound />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
@@ -44,8 +44,21 @@ export default defineConfig({
|
|||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
output: {
|
output: {
|
||||||
entryFileNames: "app.[hash].js",
|
entryFileNames: "app.[hash].js",
|
||||||
chunkFileNames: "assets/chunk-vendors.[hash].js",
|
chunkFileNames: (chunkInfo) => {
|
||||||
|
const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split("/") : [];
|
||||||
|
const name = facadeModuleId[facadeModuleId.length - 2] || "[name]";
|
||||||
|
return `assets/${name}/[name].[hash].js`;
|
||||||
|
},
|
||||||
assetFileNames: "assets/[name].[hash][extname]",
|
assetFileNames: "assets/[name].[hash][extname]",
|
||||||
|
manualChunks: {
|
||||||
|
"react-vendor": ["react", "react-dom", "react-router-dom"],
|
||||||
|
"mui-vendor": ["@mui/joy", "@emotion/react", "@emotion/styled"],
|
||||||
|
"utils-vendor": ["dayjs", "lodash-es", "mobx", "mobx-react-lite"],
|
||||||
|
"katex-vendor": ["katex"],
|
||||||
|
"highlight-vendor": ["highlight.js"],
|
||||||
|
"mermaid-vendor": ["mermaid"],
|
||||||
|
"map-vendor": ["leaflet", "react-leaflet"],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user