diff --git a/.vscode/settings.json b/.vscode/settings.json index 985d918..a245526 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "Neue", "Pretendard", "Segoe", + "treemap", "TTFB" ], "css.lint.unknownAtRules": "ignore", diff --git a/package.json b/package.json index b747ab9..e8cecc8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,10 @@ "prepare-commit": "lint-staged", "preview": "vite preview", "preinstall": "npx only-allow pnpm", - "prepare": "husky" + "prepare": "husky", + "dev:debug": "vite --debug --force", + "dev:profile": "vite --debug hmr", + "dev:verbose": "vite --logLevel info" }, "lint-staged": { "src/**/*.{js,jsx,ts,tsx}": [ diff --git a/src/app/assets/icon.svg b/public/logo.svg similarity index 100% rename from src/app/assets/icon.svg rename to public/logo.svg diff --git a/src/app/entry/main.tsx b/src/app/entry/main.tsx index 45f2481..b13b203 100644 --- a/src/app/entry/main.tsx +++ b/src/app/entry/main.tsx @@ -9,6 +9,11 @@ import "@app/styles/global.css"; import queryClient from "@shared/react-query/queryClient"; +// HMR 성능 모니터 (개발 환경에서만) +if (import.meta.env.DEV) { + import("@shared/libs/utils/measureHmr"); +} + createRoot(document.getElementById("root")!).render( diff --git a/src/app/index.html b/src/app/index.html index 94a79be..6a0cda3 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -2,7 +2,7 @@ - + - + diff --git a/src/app/public/logo.svg b/src/app/public/logo.svg new file mode 100644 index 0000000..54452bf --- /dev/null +++ b/src/app/public/logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/app/routes/App.tsx b/src/app/routes/App.tsx index c27472f..cc6dd66 100644 --- a/src/app/routes/App.tsx +++ b/src/app/routes/App.tsx @@ -7,7 +7,10 @@ import MainLayout from "@app/routes/MainLayout"; import PrivateRoute from "@app/routes/PrivateRoute"; import { useAuthObserver } from "@shared/hooks/useAuthObserver"; -import LoadingSpinner from "@shared/ui/loading-spinner/LoadingSpinner"; +import { useLoadingCursor } from "@shared/hooks/useLoadingCursor"; +import GlobalSnackbar from "@shared/ui/GlobalSnackbar"; +import PageTransitionLoader from "@shared/ui/loading-spinner/PageTransitionLoader"; +import ScrollToTop from "@shared/ui/ScrollToTop"; const HomePage = lazy(() => import("@pages/home/ui/HomePage")); const NotFoundPage = lazy(() => import("@pages/not-found/ui/NotFoundPage")); @@ -26,47 +29,57 @@ const ProjectListPage = lazy( () => import("@pages/project-list/ui/ProjectListPage") ); +function AppContent(): JSX.Element { + useLoadingCursor(); + + return ( + }> + + + {/* 헤더 없는 레이아웃 (로그인/회원가입 전용) */} + }> + } /> + } /> + + + {/* 헤더 포함 레이아웃 (메인 페이지) */} + }> + {/* 공개 페이지 */} + } /> + } /> + } /> + } /> + + {/* 비공개 페이지 */} + + + + } + /> + + + + } + /> + + + + ); +} + function App(): JSX.Element { useAuthObserver(); return ( - }> - - {/* 헤더 없는 레이아웃 (로그인/회원가입 전용) */} - }> - } /> - } /> - - - {/* 헤더 포함 레이아웃 (메인 페이지) */} - }> - {/* 공개 페이지 */} - } /> - } /> - } /> - } /> - - {/* 비공개 페이지 */} - - - - } - /> - - - - } - /> - - - + + ); } diff --git a/src/app/routes/MainLayout.tsx b/src/app/routes/MainLayout.tsx index f3d122c..9fb5f8c 100644 --- a/src/app/routes/MainLayout.tsx +++ b/src/app/routes/MainLayout.tsx @@ -1,6 +1,7 @@ import type { JSX } from "react"; import { Outlet } from "react-router-dom"; +import Footer from "@widgets/Footer"; import Header from "@widgets/Header/Header"; const MainLayout = (): JSX.Element => { @@ -10,6 +11,7 @@ const MainLayout = (): JSX.Element => {
+