V tomto blogu nájdete informácie o spracovaní statických súborov a informácie o tom, ako funguje view engine.

1. časť: ako funguje Total.js na pozadí?
Možno sa inšpirujete nejakou funkčnosťou v tomto blogu a možno naopak - napíšete mi, ako by ste to riešili vy a prečo. Vždy existuje niekoľko spôsosob ako urobiť/implementovať rôzne veci a ja pevne verím, že som nevybral ten najhorší spôsob. Pre neznalých v Node.js len uvediem, že každá Node.js web aplikácia obsahuje sama-v-sebe vlastný webový server.
Web server a statické súbory
Každý request podlieha na začiatku jeho spracovania malej analýze. Framework podľa URL adresy overuje, či sa jedná o súbor alebo o klasické trasovanie. Overí to veľmi jednoducho cez regulárny výraz, len skontroluje, či URL adresa obsahuje súborovú koncovku s maximálnou dĺžkou 8 znakov (dá sa to zmeniť) príklad: /img/logo.jpg alebo /app.manifest. Ak sa potvrdí, že sa jedná o statický súbor, tak framework pristupuje k takémuto requestu úplne inak.
Spracovanie statického súboru:
- v prvom rade framework skontroluje, či framework má registrované nejaké
file routes - ak má, tak vyhodnocuje dostupné
file routesa vyhodnotenej vyvolá akciu a ďalej už nepokračuje - ak nemá, tak sa pozerá do internej
cache, či sa tento súboru už spracoval - ak sa spracoval, vracia response podľa informácií z cache
- ak sa nespracoval, tak framework overuje
mappingacontent-typesúboru podľa jeho.extension - následne request na súbor podlieha ďalšej analýze, overí sa, či existuje a akú má reálnu veľkosť
content-length - následne sa vyhodnocuje
merging+compression(len.js,.css,.html) aresizing(len obrázky) - ak sa vyhodnotí
merging,compression, čiresizingtak framework spracovaný súbor uloží do/tmp/adresára - následne framework overí na základe
content-type, či súbor podlieha GZIP kompresii (ak je povolená) - potom sa zacacheuje podľa URL (kľúč) veľkosť súboru a absolútna cesta na fyzický súbor v tvare:
Cachovanie je hlavne kvôli rýchlosti a efektivite, takže podľa relatívnej URL adresy sa dá veľmi rýchlo overiť, či súbor bol spracovaný alebo nie a akú má veľkosť. Framework cache resetuje každých 7 minút (dá sa to zmeniť v configu). Zabudol som poznamenať, že v prípade resize and merge sa súbory z /tmp/ adresára nemažú a framework ich po resetovaní cache znova nespracúva (len overí či existujú v /tmp/ a ak neexistujú spracuje ich znova). V celom mechanizme je ešte implementovaná HTTP cache, či streamovanie cez content-range.
Spracovanie statických súborov sa dá v config vypnúť a zašiel som ešte trošku ďalej - v prípade, že chcete na statické súbory používať napr. NGINX a zároveň používať v Total.js napr. merging, tak framework obsahuje funkciu F.snapshot(relative_url, filename), ktorá dokáže interne vytvoriť request a zároveň jeho obsah uloží do súboru na hocijaké miesto na disku.
View engine
Pri návrhu view engine som čerpal trošku inšpiráciu z ASP.NET MVC - Razor Engine, ale dovolím si povedať, že som ho urobil sofistikovanejšie ako v tej dobe bol Razor Engine (o tom inokedy). Pri vyvolaní render view sa dejú naozaj čudné veci:
views/index.html (príklad):
View Engine načíta obsah súboru do pamäti a následne začína jeho analýza:
- poznámka: ešte pred spracovaním obsahu je jasné, pre aký jazyk bude daný view lokalizovaný
- algoritmus vyhľadáva všetky lokalizované texty
@(Title)v celom obsahu zview - z každého lokalizovaného textu vytvorí malý
HASHa pokúsi sa ho vyhľadať vresource(viď poznámka) - v prípade, že lokalizovaný text sa nachádza v
resource, tak text v obsahu je nahradený textom zresource - v prípade, že lokalizovaý text sa nenachádza v
resource, tak algoritmus ponecháva aktuálny text - obsah je následne podrobený HTML minifikácii (ak je povolená)
- a potom je prenesený do algoritmu
view engine compiler, ktorý oddelí statický text od dynamických hodnôt - dynamické hodnoty algoritmus analyzuje a snaží sa zistiť, či je ich možné "vyrenderovať" ihneď napr.
@{title} - ak sa jedná o statický text, tak jeho hodnota je uložená do poľa v globálnej premmenej (čistí sa každých 7 minút)
- po skončení analyzovania obsahu framework vygeneruje
functiona skompiluje vyparsovaný obsah - následne ak je
RELEASEmód, tak výsledok kompilácie (funkcia) sa uloží docachepo dobu 7 minút (dá sa to zmeniť)
Hodnoty v cache statických textov:
Framework vytvorí zkompilovaný view pre každý jazyk v akom bol volaný, takže pokiaľ nie je request na daný view, tak view sa nekompiluje. Celý algoritmus je trošku sofistikovanejší, ale na predstavu vyššie uvedený popis absolútne stačí.
Poznámka: HTML minifikácia minifikuje aj inline <script> a inline <style>.
Niekedy v blízkej budúcnosti sa budem snažiť opísať ešte generovanie dynamického obsahu, ktoré obsahuje tiež sofistikované algoritmy. Hlavne popíšem ako funguje middleware, authorization, cache pre routes, aplikovanie flagov, spracovanie binárnych dát (rozujem upload) až po vyvolanie controllera.
Other posts from Peter Širka
- 2025-08-08Recenzia Sigma 500mm F5.6 L-Mount
- 2025-07-21Export obrázkov - Lightroom vs Luminar Neo
- 2025-01-13Recenzia full frame fotoaparátu Lumix S5II
- 2024-10-30JavaScript na serveri rýchlo a jednoducho so slovenským Total.js frameworkom
- 2024-02-18Ako lietať s long range dronom?
- 2024-02-09Recenzia drona DJI FPV
- 2024-02-07Recenzia drona DJI Avata
- 2023-01-06Ako spustiť Total.js framework?
- 2023-01-03Inštalácia Node.js + vysvetlenie použitia modulov
- 2022-05-26Základné informácie o Total.js Platforme
