Seiten schreiben

Jede Datei mit einer Seitenendung ist eine Seite. Standardendungen: .ht.js, .html.js sowie die TypeScript- und JSX-Varianten (.ht.ts, .ht.tsx, …).

Beginnt die Ausgabe mit <html>, stellt sitelo automatisch <!DOCTYPE html> voran. Fürs Markup empfehlen wir ht.js (javascript-to-html): Tag-Funktionen, die Strings zurückgeben — ohne Template-Engine und ohne React-Runtime.

1. Eine Funktion, die HTML zurückgibt

import { html, body, h1 } from 'javascript-to-html'

export default ({ params, data, dev }) =>
  html(
    body(h1('Hallo'))
  )

JSX-Dateien nutzen *.ht.jsx / *.ht.tsx und benötigen installiertes react und react-dom. Siehe die JSX-Einschränkungen weiter unten — sitelo verwandelt JSX zur Build-Zeit in statisches HTML; es ist keine React-Anwendung im Browser.

2. Ein einfacher String

export default `<html><body><h1>Statischer geht es nicht</h1></body></html>`

3. Ein strukturiertes Modul

Halte render, data und generateStaticParams zusammen:

import { html, body, h1 } from 'javascript-to-html'

export default {
  generateStaticParams: () => [{ slug: 'hello' }],
  data: ({ params }) => ({ title: params.slug }),
  render: ({ data }) =>
    html(
      body(h1(data.title))
    ),
}

JSX-Einschränkungen

sitelo kann .ht.jsx- / .ht.tsx-Seiten mit react-dom/server rendern, damit du die vertraute JSX-Syntax schreiben kannst. Das ist eine Schreiberleichterung — keine React-Anwendung.

React ist für den Browser gebaut: ein Komponentenbaum, der mountet, hydriert und auf Ereignisse reagiert. sitelo liefert diese Runtime nie mit deinen Seiten aus. Zur Build-Zeit rendert es dein JSX zu einem HTML-String, schreibt die Datei und hört dort auf. Kein React-Bundle im Client, keine Hydration, kein virtuelles DOM, das im Browser wartet.

Daraus folgt:

Für Klicks, Formulare und sonstiges Client-Verhalten bindest du ein normales Skript über die Asset-Pipeline ein oder nutzt Server-Islands für HTML zur Anfragezeit. Wenn du die JSX-Syntax nicht brauchst, nimm lieber ht.js oder Template-Literale — keine React-Installation, und das Modell passt zu „HTML zur Build-Zeit“.

Render-Kontext

Jede Seitenfunktion bekommt genau ein Argument:

params

Die Routenparameter dieser Seite (Record<string, string | string[]>).

data

Was deine data()-Funktion zurückgegeben hat.

page

Metadaten zur Route (routePath, relativePath, …).

dev

true im Entwicklungsserver, false zur Build-Zeit.