HugoPress reference site

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.

Tomáš Skočdopole Tomáš Skočdopole 2 min čtení
Jak postavit headless CMS nad Hugem

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

  1. Editor — autoři píší v blokovém editoru (Editor.js). Výstupem je čisté strukturované JSON, ne změť HTML z WYSIWYGu.
  2. Doménová vrstva — CMS převede bloky na hotové HTML pomocí BlockRenderingPipeline. Theme samotný o Editor.js vůbec neví.
  3. 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ý.

Tomáš Skočdopole

Autor

Tomáš Skočdopole

Senior engineer, INTEVIA

Staví headless publikační pipeline a píše o tom, jak proměnit obsah v rychlý a odolný statický web.

Související články

Výkon CDN Hugo

Proč statický web vyhrává na hraně sítě

Když uživatel otevře dynamickou stránku, server typicky sáhne do databáze, sestaví HTML a teprve pak odpoví. U statického webu je tahle práce hotová už během buildu — k requestu zbývá jen poslat hotový soubor. Co se ušetří Round-trip do databáze — neexistuje, obsah je už v HTML. Čas běhového prostředí — žádný PHP/Node proces na kritické cestě. Vzdálenost — soubor leží v CDN POPu pár desítek kilometrů od čtenáře. Měřitelný dopad Metrika Dynamicky Staticky na CDN TTFB ~280 ms ~25 ms LCP (medián) 2,4 s 0,9 s Náklady na request nezanedbatelné ~nula Nejrychlejší dotaz do databáze je ten, který se nikdy nemusí provést.

Číst dál
i18n Obsah Hugo

Dvojjazyčný web bez bolesti

Vícejazyčnost bývá ve většině systémů zdroj utrpení — duplicitní šablony, rozjeté překlady, rozbité odkazy mezi jazyky. Hugo to řeší překvapivě elegantně a HugoPress jen dotahuje pár detailů. Jeden layout, dva jazyky Data sekce žijí ve front matteru stránky, layout je sdílený. Stejná šablona layouts/blog/list.html čte .Params.* a vykreslí cs i en variantu — žádná duplikace logiky. Párování přes translationKey Stačí dát oběma verzím stejný translationKey: # content/cs/blog/_index.md translationKey: blog # content/en/blog/_index.md translationKey: blog Hugo z toho automaticky vyrobí dvojici a přepínač jazyků v hlavičce odkáže na správný protějšek. Když překlad chybí, přepínač elegantně degraduje na domovskou stránku druhého jazyka.

Číst dál