diff --git a/apps/client/src/layout/Layout.tsx b/apps/client/src/layout/Layout.tsx
index a5d2d08a..66c3f31f 100644
--- a/apps/client/src/layout/Layout.tsx
+++ b/apps/client/src/layout/Layout.tsx
@@ -1,5 +1,6 @@
-import { Outlet,useLocation } from 'react-router-dom';
+import { Outlet, useLocation } from 'react-router-dom';
import { Sidebar } from '@shared/components/sidebar/Sidebar';
+import { Suspense } from 'react';
const Layout = () => {
const location = useLocation();
@@ -8,9 +9,11 @@ const Layout = () => {
return (
<>
- {!isOnboarding && }
+ {!isOnboarding && }
-
+ Loading...
}>
+
+
>
diff --git a/apps/client/src/routes/router.tsx b/apps/client/src/routes/router.tsx
index 3f8f59ed..f4285b88 100644
--- a/apps/client/src/routes/router.tsx
+++ b/apps/client/src/routes/router.tsx
@@ -1,11 +1,13 @@
-import Category from '@pages/category/Category';
-import Level from '@pages/level/Level';
-import MyBookmark from '@pages/myBookmark/MyBookmark';
-import OnBoarding from '@pages/onBoarding/OnBoarding';
import Remind from '@pages/remind/Remind';
import { ROUTES_CONFIG } from '@routes/routesConfig';
import { createBrowserRouter } from 'react-router-dom';
import Layout from 'src/layout/Layout';
+import { lazy } from 'react';
+
+const MyBookmark = lazy(() => import('@pages/myBookmark/MyBookmark'));
+const Category = lazy(() => import('@pages/category/Category'));
+const Level = lazy(() => import('@pages/level/Level'));
+const OnBoarding = lazy(() => import('@pages/onBoarding/OnBoarding'));
export const router = createBrowserRouter([
{
@@ -13,7 +15,7 @@ export const router = createBrowserRouter([
element: ,
children: [
{
- path: ROUTES_CONFIG.remind.path,
+ index: true,
element: ,
},
{
diff --git a/apps/client/vite.config.ts b/apps/client/vite.config.ts
index 56d6f57b..571b45fc 100644
--- a/apps/client/vite.config.ts
+++ b/apps/client/vite.config.ts
@@ -4,6 +4,7 @@ import { defineConfig } from 'vite';
import { resolve } from 'path';
import tsconfigPaths from 'vite-tsconfig-paths';
import svgSpritePlugin from '@pivanov/vite-plugin-svg-sprite';
+import { visualizer } from 'rollup-plugin-visualizer';
// https://vite.dev/config/
export default defineConfig({
@@ -17,12 +18,32 @@ export default defineConfig({
symbolId: 'icon-[name]',
inject: 'body-last',
}),
+ visualizer({ filename: 'dist/bundle-analysis.html', open: true }),
],
+ build: {
+ rollupOptions: {
+ output: {
+ manualChunks: (id: string) => {
+ if (
+ id.includes('node_modules/react/') ||
+ id.includes('node_modules/react-dom/') ||
+ id.includes('node_modules/react-router-dom/')
+ ) {
+ return '@react-vendor';
+ }
+ if (id.includes('node_modules/framer-motion/')) {
+ return '@framer-motion-vendor';
+ }
+ },
+ },
+ },
+ },
+
resolve: {
alias: {
'@': resolve(__dirname, './src'),
'@api': resolve(__dirname, './src/api'),
- '@assets':resolve(__dirname,'./src/assets'),
+ '@assets': resolve(__dirname, './src/assets'),
'@utils': resolve(__dirname, './src/utils'),
'@constants': resolve(__dirname, './src/constants'),
'@shared-types': resolve(__dirname, './src/types'),
diff --git a/package.json b/package.json
index 2db20911..f41f3cd9 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
"playwright": "^1.55.0",
"prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.6.14",
+ "rollup-plugin-visualizer": "^6.0.5",
"storybook": "^9.1.3",
"turbo": "^2.5.6",
"typescript": "5.9.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f10be98e..452add23 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -69,6 +69,9 @@ importers:
prettier-plugin-tailwindcss:
specifier: ^0.6.14
version: 0.6.14(@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.2))(prettier@3.6.2)
+ rollup-plugin-visualizer:
+ specifier: ^6.0.5
+ version: 6.0.5(rollup@4.46.2)
storybook:
specifier: ^9.1.3
version: 9.1.3(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@7.1.2(@types/node@22.15.3)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.1))
@@ -4210,6 +4213,19 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
+ rollup-plugin-visualizer@6.0.5:
+ resolution: {integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==}
+ engines: {node: '>=18'}
+ hasBin: true
+ peerDependencies:
+ rolldown: 1.x || ^1.0.0-beta
+ rollup: 2.x || 3.x || 4.x
+ peerDependenciesMeta:
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+
rollup@2.79.2:
resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==}
engines: {node: '>=10.0.0'}
@@ -4357,6 +4373,10 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
stable-hash-x@0.2.0:
resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==}
engines: {node: '>=12.0.0'}
@@ -9052,6 +9072,15 @@ snapshots:
dependencies:
glob: 7.2.3
+ rollup-plugin-visualizer@6.0.5(rollup@4.46.2):
+ dependencies:
+ open: 8.4.2
+ picomatch: 4.0.3
+ source-map: 0.7.6
+ yargs: 17.7.2
+ optionalDependencies:
+ rollup: 4.46.2
+
rollup@2.79.2:
optionalDependencies:
fsevents: 2.3.3
@@ -9231,6 +9260,8 @@ snapshots:
source-map@0.6.1: {}
+ source-map@0.7.6: {}
+
stable-hash-x@0.2.0: {}
stackback@0.0.2: {}