docs(adr): ADR-0002: Dual Output Mode (Full Pages + Fragments)
@aRustyDev đang làm issue này rồi.
Từ ngày 5/1/2026.
Đánh giá
Issue này chưa được đánh giá.
Mô tả
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
- Ngôn ngữ chính
- Rust
- Star
- 0
- Fork
- 1
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của aRustyDev/mdbook-htmx
-
feat(ci): Implement cross-repo-validate compliance for docs syncCó thể làm lại được @aRustyDev đã nhận 291 ngày trước và không có pull request nào đang mở. Đang mởci enhancement
aRustyDev/mdbook-htmx#58 · 1 bình luận · 1 người được giao ·
-
docs(htmx): Explain how HTMX worksCó thể làm lại được @aRustyDev đã nhận 293 ngày trước và không có pull request nào đang mở. Đang mở
aRustyDev/mdbook-htmx#48 · 3 bình luận · 1 người được giao ·
-
docs(mdbook-htmx): Parent Issue for documentationCó thể làm lại được @aRustyDev đã nhận 293 ngày trước và không có pull request nào đang mở. Đang mởdocumentation
aRustyDev/mdbook-htmx#47 · 1 người được giao ·
-
docs(examples): Secure Self-Hosted Meilisearch via CloudflareCó thể làm lại được @aRustyDev đã nhận 293 ngày trước và không có pull request nào đang mở. Đang mởdocumentation
aRustyDev/mdbook-htmx#46 · 1 người được giao ·
-
docs(examples): Kubernetes with MeilisearchCó thể làm lại được @aRustyDev đã nhận 293 ngày trước và không có pull request nào đang mở. Đang mởdocumentation
aRustyDev/mdbook-htmx#45 · 1 người được giao ·
Tất cả issue của aRustyDev/mdbook-htmx
Issue tương tự
-
`mise doctor` Shows Not Installed Lazy Tools as ProblemsCó thể đã có người làm @jdx đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
Maintainer thường phản hồi trong vòng 1 ngày
-
nn::linear: weight initialization depends on `bias` because the bias is created before the weightCó thể đã có người làm @monfortema đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
LaurentMazare/tch-rs#1067 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100
astral-sh/astral-codec#234 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100