Skip to content
  • English Deutsch

benjamin-abt.com

Performance is a feature | Cloud - AI - Azure - .NET - Sustainability

  • Home
  • Blog
  • Portfolio
    • Overview
    • Workshops & Training
    • Publications
  • Contact
  • Home
  • Blog

Aggressive Client Caching mit Hilfe von HTML 5 Manifesten

benjamin-abt.com
February 18, 2015 4 min read BEN ABT
HTML HTML5 Performance

Dieser Artikel stammt aus dem Jahr 2015. Versionen, Werkzeuge und Empfehlungen können sich seitdem geändert haben. Neuere Beiträge findest du unter Blog.

Die Anforderung von Webseiten in puncto Performance und Datenmengen steigen immer weiter an. Dies führt dazu, dass das Caching für Webseiten einen immer wichtigeren Standpunkt einnimmt und in der Priorität steigt.

Bislang war es üblich, dass statische Ressourcen – also Javascript- und CSS-Dateien – über ein Server-gesteuertes Caching auf dem Client zwischengespeichert werden.

Im Rahmen von HTML5 und modernen, Client-orientierten Webanwendungen gibt es nun aber eine weitere Möglichkeit: Offline Apps.

Offline Apps sind prinzipiell auch nur Webseiten, die im Internet verfügbar sind; über eine sogenannte Manifest-Datei können wir aber theoretisch alle statischen Ressourcen und HTML Dateien im Browser des Anwenders ablegen.

HTML5 Application Cache

Im Rahmen von HTML wurde der sogenannte Application Cache eingeführt. Hier können Webseiten völlig verschiedene Daten im Browser ablegen dauerhaft ablegen und eben so auch Offline verfügbar machen.

Dieses Verhalten können wir für ein sogenannte Aggressive Client Caching ausnutzen

Manifest

Um den Browser mitteilen zu können, was er sich speichern soll, muss eine sogenannte Manifest-Datei angelegt und im <html>-Tag bekannt gemacht werden werden.

Der Browser lädt initial das Manifest und alle darin definierten Elemente. Elemente, die dauerhaft gespeichert werden sollen, werden im Bereich CACHE definiert. Dazu gehören zum Beispiel CSS- oder Javascript-Dateien, die sich selten ändern. Im Bereich NETWORK muss alles definiert werden, was Online verfügbar sein bzw. nicht zwischengespeichert werden soll. Das sind z.B. Bewegungsdaten, eine externe API oder auch ganz einfach PHP- oder Server-generierte HTML-Dateien.

Wenn der Browser ein Mal die Daten geladen hat, greift er solange nicht mehr auf die Elemente unterhalb von CACHE zu, bis sich das Manifest geändert hat. Dabei beachtet der Browser nicht das Datum der Manifest-Datei, sondern den Inhalt. Es ist also absolut notwendig, dass ihr den Inhalt der Manifest-Datei aktualisiert, sobald ihr eine darin definierte, zwischengespeicheres Element ändert. Ganz einfach: über ein Zeitstempel im Manifest.

Beachtet, dass ihr unter dem Punkt Network ein Sternchen (*) als letzten Eintrag setzt, sodass Dateien, die nicht im Manifest hinterlegt sind, trotzdem versucht werden über den Server zu laden.

Das Manifest

 1CACHE MANIFEST
 2# Aktualisiert diese Zeitstempel, sobald sich eine Datei unter CACHE ändert
 3# 2015-02-11
 4 
 5# Alle Elemente, die unter diesem CACHE definiert werden, werden im Browser-Application Cache
 6# abgelegt. Es erfolgt kein weiterer Zugriff auf diese Datei auf dem Server, solange sich
 7# dieses Manifest nicht ändert!
 8CACHE:
 9/favicon.ico
10index.html
11stylesheet.css
12/CSS/Styles.css
13/Content/CSS/*
14/Content/images/*
15 
16# Unter dem Punkt NETWORK definiert ihr Elemente,
17# die ONLINE verfügbar sein müssen; zB APIs oder dynamische HTML-Dateien
18NETWORK:
19user.php
20/api
21http://api.twitter.com
22# GANZ WICHTIG!!
23*
24# Das Sternchen bewirkt, dass alle Dateien, die hier nicht definiert sind, versucht werde
25# vom Server zu laden. Ansonsten können nicht-definierte Dateien NICHT verwendet werden!!
26 
27# Anschließend noch die Definition von Fallbacks, also wenn auf Online-Ressourcen
28# nicht zugegriffen werden können. Hier wird nun eine 'user-offline-html' 
29# abgezeigt, sobald user.php nicht verfügbar ist
30FALLBACK:
31user.php user-offline.html

Nach einer Manifest-Aktualisierung

Nachdem die Manifest-Datei aktualisiert wurde, wird der Browser beim nächsten Besuch die Inhalte neu laden. Diese sind jedoch nicht sofort verfügbar, sondern erst nach einem erneuten Laden der Seite!

Über JavaScript (window.applicationCache) kann der Status der Aktualisierung (Available, Downloading, Ready…) abgefragt werden, sodass der Anwender benachrichtigt werden kann.

Das Auslösen der Aktualisierung erfolgt aber nicht nur durch eine aktuellere Manifest-Datei; sie wird auch erfolgen, wenn der Nutzer den Cache manuell löscht oder wenn die Aktualisierung programmatisch angestoßen wird.

JavaScript
 1function getCacheState() {
 2    switch (window.applicationCache) {
 3        case 0:
 4            return 'UNCACHED';
 5 
 6        case 1:
 7            return 'IDLE';
 8 
 9        case 2:
10            return 'CHECKING';
11 
12        case 3:
13            return 'DOWNLOADING';
14 
15        case 4:
16            return 'UPDATE READY';
17 
18        case 5:
19            return 'OBSOLETE';
20 
21        default:
22            return 'UKNOWN';
23    }
24}

Fazit

Wir können mit einer Manifest-Datei den Traffic an den Client auf ein Minimum reduzieren, da wir die Ressourcen nur noch laden, wenn sie sich wirklich geändert haben.

Die Umsetzung erfordert aber einen zuverlässigen Build-Prozess, sodass die Manifest-Datei automatisiert aktualisiert und die Änderung vom Client geladen werden kann.

Bei einer gut durchdachten Webseite kann es den Traffic massiv senken; insbesondere mit der Nutzung von Single-Page-Applications (SPA, zB mit Hilfe von Angular), bei denen wir mit statischen HTML-Dateien arbeiten und die Business-Daten nur noch über APIs laden.

Related articles

Auto-Vervollständigung von HTML-Eingabefeldern in Formularen deaktivieren

Oct 17, 2013 - 1 min read

Auto-Vervollständigung von HTML-Eingabefeldern in Formularen deaktivieren

Oft nützlich, manchmal nicht erwünscht: die Auto-Vervollständigung von Formularen im Web. Folgendes Attribut deaktiviert das standardmäßige …

Top 10 recommendations for .NET developers working with Azure Cosmos DB

Jul 10, 2026 - 11 min read

Top 10 recommendations for .NET developers working with Azure Cosmos DB

Azure Cosmos DB has a habit of exposing architectural weaknesses very early. Classic data-access patterns that work perfectly fine with …

Unio: High-Performance Discriminated Unions for C#

Mar 2, 2026 - 19 min read

Unio: High-Performance Discriminated Unions for C#

C# is a powerful language, but there is one road it has not yet fully paved: native discriminated union types. Developers have been working …


BEN ABT

BEN ABT

Ben is Chief Engineering Officer and Principal Software Engineer at Medialesson.de, with a strong focus on .NET and Microsoft Azure. In his professional role, he designs and builds highly scalable platforms for hybrid and cloud-based scenarios. He also advises companies and C-levels on migrating to the sovereign cloud.

He runs myCSharp.de, the largest and most active German-speaking C# community forum, actively contributes to both his own and external open-source projects and regularly shares his knowledge through his blog, at community events, conferences and as a writer for technical magazines.

Let's Work Together

Looking for an experienced Platform Architect or Engineer for your next project? Whether it's cloud migration, platform modernization or building new solutions from scratch - I'm here to help you succeed.

New Platforms

Modernization

Training & Consulting

Contact Me
X Facebook LinkedIn WhatsApp
Back Next Blog Post

Open for work!

Contact Me
BEN ABT BEN ABT Software Engineer · Microsoft MVP Passionate about .NET, Azure, performance optimization and sustainable software engineering.

Medialesson GmbH Logo

Microsoft MVP Logo

Recent posts

View all
Stop Using nginx as Your Default Static File Server in Docker

Stop Using nginx as Your Default Static File Server in …

Oct 24, 2026
Containerizing .NET in 2026 Without a Dockerfile

Containerizing .NET in 2026 Without a Dockerfile

Oct 20, 2026
Problem Details in ASP.NET Core and .NET 11

Problem Details in ASP.NET Core and .NET 11

Oct 5, 2026
Resilience in .NET with Microsoft.Extensions.Resilience

Resilience in .NET with Microsoft.Extensions.Resilience

Sep 21, 2026
What Matters in ASP.NET Core 11

What Matters in ASP.NET Core 11

Sep 14, 2026

Tags

.NET (192) Csharp (96) ASP.NET Core (48) Azure (41) DevOps (17) Docker (14) Microsoft (14) EF Core (11) Microsoft MVP (11) AI (10) GitHub (10) GitHub Copilot (10) ASP.NET (9) Security (9) Synology (9) Architecture (8) Raspberry (8) Azure Functions (7) Cloudflare (7) Bicep (6)
benjamin-abt.com

About BEN

Benjamin Abt is a Software Engineer, Platform Architect and Microsoft MVP specializing in .NET, Azure, cloud architecture, performance optimization and sustainable software development.

Connect

  • Follow me on GitHub
  • Follow me on LinkedIn
  • Follow me on Mastodon
  • Microsoft MVP profile
  • Follow SchwabenCode on GitHub
  • Follow me on X

Quick Links

  • Portfolio
  • Blog
  • Workshops & Training
  • Publications
  • Get in Touch
  • Sitemap
Open for Work

© Copyright Benjamin Abt & SchwabenCode | 2011 - 2026

Content licensed under CC BY 4.0 unless otherwise noted.

  • Impressum
  • Privacy
  • Contact