Signatur
Beschreibung
navigator.deviceMemory ist eine schreibgeschützte Eigenschaft aus der Device Memory API. Sie gibt einen groben Wert für den Arbeitsspeicher (RAM) des Geräts in Gigabyte zurück. Damit sich Geräte nicht eindeutig wiedererkennen lassen (Fingerprinting), liefert der Browser keinen genauen Wert. Er rundet auf die nächstniedrigere Zweierpotenz ab und begrenzt das Ergebnis nach oben und unten. Üblich sind die Werte 0.25, 0.5, 1, 2, 4 und 8.
Die Eigenschaft eignet sich für adaptive Auslieferung: Auf Geräten mit wenig Speicher kann eine Anwendung leichtere Inhalte laden. Beispiele sind kleinere Bilder, weniger Animationen, kein Vorladen, eine vereinfachte Oberfläche oder kleinere Caches. Geräte mit viel Speicher bekommen die volle Ausstattung.
Denselben Wert gibt es auch in Web Workern über WorkerNavigator.deviceMemory. Auf dem Server steht er über den Client-Hint-Header Sec-CH-Device-Memory bereit (früher Device-Memory), wenn der Server ihn mit Accept-CH anfordert. Die Eigenschaft gibt es nur in sicheren Kontexten (HTTPS oder localhost).
Rückgabewert
0.25, 0.5, 1, 2, 4 oder 8. In Browsern ohne Unterstützung ist die Eigenschaft nicht vorhanden. Der Zugriff ergibt dann undefined.Beispiele
Gerätespeicher auslesen, wenn verfügbar
if ('deviceMemory' in navigator) {
console.log(`Ungefährer Arbeitsspeicher: ${navigator.deviceMemory} GB`);
} else {
console.log('Device Memory API wird nicht unterstützt');
}
Leichtere Inhalte für Geräte mit wenig Speicher
// Fehlende Unterstützung: vorsichtig einen mittleren Wert annehmen
const memory = navigator.deviceMemory ?? 4;
const isLowEnd = memory < 2;
document.documentElement.classList.toggle('lite-mode', isLowEnd);
const imageQuality = isLowEnd ? 'low' : memory >= 8 ? 'high' : 'medium';
console.log({ memory, isLowEnd, imageQuality });
Cache-Größe am Speicher ausrichten
const getCacheLimit = () => {
const gb = navigator.deviceMemory;
if (gb === undefined) return 100; // Standardwert
if (gb <= 1) return 25;
if (gb <= 4) return 100;
return 500;
};
const cache = new Map();
const limit = getCacheLimit();
const remember = (key, value) => {
if (cache.size >= limit) {
// ältesten Eintrag entfernen (Map behält die Einfügereihenfolge)
cache.delete(cache.keys().next().value);
}
cache.set(key, value);
};
remember('user:1', { name: 'Anna' });
console.log(`Cache-Limit: ${limit}, Einträge: ${cache.size}`);
Nutzung im Web Worker
// worker.js
self.postMessage({ deviceMemory: self.navigator.deviceMemory ?? null });
// main.js
const worker = new Worker('worker.js');
worker.addEventListener('message', ({ data }) => {
console.log('Speicher laut Worker:', data.deviceMemory);
});
// Wichtig · Fallstricke
- Browser-Unterstützung: Nur Chromium-Browser unterstützen die Eigenschaft (Chrome, Edge, Opera, Samsung Internet). Firefox und Safari haben sie nicht. Prüfe deshalb immer mit
'deviceMemory' in navigatoroder lege mit??einen Standardwert fest. - Nur sicherer Kontext: Über
http://(außerlocalhost) ist die Eigenschaft nicht vorhanden. - Absichtlich ungenau: Zum Schutz vor Fingerprinting wird der Wert gerundet und begrenzt. Ein Rechner mit 32 GB meldet also meist nur
8, und aus6GB wird4. Der Wert eignet sich nur für grobe Leistungsklassen, nicht für genaue Speicherberechnungen. - Der Wert beschreibt den gesamten Arbeitsspeicher des Geräts, nicht den freien Speicher und nicht den Speicher, den der Tab nutzen darf. Den Speicherverbrauch der eigenen Seite misst man mit
performance.measureUserAgentSpecificMemory(). - Für die Anpassung auf dem Server den Client Hint
Sec-CH-Device-Memoryverwenden. Das spart eine zusätzliche Rundreise zwischen Browser und Server. - Die Entscheidung am besten mit anderen Angaben kombinieren, etwa
navigator.hardwareConcurrencyundnavigator.connection.saveData.