Invalidace css a js souborů na localhostu při vývoji i na produkci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
h4kuna
Backer | 740
+
+3
-

Ahoj,

připravil jsem jednoduchý filter na invalidaci css a js souborů, protože jsem viděl u více lidí jak se perou s tím že se jim hned css nebo js nenačítají do prohlížeče, viz třeba toto vlákno nebo tady. Na produkci máte pod kontrolou když nasadíte nový soubory, že se načtou i vaším návštěvníkům.

Instalace přes composer, regisrace rozšíření v neonu a na začínajím projektu asi víc nebudete potřebaovat. Na pozadí se vám přidá nový filtr asset a tím obalíte všechna svoje lokální css a js. Na vývoji nic nekešuje a mtime si zjišťuje při každém requestu, kdy ho pak přidá jako parametr do url. Na produkci se vyrobí keš, podle toho, které soubory je potřeba tak se postupně přidávají do keše. Možnost je si napsat vlastní CacheBuiler, který se spustí v čase kompilace v atomickém režimu a keš si vyrobit všech potřebných souborů v tento moment.

Více v manuálu na gihubu

Krátká ukázka:

extensions:
	assetsExtension: h4kuna\Assets\DI\AssetsExtension

v šablonách

<link rel="stylesheet" href="{='css/main.css'|asset}">
<script src="{='js/main.js'|asset}"></script>

Výsledkem je přidání mtime do parametru

<link rel="stylesheet" href="/css/main.css?123456">
<script src="/js/main.js?456789"></script>

EDIT
Keš není \Nette\Caching\Cache, ale vlastní implementace z hlediska rychlosti.

Výhody:

  • stejné chování na vývoji i na produkci (vždy mtime jako parametr)
  • z 10 assetů upravím jen jeden, na produkci se mi invaliduje jen ten jeden (po smazání temp/cache/_assets)
  • není potřeba myslet na změnu verze, pokud je to nějak systémově třeba číslem buildu, tak se změní i assety které to nepotřebují
  • implementovaná keš na produkci je opravdu hodně rychlá

Upozornění:

  • používáte-li nějaké vlastní CDNko tak toto nebude fungovat
  • doporučuji nasazovat rozdílové soubory, pokud děláte nějaký balík a ten nasadíte celý tak se assety invalidují všechny bez ohledu na jejich skutečnou nutnost invalidace, což je stejný jako by jste používali do parametru číslo buildu

Editoval h4kuna (19. 6. 2017 8:43)