Написание страниц

Любой файл с расширением страницы является страницей. Расширения по умолчанию: .ht.js, .html.js, а также варианты TypeScript и JSX (.ht.ts, .ht.tsx, …).

Если вывод начинается с <html>, sitelo автоматически добавляет <!DOCTYPE html>. Для разметки рекомендуем ht.js (javascript-to-html): функции-теги, возвращающие строки, без шаблонизатора и без рантайма React.

1. Функция, возвращающая HTML

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

export default ({ params, data, dev }) =>
  html(
    body(h1('Привет'))
  )

JSX-файлы используют *.ht.jsx / *.ht.tsx и требуют установленных react и react-dom. См. ограничения JSX ниже — sitelo превращает JSX в статический HTML во время сборки; это не React-приложение в браузере.

2. Обычная строка

export default `<html><body><h1>Статичнее некуда</h1></body></html>`

3. Структурированный модуль

Держите render, data и generateStaticParams рядом:

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

sitelo умеет рендерить страницы .ht.jsx / .ht.tsx через react-dom/server, так что вы можете писать привычным синтаксисом JSX. Это удобство записи — а не React-приложение.

React создан для браузера: дерево компонентов, которое монтируется, гидратируется и реагирует на события. sitelo никогда не отправляет этот рантайм вместе с вашими страницами. Во время сборки он рендерит ваш JSX в строку HTML, записывает файл и на этом останавливается. Ни клиентского бандла React, ни гидратации, ни виртуального DOM, ждущего в браузере.

Из-за этого:

Для кликов, форм и прочего клиентского поведения подключите обычный скрипт через конвейер ресурсов, либо используйте серверные острова для HTML, создаваемого в момент запроса. Когда синтаксис JSX не нужен, лучше взять ht.js или шаблонные строки — без установки React, и модель совпадает с «HTML во время сборки».

Контекст рендеринга

Каждая функция страницы получает один аргумент:

params

Параметры маршрута этой страницы (Record<string, string | string[]>).

data

То, что вернула ваша функция data().

page

Метаданные маршрута (routePath, relativePath, …).

dev

true в сервере разработки, false во время сборки.