Start with requirements and constraints
Do not begin by naming frameworks. Establish the main user journey, expected traffic, supported devices, data freshness, accessibility needs and failure tolerance. State assumptions when the prompt is incomplete.
- ✓Functional and non-functional requirements
- ✓Scale estimates and usage patterns
- ✓Browser and network constraints
- ✓Clear scope and assumptions
Choose clear frontend boundaries
Describe how pages, features, shared UI, state and API access are separated. Boundaries should reduce accidental coupling and let teams change important areas independently.
- ✓Feature and route ownership
- ✓Local, shared and server state
- ✓Stable component contracts
- ✓When not to use micro-frontends
Design data flow and caching
Explain what data is fetched, where it is cached, how long it remains fresh and what happens after a write. Cover loading, empty, partial and failed states—not only the successful response.
- ✓Cache keys and invalidation
- ✓Pagination or incremental loading
- ✓Optimistic versus confirmed updates
- ✓Retries, offline states and stale data
Plan performance and delivery
Connect performance work to user-visible outcomes. Discuss rendering strategy, JavaScript cost, image and font delivery, route splitting and measurement with real-user data.
- ✓SSR, SSG and client rendering choices
- ✓Bundle and third-party script budgets
- ✓Core Web Vitals
- ✓CDN, caching and safe releases
Build reliability into the design
A senior answer anticipates slow services and partial failure. Define useful fallbacks, monitoring signals and a rollout approach that limits impact when an assumption is wrong.
- ✓Error boundaries and recovery
- ✓Logs, metrics and user monitoring
- ✓Feature flags and staged rollout
- ✓Security and accessibility checks