Full-stack
Prvotní myšlenkou bylo realizovat celé webové řešení (tedy frontend o backend) pomocí full-stacku. Je to lákavá myšlenka zejména s ohledem na velikost týmu, který projekt realizuje.
Z průzkumu aktuálních technologií vyplynulo, že dnes se nejvíce používá
- Next.js
- Astro
- Nuxt
Společnou vlastností je, že všechny se programují JavaScriptem (případně TypeScriptem). Jinak se ale poměrně dost liší.
Next.js je nejrozšířenejší, ale díky využívání Reactu na straně frontendu je nejsložitější na osvojení si této technologie pro práci. Je to také nejstarší řešení, cca z roku 2016. Běží na tom tedy množství webů, například i ChatGPT.
Astro je řešení, které je také velice rozšířené. Je poměrně nové, z roku 2022. Z uvedených možností je nejsnazší na naučení, ale jeho zaměření je proti zde uvedeným konkurentům zcela jiné. Používá se na weby, kde je třeba velmi rychle zobrazovat nepříliš komplikovaný obsah. Není to vhodné řešení pro aplikace s dynamicky se měnícím obsahem.
Poslední z uvedených je Nuxt. Je to také poměrně staré řešení (z roku 2018), které ale pro frontendovou část používá výrazně jednodušší Vue. Na naučení je to tedy střední cesta. Pro vývojáře může být výhodou, že není třeba řešit složité konfigurace, ale stačí dodržovat předepsanou strukturu projektu. Zvládá podobně složité responzivní aplikace jako Next.js a používá ho například NASA.
Pro zobrazování dat potřebujeme stack, který umí realizovat složitější funkcionalitu. Astro na to vhodné není, takže jsem ho musel vyřadit z výběru.
Při detailnějším srování zbývajících Next.js a Nuxt jsem pak dospěl k závěru, že Next.js je pravděpodobně lepší, ale výrazně komplikovanější. Nejen funkčně, ale také z hlediska osvojení si celé technologie (zejména Reactu).
Pro první realizaci serverového řešení jsem tedy vybral Nuxt.
Architektura frameworku Nuxt staví na typové bezpečnosti TypeScriptu a striktním dodržování konvencí pro strukturu projektu. Opravdu není těžké začít projekt realizovat. Propojení na databáze je dobře vyřešené a odladěné, totéž platí třeba i o napojení na MQTT Broker.
Nicméně, jako každá technologie to má svoje nevýhody. Nejhorší bylo nasazování aplikace v Dockeru, kdy jsem řešil množství problémů zejména na backendové části. Zásadním problémem je, že metoda, vyzkoušena v nativu na Windows, pak při nasazení v Dockeru vůbec nefunguje. To se týkalo například práce se soubory. Nakonec jsem zjistil, že řešení existuje, bylo třeba je zařadit do “assets” a pak to vše fungovalo jak v nativu, tak v Dockeru.
Celkově lze konstatovat, že vývoj aplikace v Nuxt je rychlý a po dobrém osvojení si správné projektové struktury je i spolehlivý. Určitě to je velmi efektivní cesta pro vývoj i složitějších aplikací, zejména pro vývojáře, kteří jsou příznivci JavaScript řešení.
Nicméně, pro programátora zvyklého na obvyklé workflow zahrnující kompilaci a linkování, je psaní aplikace v JavaScript (TypeScript) poněkud “nepříjemnou” záležitostí. Chybí právě ta fáze kontroly před spuštěním, která dokáže odhalit množství chyb. Při práci s JavaScript (TypeScript) se samozřejmě lze spolehnout na živou syntaktickou kontrolu, ale přesto se mi zdálo, že řadu chyb by běžný kompilátor objevil.
Toto zjištění platí pro všechny tři zmíněné full-stacky, protože všechny tři používají podobný způsob programování. Takže jsem to vyhodnotil tak, že cestou full-stacku nepůjdu.
Naopak jsem zjistil, že frontend část Nuxtu, která je tvořená rozšířenou Vue technologií, mi vyhovuje. Jednoduché, přehledné a přitom s množstvím možností.
Závěr z úspěšné realizace vizualizace pomocí Nuxt je následující:
- backend mi nevyhovuje
- frontend naopak ano
Protože frontend v Nuxt je v podstatě trochu rozšířené Vue, dospěl jsem k názoru, že místo full-stack řešení použiji oddělený backend a frontend.
Frontend budu dělat v “čistém” Vue.
Backend bude lepší realizovat kompilovamým jazykem. Jsem na to více zvyklý a dále předpokládám, že rychlost běhu a nižší paměťová náročnost takového řešení je výhodnější.
Realizovat webovou apliakaci pomocí full-stack řešení Nuxt není špatné, ale rozdělené řešení (frontend + backend) se mi zdá lepší.