Condensed for last-minute review — every key takeaway, decision table, and recall card.
01 — FOUNDATION
What is Frontend System Design & the RADIO thinking framework?
Interview Tips: Think out loud and continuously confirm with the interviewer: "I'll assume X, does that sound okay to you?" They evaluate the communication process and trade-offs more than a single "correct" answer.
Key points to remember: FE System Design = Intentional Trade-offs. There is no perfect solution; every choice comes with a cost. Your job is to pick the right one for the right context and explain why.
Step
Goal
Suggested duration
R — Requirements
Understand the problem: functionality, users, constraints, devices.
~5 minutes
A — Architecture
Draw the major components & data flow between them
~12 minutes
D — Data Model
State definition: server data vs. client/UI state
~8 minutes
I — Interface/API
The contract between client and server, and between components (props).
~8 minutes
O — Optimizations
Performance, a11y, network, UX, security — deep dive.
~12 minutes
02 — FOUNDATION
Requirements Clarification
Common mistakes: Spending too little (or too much) time on this step. The goal is to finalize the scope within ~5 minutes to establish a clear "contract" for the remainder of the session.
04 — CORE
Rendering Patterns: CSR · SSR · SSG · ISR
How to answer intelligently: Don't say "always use SSR." Instead, say: "Since the page needs SEO and content varies by user, I choose SSR; but for the post-login dashboard, CSR is sufficient because it doesn't need indexing." → This demonstrates context-driven thinking.
Pattern
When is HTML created?
SEO
FCP speed
Good for
Client-Side Rendering (CSR)
In the browser, after JS runs
Weak (requires workaround)
First-time slow
Dashboard, post-login app, minimal SEO needed.
SSR (Server-Side Rendering)
For each request, on the server
Good.
Fast (TTFB depends on server)
Personalized page, data changes continuously, requires SEO.
SSG (Static Site Generation)
During build, before deployment
Best.
Fastest (CDN)
Blog, documentation, marketing, landing page
ISR (Incremental Static Regeneration)
Pre-built + periodic regeneration
Good.
Fast
E-commerce, many pages but updates are not continuous.
Hydration is the process of converting a static HTML page into an interactive web application by attaching event handlers and state to the server-rendered markup.
— The process of attaching JS event handlers to server-rendered HTML, turning a static page into an interactive one.
TTFB stands for Time to First Byte, which is the time from when the client sends a request to when it receives the first byte from the server.
— Time To First Byte — the time from when a request is made until the first byte is received from the server. SSR heavily depends on it.
Islands Architecture is a web architecture pattern that loads the page as static HTML, then selectively hydrates only the interactive components (the "islands") on the client side. This approach reduces the amount of JavaScript sent to the browser, improving initial load performance and time to interactive.
— The page is mostly static HTML; only interactive "islands" load JS → drastically reduces JS sent to the client.
05 — CORE
Performance & Core Web Vitals
Don't optimize prematurely: Always measure first, optimize later. Use Lighthouse, Performance tab, and React Profiler to identify real bottlenecks instead of guessing. Optimizing the wrong place wastes time and complicates the code.
How to reduce CLS?
— Set width/height for images & videos, reserve space for ads/embeds, avoid inserting content above the content being viewed.
Debounce vs Throttle?
— Debounce: only runs AFTER activation stops (search input). Throttle: runs at most N times per second (scroll, resize).
Tree-shaking is a term used in JavaScript module bundlers (like Webpack, Rollup, or ESBuild) to eliminate dead code—code that is imported but never used. It relies on the static structure of ES modules (import/export) to determine which exports are actually referenced. During the build process, unused exports are "shaken off" from the final bundle, reducing file size and improving load performance.
— Bundlers remove unused code (dead code) based on ES module imports, resulting in smaller bundles.
06 — CORE
Networking & Client-side API Design
This is a commonly asked question.: "Which pagination should social media feeds use?" → Cursor-based. Because feeds continuously have new posts inserted at the top; offset would cause duplicate/missed items when scrolling.
REST
GraphQL
Fetch data
Multiple fixed endpoints
1 endpoint, client declares the required fields themselves.
Over/Under-fetching
Prone to (over-fetching/under-fetching)
Minimize as much as possible.
Caching
Simple (HTTP cache by URL)
More complex (requires normalization)
Versioning
Commonly /v1, /v2
Schema evolution, deprecate field.
"Matches"
Simple API, cache by URL
Complex UI with multiple data relationships.
07 — CORE
State Management
Common Misunderstandings: Many people stuff server data into Redux and write their own cache/loading/error logic. In reality, server state is very different from client state: it's asynchronous, can become "stale", and requires refetching & deduplication. Let React Query/SWR handle that.
Type
Description
The right tool
Server State
List of articles, user profiles (requires caching, sync, refetch)
React Query, SWR, RTK Query, Apollo
Local State
Input value, open/close dropdown
useState, useReducer
Global UI State
Theme, login, cart, global modal
Context, Zustand, Redux, Jotai
URL State
Selected tab, filters, search keywords
Router (query parameters)
08 — CORE
Component Design & API Design
Advantages during the interview: When designing Autocomplete, proactively mention: debounce, race condition (AbortController), caching results, keyboard navigation (↑↓ Enter Esc), ARIA (role="combobox", aria-activedescendant), and virtualization for long lists. This is the checklist interviewers expect.
09 — ADVANCED
Caching & Client Storage
Token security: Don't store sensitive tokens in localStorage if you're concerned about XSS — it's accessible via JavaScript. Cookies with HttpOnly + Secure + SameSite flags are safer for sessions, since JavaScript cannot read them.
The mechanism
Capacity
Characteristics
Used for
**Memory (JS)**
RAM
Lost when reloading
Cache runtime, state
localStorage
5–10 MB
Synchronous, string only, long-lived.
Theme, small token, prefs
sessionStorage
~5MB
Lost when closing the tab
Session-based temporary data
IndexedDB
Large (hundreds of MB+)
Asynchronous, store object
Offline data, big data
Cookies
~4KB
Attach to every request
Session ID (HttpOnly), auth
Cache API
Large
Through Service Worker
Cache response, PWA offline
10 — ADVANCED
Real-time Updates
How to quickly select: Server push only? → SSE (lightweight, auto-reconnect, over HTTP). Need high-frequency bidirectional? → WebSocket. Not urgent/simple? → Polling. Always consider reconnection, heartbeat, and fallback.
The mechanism
Afternoon
Complexity
Good for
Short Polling
The client asked:
Low
No rush to update, prototype.
Long Polling
Client asks (keep connection)
Average
Fallback when WebSocket is unavailable
SSE
Server → Client (one-way)
Low–Medium
Notification, feed, log stream
WebSocket
two-way
Cao
Chat, collaboration, gaming, trading
11 — ADVANCED
Accessibility (a11y) and Internationalization (i18n)
The first rule of ARIA: "No ARIA is better than bad ARIA." Prioritize semantic HTML. A real `