Jak postavit headless CMS nad Hugem
Proč jsme oddělili psaní obsahu od jeho doručování a jak HugoPress propojuje rich editor se statickým webem přes Git.
Klasické monolitické CMS spojuje psaní obsahu, jeho ukládání i samotné vykreslování do jednoho běžícího procesu. To je pohodlné, dokud nezačnete řešit výkon, bezpečnost a škálování. Headless přístup tahle tři odpovědnosti rozpojí — a přesně na tom stojí HugoPress.
Tři vrstvy, tři odpovědnosti
- Editor — autoři píší v blokovém editoru (Editor.js). Výstupem je čisté strukturované JSON, ne změť HTML z WYSIWYGu.
- Doménová vrstva — CMS převede bloky na hotové HTML pomocí
BlockRenderingPipeline. Theme samotný o Editor.js vůbec neví. - Doručení — vyrenderovaný obsah se zapíše jako
content/<lang>/...a commitne do Gitu. Hugo z něj postaví statický web.
Theme nezná Editor.js. Všechny renderery sedí na straně CMS — díky tomu je šablona hloupá, přenositelná a snadno testovatelná.
Proč zrovna Git jako přenosová vrstva
Git nám dává tři věci skoro zadarmo:
- Historii — každá publikace je commit, takže máme audit i rollback.
- Review — náhled běží nad stejným repozitářem jako produkce.
- Idempotenci — když se obsah nezměnil, není co commitovat, a publikace se přeskočí.
public function publish(Article $article): void
{
$html = $this->pipeline->render($article->blocks());
$this->repository->writeContent($article->locale(), $article->slug(), $html);
$this->git->commitIfChanged(sprintf('publish: %s', $article->slug()));
}
Co tím získáte
Statický web nemá běhové prostředí, které by se dalo napadnout, žádné dotazy do databáze při requestu a dá se servírovat z CDN co nejblíž čtenáři. Autor přitom pracuje v pohodlném editoru a o sestavení se nestará.
V dalším článku se podíváme na to, proč je takový web tak rychlý.