diff --git a/packages/docs/src/components/BackLink.astro b/packages/docs/src/components/BackLink.astro new file mode 100644 index 0000000..afc8421 --- /dev/null +++ b/packages/docs/src/components/BackLink.astro @@ -0,0 +1,21 @@ +--- + +--- + +← All frameworks + + diff --git a/packages/docs/src/components/FrameworkDetail.astro b/packages/docs/src/components/FrameworkDetail.astro index 377c14e..87f6ac6 100644 --- a/packages/docs/src/components/FrameworkDetail.astro +++ b/packages/docs/src/components/FrameworkDetail.astro @@ -1,10 +1,10 @@ --- import type { CollectionEntry } from 'astro:content' import { formatBytesToMB, formatTimeMs } from '../lib/utils' +import '../styles/shared.css' +import BackLink from './BackLink.astro' import DevTimeChart from './DevTimeChart.astro' import MethodologyTag from './MethodologyTag.astro' -import MethodologyNotes from './MethodologyNotes.astro' -import '../styles/shared.css' import PageHeader from './PageHeader.astro' import SSRStatsMethodologyNotes from './SSRStatsMethodologyNotes.astro' @@ -25,7 +25,7 @@ const measuredDateDisplay = (() => { ---
- ← All frameworks +
{devtime.name} @@ -193,20 +193,6 @@ const measuredDateDisplay = (() => { line-height: 1.5; } - .back-link { - display: inline-block; - margin-bottom: 1.5em; - color: var(--ft-accent); - text-decoration: none; - font-weight: 500; - transition: color 0.2s; - } - - .back-link:hover { - color: var(--ft-accent-hover); - text-decoration: underline; - } - .detail-header { margin-bottom: 2em; } diff --git a/packages/docs/src/components/Navbar.astro b/packages/docs/src/components/Navbar.astro index a68be63..6d1e268 100644 --- a/packages/docs/src/components/Navbar.astro +++ b/packages/docs/src/components/Navbar.astro @@ -20,6 +20,11 @@ const pathname = Astro.url.pathname class={`nav-link${pathname === '/run-time' ? ' nav-link--active' : ''}`} >Run Time + Glossary e18e.dev Blog diff --git a/packages/docs/src/layouts/Layout.astro b/packages/docs/src/layouts/Layout.astro index f35f3d1..27101fb 100644 --- a/packages/docs/src/layouts/Layout.astro +++ b/packages/docs/src/layouts/Layout.astro @@ -69,7 +69,7 @@ const { title = 'Framework Tracker' } = Astro.props .page-content { width: 100%; - max-width: 1200px; + max-width: 75ch; } @media screen and (max-width: 768px) { diff --git a/packages/docs/src/pages/framework/[slug].astro b/packages/docs/src/pages/framework/[slug].astro index 378e8e1..9b3b385 100644 --- a/packages/docs/src/pages/framework/[slug].astro +++ b/packages/docs/src/pages/framework/[slug].astro @@ -1,7 +1,7 @@ --- import { getCollection } from 'astro:content' -import Layout from '../../layouts/Layout.astro' import FrameworkDetail from '../../components/FrameworkDetail.astro' +import Layout from '../../layouts/Layout.astro' import { getFrameworkSlug } from '../../lib/utils' export async function getStaticPaths() { @@ -35,11 +35,3 @@ const { devtime, runtime, baseline } = Astro.props - - diff --git a/packages/docs/src/pages/glossary.astro b/packages/docs/src/pages/glossary.astro new file mode 100644 index 0000000..586b3f7 --- /dev/null +++ b/packages/docs/src/pages/glossary.astro @@ -0,0 +1,240 @@ +--- +import BackLink from '../components/BackLink.astro' +import PageHeader from '../components/PageHeader.astro' +import Layout from '../layouts/Layout.astro' +--- + + + + +
+ Glossary +

+ This site describes the terminology and concepts used in the framework + tracker. +

+
+ +
+

Application architecture

+

+ MPA (Multi-Page Application) and + SPA (Single-Page Application) + are the two foundational architectures for web applications. The choice between + them shapes how pages are rendered, how navigation works, and how state is managed. + In practice, many modern frameworks blur the line by supporting hybrid approaches + — for example, combining server-rendered pages with client-side navigation. +

+

The key aspects that distinguish an application architecture are:

+
    +
  • + Navigation model — Does the browser perform a full page load + for each route (MPA), or does JavaScript intercept navigation and update the + page in-place (SPA)? +
  • +
  • + Content loading and processing — Is HTML assembled on the + server and sent ready-to-display (MPA), or is it generated in the browser + by a JavaScript framework consuming raw data fetched from an API (SPA)? +
  • +
  • + State lifetime — Is in-memory state reset on every navigation + (MPA), or does it persist across route changes within the same session (SPA)? +
  • +
  • + JavaScript dependency — Is JavaScript required for the page + to be meaningful, or is it an optional progressive enhancement on top of server-rendered + HTML? +
  • +
  • + SEO and initial load — Is content present in the first HTML + response (MPA), or does meaningful content only appear after JS downloads + and executes (SPA)? +
  • +
+ +

Multi-Page Application (MPA)

+

+ In an MPA, each navigation triggers a full browser request and the server + responds with a complete HTML document. HTML is generated on the server + per request, so the browser always receives ready-to-display content. + JavaScript is optional and typically used only for progressive + enhancement. In-memory state is lost on every navigation. Because content + is present in the initial HTML response, MPAs are naturally SEO-friendly. + The server must be capable of rendering and serving a full page for every + route. +

+ +

Single-Page Application (SPA)

+

+ In an SPA, the browser loads a single HTML shell once and all subsequent + navigation is handled client-side by JavaScript, without full page + reloads. HTML is generated in the browser, typically by a JavaScript + framework rendering components on demand. On initial load the browser + receives a minimal document and must download and execute JS before + content appears. Subsequent navigations fetch only data (e.g. via API + calls), keeping the page transition fast. In-memory state persists across + navigation. Because the initial HTML shell contains little content, SPAs + require extra effort (SSR, prerendering) for good SEO. The server only + needs to serve static assets. +

+
+ +
+

Rendering Patterns

+

+ A rendering pattern describes how and when content is generated and + delivered to the client, typically the browser. The rendering process can + happen on the client or on a server, and at different stages of the + application lifecycle. +

+

+ Each pattern has different tradeoffs in terms of performance, SEO, UX, + resource usage, robustness, and complexity. The choice of rendering + pattern can have a significant impact on the overall experience and + maintainability of the application. +

+ +

Static Site Generation (SSG)

+

+ All pages are pre-built into static HTML files at build time (ahead of + time) by a build tool or framework. The output is a set of ready-to-serve + files — one per route — that can be delivered directly from a CDN with no + server needed at runtime. Because every response is a pre-built file, load + times are fast and infrastructure is simple. Best suited for content that + doesn't change per request. +

+ +

Server-Side Rendering (SSR)

+

+ HTML is generated on a server for each incoming request (just in time). + This allows dynamic content and per-request logic such as authentication, + personalization, or A/B testing. Unlike SSG, SSR requires a running server + at runtime. +

+

+ The term SSR is often used together with + hydration. However, classic SSR works without + hydration — the server sends functional HTML that relies on native browser + capabilities (links, forms) rather than a JavaScript framework. This is + the traditional web model where JavaScript is only used for progressive + enhancement, not for rendering core content. +

+ +

Client-Side Rendering (CSR)

+

+ Instead of receiving ready-made HTML from a server, the browser receives a + minimal HTML skeleton and a JavaScript bundle. The JS framework then + fetches data, builds the DOM, and controls all rendering on the client + side. +

+

+ This enables highly dynamic interfaces where the page can update without + full reloads. The tradeoff is a slower initial load — nothing meaningful + appears until the JavaScript has downloaded and executed — and weaker SEO + by default, since the initial HTML response contains little content. +

+ +

Hydration

+

+ Hydration is the process of making server-rendered HTML interactive on the + client. After the browser receives the static HTML produced by + SSR, a JavaScript framework re-attaches event handlers, + restores component state, and wires up reactivity — turning an inert + document into a fully interactive application. During hydration the + framework typically re-executes the component tree against the existing + DOM rather than replacing it. +

+

+ What happens after hydration depends on the + application architecture. For a + SPA, once hydration completes the JavaScript framework + takes over routing and rendering — subsequent navigations are handled + client-side. In MPA setups, hydration only activates specific + components without changing the navigation model - page transitions still trigger + full server requests. +

+

+ The tradeoff is that hydration requires downloading and executing the same + component code that was already run on the server, which can delay + interactivity on slow devices or large pages. Techniques like + partial hydration, + progressive hydration, and + islands architecture aim to reduce this cost. +

+ +

Partial Hydration

+

+ Partial hydration is a technique where only specific components on a page + are hydrated on the client, rather than hydrating the entire component + tree. Static parts of the page remain as plain HTML and never load any + JavaScript, while interactive components are selectively hydrated. This + reduces the amount of JavaScript the browser needs to download, parse, and + execute. +

+ +

Progressive Hydration

+

+ Progressive hydration defers the hydration of individual components until + they are actually needed, rather than hydrating everything at once on page + load. Components can be hydrated based on triggers such as the component + scrolling into the viewport, the browser becoming idle, or the user + interacting with the component for the first time. This spreads the cost + of hydration over time. +

+ +

Islands Architecture

+

+ Islands architecture is a pattern where interactive UI components — called + "islands" — are hydrated independently within an otherwise static HTML + page. The static content is rendered at build time or on the server with + zero JavaScript, and only the islands ship client-side code. Each island + hydrates on its own, without depending on a top-level application shell. +

+ +

Incremental Static Regeneration (ISR)

+

+ ISR is a hybrid of SSG and SSR + where statically generated pages are regenerated in the background after a configured + time interval or on-demand trigger, without requiring a full site rebuild. When + a request arrives for a stale page, the cached version is served immediately + while a fresh version is generated in the background for subsequent requests. +

+ +

Partial Prerendering (PPR)

+

+ Partial prerendering splits a single route into a static shell that is + served instantly and dynamic holes that are streamed in at request time. + The static parts of the page — any content known at build time — are + prerendered and cached, while personalized or data-dependent sections are + rendered on-demand and streamed into the page via Suspense boundaries. +

+ +

Streaming

+

+ Streaming is a rendering approach where server-rendered HTML is sent to + the browser in chunks as each part becomes ready, rather than waiting for + the entire page to finish rendering. The browser can begin parsing and + displaying content as soon as the first bytes arrive, improving + time-to-first-byte and perceived performance. +

+ +

Server Components (RSC)

+

+ Server Components are components that execute exclusively on the server. + Unlike traditional SSR, where component code is sent to + the client for hydration, Server Components send + only their rendered output — never their source code — to the client. They + can directly access server-side resources such as databases and file + systems without exposing those details to the browser. +

+ +

Edge-Side Rendering (ESR)

+

+ Edge-side rendering moves the rendering step from a central origin server + to edge servers distributed geographically close to the user. Instead of + every request traveling to a single data center, the nearest edge node + renders the HTML, reducing latency and improving time-to-first-byte. +

+
+
diff --git a/packages/docs/src/styles/shared.css b/packages/docs/src/styles/shared.css index 1a8ae2c..a7a4346 100644 --- a/packages/docs/src/styles/shared.css +++ b/packages/docs/src/styles/shared.css @@ -47,3 +47,31 @@ h3 { font-size: 18px; } } + +/* ── Section & paragraphs ─────────────────────────────────────── */ + +section { + margin-top: 2em; +} + +p, +ul { + font-size: 16px; + color: var(--ft-muted); + line-height: 1.6; + margin-bottom: 1em; +} + +a[href^='#'] { + color: var(--ft-accent); + text-decoration: none; + border-bottom: 1px solid transparent; + transition: + color 0.2s ease, + border-color 0.2s ease; +} +a[href^='#']:hover, +a[href^='#']:focus-visible { + color: var(--ft-accent); + border-bottom-color: var(--ft-accent); +}