Latest in Frontend
Frontend guides on React, the DOM, and browser behaviour — component patterns, rendering quirks, and the JavaScript that ties a UI together.
React 19.3 use(browser()): render browser-only components without hydration errors or useEffect hacks
React 19.3 adds browser() from react-dom: call use(browser()) in a component that needs localStorage, the time zone or another browser API, and the server renders the nearest Suspense fallback instead. Tested with server and browser in different time zones, in Chromium, Firefox and WebKit and in Next.js 16.3: how it compares with the useEffect "mounted" trick and next/dynamic, the build error you get without a Suspense boundary, and the server-side onBrowserBailout and timeout options.
Vite+ 1.0 hands-on: migrating a real Vite + ESLint + Prettier + Vitest project, and what to check afterwards
Vite+ 1.0 replaces Vite, Vitest, ESLint, Prettier and your Node version manager with one vp command. A React + TypeScript project migrated with vp migrate, tested step by step: what the migration changes, the lint error it introduces in its own output, a no-undef rule that produced 10,840 false errors on Excalidraw, a task cache that can replay a stale production build, and the missing library that stops managed Node 26 in slim Docker images.
Modern JavaScript features you can use in Node.js 26
A batch of genuinely useful JavaScript additions is now unflagged in Node.js 26: Set operations (union, intersection, difference), lazy iterator helpers, RegExp.escape, Promise.try, Array.fromAsync, and Float16Array. Here's each one with real, verified output.
Temporal: the modern way to handle dates in Node.js
JavaScript's broken Date object finally has a replacement. Temporal — Stage 4 in ES2026 and enabled by default in Node.js 26 — brings immutable date/time types, real time-zone support, and sane arithmetic. Here's how to use it, with examples and the polyfill for older environments.
The HTTP QUERY method: GET semantics with a request body
The new HTTP QUERY method (RFC 10008, 2026) gives you the safe, idempotent, cacheable semantics of GET with the request body of POST — ideal for large or structured read operations. Here's its status, browser and server support, and a form + fetch + Node example you can actually test.
How to set up Tailwind CSS v4
Tailwind CSS v4 is CSS-first: no tailwind.config.js, no @tailwind directives, and automatic content detection. Here's how to set it up with Vite, PostCSS, or the CLI, customize your theme with @theme, and migrate from v3.
How to Use Quill (with react-quill-new) and Distinguish <ul> vs <ol> Lists Using getSemanticHTML()
Quill internally renders both bullet and numbered lists as <ol> elements, which can break list semantics when saving content. Using getSemanticHTML() with react-quill-new ensures your exported HTML correctly distinguishes between <ul> and <ol>.
Next.js ChunkLoadError after deploying: why open tabs break and how to fix it (tested on Next.js 16)
ChunkLoadError: Failed to load chunk after a deploy isn't a build cache problem. It's version skew: a tab opened before the deploy asks for a JavaScript file that the new build deleted. I reproduced it in Next.js 16.3 and tested the fixes: keeping old static files, reloading once on ChunkLoadError, what deploymentId does and doesn't do, and the CDN cache that leaves pages silently dead.
Call a child component's method from the parent in React 19: ref as a prop + useImperativeHandle
In React 19 you don't need forwardRef any more: ref is a regular prop, and useImperativeHandle lets a child expose methods like focus() or clear() to its parent. Here's the pattern in JavaScript and TypeScript, tested in Chromium, Firefox and WebKit with React 19.3, plus the StrictMode bug in the classic example, ref cleanup functions, and the key trick that often makes imperative calls unnecessary.
Server-Sent Events in Node.js: live updates with EventSource, reconnects and Last-Event-ID
Push live updates from Node.js to the browser over plain HTTP with Server-Sent Events: no WebSocket server and no dependencies. A ~60-line server with event ids, catch-up after a reconnect, a configurable retry delay, keep-alives and a clean way to stop, all verified in Chromium, Firefox and WebKit. Plus the six-connection limit that bites on HTTP/1.1.
fetch() with a timeout: AbortSignal.timeout(), AbortSignal.any() and the setTimeout trap
fetch() has no timeout option, but one line fixes that: AbortSignal.timeout(ms). Here's how it behaves while you wait for headers and while you read the body, how to combine it with a cancel button using AbortSignal.any(), how to tell a timeout from a cancel, and why the old setTimeout + AbortController recipe keeps Node processes alive. Tested on Node 24 and 26.
Stop CSS columns from splitting an element: break-inside: avoid
With CSS columns, a card or list item can get cut in half, with its top at the bottom of one column and the rest at the top of the next. One line fixes it: break-inside: avoid. Tested in Chromium, Firefox and WebKit, including what the legacy page-break-inside does today and the case it can't fix.