diff --git a/apps/web-app/src/App.tsx b/apps/web-app/src/App.tsx
index dfb60123..41851774 100644
--- a/apps/web-app/src/App.tsx
+++ b/apps/web-app/src/App.tsx
@@ -1,8 +1,10 @@
+import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
-import { Home } from './pages/Home';
-import { SkillDetail } from './pages/SkillDetail';
import { BookOpen, Github } from 'lucide-react';
+const Home = lazy(() => import('./pages/Home'));
+const SkillDetail = lazy(() => import('./pages/SkillDetail'));
+
function App(): React.ReactElement {
return (
@@ -30,10 +32,20 @@ function App(): React.ReactElement {
-
- } />
- } />
-
+
+ Loading...
+
+ }
+ >
+
+ } />
+ } />
+
+
diff --git a/apps/web-app/src/__tests__/App.performance.test.tsx b/apps/web-app/src/__tests__/App.performance.test.tsx
new file mode 100644
index 00000000..7a39b9ac
--- /dev/null
+++ b/apps/web-app/src/__tests__/App.performance.test.tsx
@@ -0,0 +1,14 @@
+import { describe, it, expect } from 'vitest';
+import fs from 'fs';
+import path from 'path';
+
+describe('App route loading', () => {
+ it('lazy loads route pages to keep the initial bundle smaller', () => {
+ const appPath = path.resolve(__dirname, '..', 'App.tsx');
+ const source = fs.readFileSync(appPath, 'utf8');
+
+ expect(source).toMatch(/lazy\(\(\) => import\('\.\/pages\/Home'\)\)/);
+ expect(source).toMatch(/lazy\(\(\) => import\('\.\/pages\/SkillDetail'\)\)/);
+ expect(source).toMatch(/