docs(adr): ADR-0002: Dual Output Mode (Full Pages + Fragments)
@aRustyDev ci sta già lavorando.
Dal 5/1/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
ADR-0002: Dual Output Mode (Full Pages + Fragments)
Status
Accepted
Context
HTMX-based applications require two types of responses:
- Full page - Initial load or non-HTMX clients (includes
<html>,<head>, layout) - Fragment - HTMX requests with
HX-Request: trueheader (content only)
The backend must decide how to generate these outputs.
Decision Drivers
- Server Simplicity - Minimize runtime logic in serving layer
- Cache Efficiency - Static files can be cached at CDN edge
- Flexibility - Support different deployment models
- Build Performance - Avoid excessive output duplication
Options Considered
Option A: Single Output, Runtime Detection
Generate only full pages; server strips layout at runtime.
book/htmx/
└── pages/
└── chapter-1.html # Full page only
Server uses HTML parsing (lol_html, cheerio) to extract <main> content.
Pros:
- Smaller build output
- Single source of truth
Cons:
- Runtime overhead on every HTMX request
- Requires HTML parser in server
- Complex edge caching (Vary header needed)
Option B: Fragment-Only Output
Generate only fragments; server wraps in layout at runtime.
book/htmx/
└── fragments/
└── chapter-1.html # Content only
Server composes full pages by injecting fragment into layout.
Pros:
- Smallest build output
- DRY templates
Cons:
- Full page requests require runtime composition
- Layout changes require server restart
- Less cacheable
Option C: Dual Output (Recommended)
Generate both full pages and fragments at build time.
book/htmx/
├── pages/
│ └── chapter-1.html # Full page (layout + content)
└── fragments/
└── chapter-1.html # Content only
Server selects file based on HX-Request header.
Pros:
- Zero runtime overhead (file selection only)
- Full CDN cacheability
- Works with static file servers
- Progressive enhancement (works without JS)
Cons:
- ~2x output size
- Build-time layout changes require rebuild
Option D: Configurable Mode
Let user choose via config:
[output.htmx]
output-mode = "full" | "fragments" | "both"
Pros:
- Maximum flexibility
- Users optimize for their deployment
Cons:
- More complex documentation
- Testing burden
Decision
Implement dual output as default, with configurable output-mode.
Default: output-mode = "both"
Rationale:
- Zero runtime overhead is critical for edge deployments (Cloudflare Workers)
- Static file selection (
HX-Request→ fragments/, else → pages/) is trivial - Storage is cheap; compute at edge is not
- Progressive enhancement requires full pages for initial load
- Config option satisfies users with specific constraints
Implementation
enum OutputMode {
Full, // Only pages/
Fragments, // Only fragments/
Both, // Both directories (default)
}
fn render_chapter(&self, chapter: &Chapter, mode: OutputMode) {
match mode {
OutputMode::Full | OutputMode::Both => {
write_file(pages_dir.join(&chapter.path), render_full(chapter));
}
OutputMode::Fragments | OutputMode::Both => {
write_file(fragments_dir.join(&chapter.path), render_fragment(chapter));
}
}
}
Consequences
Positive
- Simple server logic (file routing only)
- CDN-friendly (static files, no Vary complexity)
- Works with any static file server
- Progressive enhancement out of the box
Negative
- Larger build output (~2x for
bothmode) - Layout changes require full rebuild
Mitigation
- Document
output-mode = "fragments"for dynamic server deployments - Implement incremental builds (only changed chapters)
References
- Lingua principale
- Rust
- Stelle
- 0
- Fork
- 1
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di aRustyDev/mdbook-htmx
-
feat(ci): Implement cross-repo-validate compliance for docs syncForse di nuovo libera @aRustyDev l’ha presa 282 giorni fa e non c’è nessuna pull request aperta. Apertaci enhancement
aRustyDev/mdbook-htmx#58 · 1 commento · 1 assegnatario ·
-
docs(htmx): Explain how HTMX worksForse di nuovo libera @aRustyDev l’ha presa 284 giorni fa e non c’è nessuna pull request aperta. Aperta
aRustyDev/mdbook-htmx#48 · 3 commenti · 1 assegnatario ·
-
docs(mdbook-htmx): Parent Issue for documentationForse di nuovo libera @aRustyDev l’ha presa 285 giorni fa e non c’è nessuna pull request aperta. Apertadocumentation
aRustyDev/mdbook-htmx#47 · 1 assegnatario ·
-
docs(examples): Secure Self-Hosted Meilisearch via CloudflareForse di nuovo libera @aRustyDev l’ha presa 285 giorni fa e non c’è nessuna pull request aperta. Apertadocumentation
aRustyDev/mdbook-htmx#46 · 1 assegnatario ·
-
docs(examples): Kubernetes with MeilisearchForse di nuovo libera @aRustyDev l’ha presa 285 giorni fa e non c’è nessuna pull request aperta. Apertadocumentation
aRustyDev/mdbook-htmx#45 · 1 assegnatario ·
Tutte le issue di aRustyDev/mdbook-htmx
Issue simili
-
founders_reward panics on a configured Testnet when the slow-start subsidy is not a multiple of 5Apertaexternal-contribution
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
ZcashFoundation/zebra#11792 ·
I maintainer di solito rispondono entro 1 giorno
-
area/cli bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
bherbruck/solvecraft#2167 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
bitcoindevkit/bdk-cli#357 ·
I maintainer di solito rispondono entro 3 giorni