Preload html css font (late) font (preload) 180 ms discovered by the hint, not by the CSS A hint to fetch a specific resource early at high priority because the page will need it, before the parser discovers it.
in practice The LCP hero image or a font referenced only from CSS; the console warning when a preloaded resource is not used within seconds.
Fetch priority request priority html, css Highest LCP img + fetchpriority=h… High script async Low img below fold Low prefetch Lowest The browser's per-request priority (highest to lowest) and the fetchpriority attribute that nudges it.
in practice The Priority column in Network; fetchpriority="high" on the LCP image; low on below-the-fold carousels.
Prefetch page A idle prefetch B.js lowest click → B from cache A low-priority fetch of something a likely next navigation will need, stored in the HTTP cache.
in practice link rel=prefetch for the next route's chunk; Speculation Rules prerender for whole pages.
HTTP cache request cache: f… max-age yes: use… 0 ms no: reva… ETag The browser's store of responses keyed by URL, reused according to Cache-Control so repeat requests skip the network.
in practice The "(disk cache)" and "(memory cache)" size column entries; hashed filenames with year-long max-age.
Cache-Control app.3f9a.js public, max-age=31536000, i… index.html no-cache /api/me private, no-store /feed max-age=60, stale-while-rev… The response header that says who may cache a response and for how long: max-age, no-cache, no-store, private, immutable, stale-while-revalidate.
in practice immutable, max-age=31536000 on hashed assets; no-cache on HTML; private on personalised API responses.
ETag and revalidation browser server GET If-None-Match: "v7" 304 Not Modified (no body) cheap on bytes, still one RTT A version tag on a response; when stale, the browser asks "If-None-Match" and the server answers 304 with no body if unchanged.
in practice The 304 rows in Network: small, but each still a round trip.
stale-while-revalidate ui cache server read stale value now revalidate (background) fresh value stored Serve the cached response immediately even if slightly stale, and refresh it in the background for next time.
in practice Cache-Control directive for feeds and config; the same idea in SWR and TanStack Query on the client.
CORS app.com api.com OPTIONS (preflight) Allow-Origin: app.com POST /orders 200 + Allow-Origin the browser enforces; the server opts in Cross-Origin Resource Sharing: the server opting in, via Access-Control-Allow-* headers, to let another origin's script read its responses.
in practice The red CORS error in the console; preflight OPTIONS requests; "Script error." when a cross-origin script lacks it.
Preflight PUT + JSON non-simple OPTIONS allowed? real request if yes an extra RTT unless Max-Age caches it An automatic OPTIONS request the browser sends before a non-simple cross-origin request to ask whether it is allowed.
in practice Extra OPTIONS rows before PUT, DELETE or JSON POSTs; Access-Control-Max-Age caches the answer.
Compression (gzip, Brotli, zstd) raw JS gzip brotli 600 KB parse cost is paid on the raw size Encoding text responses smaller on the wire; Brotli beats gzip by 15 to 25% on JS and CSS.
in practice content-encoding: br in response headers; the two sizes in the Network size column (transferred vs resource).
WebSocket client server GET Upgrade: websocket 101 Switching price tick subscribe price tick A long-lived, full-duplex connection upgraded from HTTP, for messages in both directions without a request per message.
in practice The WS filter and Messages tab in Network; live prices, chat, presence; reconnect and backoff logic.
Server-Sent Events client server GET Accept: text/event-stream data: … data: … data: … one direction, reconnects itself A one-way stream of text events from server to client over plain HTTP, with automatic reconnection built in.
in practice EventSource; notification feeds and LLM token streaming; simpler than WebSocket when the client only listens.