Skip to content

perf(router): route-based code-splitting via React.lazy - #126

Merged
WolfTasks merged 3 commits into
mainfrom
worktree-react-router-lazy
Sep 6, 2026
Merged

perf(router): route-based code-splitting via React.lazy#126
WolfTasks merged 3 commits into
mainfrom
worktree-react-router-lazy

Conversation

@WolfTasks

Copy link
Copy Markdown
Owner

Gestapelt auf #125. Base ist worktree-react-router-v8, nicht main — der Diff zeigt daher nur die Lazy-Änderungen. Nach dem Merge von #125 fällt die Base automatisch auf main zurück.

Was

PR 2 von 2 aus docs/superpowers/plans/2026-07-29-react-router-v8-migration-impl.md. Leaf-Pages werden per React.lazy nachgeladen, Layouts und RequireAuth bleiben eager.

CommitInhalt
80e5846RouteFallback — zentrierter Spinner als Suspense-Fallback
5279ce6router.tsx: alle 39 Leaf-Pages über einen lazyPage-Helper, der named- und default-Exports einheitlich kapselt
c8e967a<Suspense fallback={<RouteFallback/>}> um den <Outlet/> in AppLayout, SettingsLayout und AuthLayout

Wirkung

vorhernachher
Initial-Bundle1.692,35 kB (gzip 501,25)832,55 kB (gzip 260,60)
JS-Chunks in dist/assets156

Eigene Chunks pro Seite sind belegt (BoardPage-*.js, IssueDetailPage-*.js, ReportsPage-*.js, …). Die verbleibende Vite-Warnung zu Chunk-Größe betrifft nur noch den geteilten Vendor-Chunk, nicht mehr einzelne Seiten.

Abweichung vom Plan

Der Plan spezifiziert für RouteFallback ein hartkodiertes aria-label="Loading". Das bricht den i18n-CI-Gate, den der #15-Rollout scharf gestellt hat (Allowlist ist leer). Verifiziert, nicht vermutet — die Plan-Variante liefert:

i18n-scan: 1 hardcoded string(s) in 1 non-allowlisted file(s):
src/components/RouteFallback.tsx:6 [attr:aria-label] Loading
exit=1

Stattdessen der bereits vorhandene Key common:loading (in en und de gepflegt). Gate wieder grün.

Verifikation

  • Routen-Menge vor/nach identisch: 41 Einträge, Diff zeigt keinen einseitigen Pfad — der Plan ersetzt router.tsx vollständig, deshalb explizit gegengeprüft
  • Die vier default-Export-Seiten (AuditLogPage, ProjectAuditPage, ServiceDeskPage, IncidentDashboardPage) gegen die 'default'-Angaben im Plan abgeglichen
  • npx tsc --noEmit und npm run build grün
  • npm run lint:i18n (Scan + en/de-Parität) und npm run test:i18n grün

Offen

Manueller DE/EN-Browser-Smoke (Plan B4 Schritt 3) — Merge-Gate, das ich nicht abdecken kann: Hard-Refresh auf /p/:key/board, /p/:key/issues/:issueKey, /settings/security → kurz der RouteFallback-Spinner im Content-Bereich, Sidebar und Settings-Nav bleiben stehen, dann die Seite. Kein Flackern der Shell beim Navigieren, keine Konsolenfehler.

🤖 Generated with Claude Code

@WolfTasks

Copy link
Copy Markdown
OwnerAuthor

⚠️CI läuft auf diesem PR nicht automatisch.ci.yml triggert nur auf pull_request: branches: [main], und dieser PR zeigt auf worktree-react-router-v8 — daher "no checks reported".

Verifikation deshalb manuell via workflow_dispatch auf dem Branch nachgeholt: https://github.com/WolfTasks/TaskWolf/actions/runs/34005407058

Vor dem Merge beachten: Nach dem Merge von #125 retargetet GitHub die Base automatisch auf main, aber base_changed gehört nicht zu den Default-Triggern von pull_request — CI läuft dadurch also nicht von selbst an. Dann entweder erneut workflow_dispatch, oder einen Commit nachschieben, damit synchronize feuert.

@WolfTasks
WolfTasks changed the base branch from worktree-react-router-v8 to mainSeptember 6, 2026 02:09
Wolfgang Kozianand others added 3 commits September 6, 2026 04:09
Deviates from the plan, which specified a hardcoded aria-label="Loading".
The #15 i18n rollout left the scanner allowlist empty and gated in CI, and
the plan's version trips it:
src/components/RouteFallback.tsx:6 [attr:aria-label] Loading
Uses the existing common:loading key instead (present in both en and de).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Initial bundle drops from 1,692.35 kB (gzip 501.25) to 832.55 kB
(gzip 260.60); dist/assets goes from 1 JS chunk to 56, with per-page
chunks for BoardPage, IssueDetailPage, ReportsPage and the rest.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@WolfTasks
WolfTasksforce-pushed the worktree-react-router-lazy branch from c8e967a to 5870608CompareSeptember 6, 2026 02:10
@WolfTasks
WolfTasks merged commit 6fd3df7 into mainSep 6, 2026
11 checks passed
@WolfTasks
WolfTasks deleted the worktree-react-router-lazy branch September 6, 2026 02:15
WolfTasks pushed a commit that referenced this pull request Sep 6, 2026
Ships the react-router v8 migration:
- react-router-dom 7.18.1 -> react-router 8.3.1 (#125), which genuinely
fixes GHSA-qwww-vcr4-c8h2 (CSRF, CVSS 7.1) instead of suppressing it.
The .trivyignore entry and the audit-gate ALLOWLIST are removed again;
both gates now run without any exception.
- Route-based code-splitting via React.lazy (#126): initial bundle drops
from 1,692.35 kB (gzip 501.25) to 832.55 kB (gzip 260.60).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@WolfTasks