Nedostatek v tvorbě HTML5 offline webů

cs v kategorii code • 4 min. čtení
Mind the age! Most likely, its content is outdated. Especially if it’s technical.

Chtěl jsem dlouho omrknout lákavou část HTML5 specifikace, a to tvoření webové aplikace i pro offline režim. Jelikož je podpora na dobré cestě (Chrome 4.0, Firefox 3.5, IE 10), rozhodl jsem se místo nějaké minutkové stránky udělat rovnou něco užitečného – například offline stránku pro BOObook.cz, kde by byla omezená nabídka s možností vložit do košíku a synchronizací ihned po obnově spojení. K tomu ještě možnost zobrazit si poslední známý stav košíku a wishlistu. Jen takové srandičky.

Bohužel jsem ale narazil na nepříjemnou drobnost, díky které už nemám takovou chuť si s offline verzí webové aplikace tolik hrát. Nejprve ale zběžně vysvětlím, jak to celé funguje – do tagu html se vloží atribut manifest s odkazem na soubor manifestu. Takový soubor může vypadat například takto:

CACHE MANIFEST
# v1 2011-08-14
# This is another comment
index.html
cache.html
style.css
image1.png

# Use from network if available
NETWORK:
network.html

# Fallback content
FALLBACK:
/ fallback.html

Který obsahuje tři části (nezáleží na pořadí a každá sekce se může vyskytnout vícekrát nebo vůbec). První v ukázce je CACHE, která určuje, jaké soubory se mají cachovat. Tato sekce se nemusí explicitně uvádět, je to výchozí sekce (v ukázce se jedná o index.html, cache.html, …). Další je NETWORK, kde se sděluje, které soubory se mají načítat z internetu. Vhodné například pro skriptíky sledující návštěvnost. A pak tu je FALLBACK sekce oznamující jakou jinou stránku zobrazit, pokud požadovaná stránka v cache není.

Není to nic složitého. Jen si dejte pozor: zástupná znak hvězdičku nelze použít v sekci CACHE a ve FALLBACK sekci je první parametr prefix, pro které pravidlo platí; tedy lomítko znamená všechny stránky. Pro podrobnější popis hodím 303 na kapitolu Let’s take this offline z Dive Into HTML5.

V odkazovaném článku se jako ukázková aplikace popisuje Wikipedia s touto funkcionalitou: jakákoliv navštívená stránka se automaticky dostane do cache a pokud požadovaná stránka není dostupná, zobrazí se speciální stránka. To je pro „statický“ obsah s užitečnými informacemi dobré řešení.

Horší to je s dynamickým webem, kde není žádoucí cachovat každou stránku. Může se jednat o sociální síť, e-shop či jinou dynamickou aplikaci, kde se každá stránka zobrazuje s měnícími se stavy. Také by stránky mohli zbytečně zabírat spoustu místa. Proto cachování každé stránky v tomto případě postrádá smysl nebo by vedlo jen ke zmatení uživatele. Zde by dobrým řešením mohlo být jen sdělit fallback a jinak vše tahat čerstvé z internetu.

Něco takového bohužel nejde udělat, protože každá stránka obsahující manifest je automaticky cachována aniž by se to explicitně uvedlo v manifestu. Nejde to potlačit ani s hlavičkou Cache-Control: no-cache, no-store. To je dost nepříjemné a tato drobnost mi přijde jako velký nedostatek.

Hned by mohlo napadnout, že se manifest může dát jen na jednu určitou stránky a na ostatní nikoliv. Pravda, ale stále jedna stránka bude cachována a hlavně(!) uživatel musí danou stránku navštívit. Pokud uživatel tak neudělá, prohlížeč se nedozví o manifestu a offline verze jakoby neexistovala.

Řešení ale neleží daleko, jen se musí trochu hackovat – vytvořit offline stránku, která jako jediná bude mít odkaz na manifest a nebude na offline stránku nikde odkaz. Tuto stránku potom přibalit ke každé stránce v tagu iframe. Tím se zajistí, že online stránky se do cache nedostanou, a přitom se o manifestu prohlížeč dozví z jakékoliv stránky. (Já říkal, že to bude hack. ;))

K lepšímu řešení jsem se zatím nedobral ani po pátráním po internetu. Snad jednou bude možné hack zahodit a udělat to systémovější cestou.








Může se vám také líbit

en Makefile with Python, November 6, 2017
en Fast JSON Schema for Python, October 1, 2018
en Deployment of Python Apps, August 15, 2018
cs Jasně, umím Git…, August 6, 2014
cs Checklist na zabezpečení webových aplikací, March 1, 2016

Další články z kategorie code.
Nenechte si ujít nové články díky Atom/RSS kanálu.



Poslední příspěvky

cs Mami, tati, přejde to, December 9, 2023 in family
cs Co vše bychom měli dělat s dětmi?, November 24, 2023 in family
cs O trávicí trubici, November 7, 2023 in family
cs Na šestinedělí se nevyspíš, October 28, 2023 in family
cs Copak to bude?, October 20, 2023 in family