Was ist INP und warum hat es FID ersetzt?
Interaction to Next Paint (INP) ist eine von Googles drei Core Web Vitals – die Metriken, die Ihr Suchranking direkt beeinflussen und die tatsächliche Benutzererfahrung messen. INP-Maßnahmen wie schnell Ihre Seite auf Benutzerinteraktionen reagiert – jeder Klick, jedes Tippen und jeder Tastendruck während des gesamten Seitenbesuchs.
Im März 2024, INP offiziell ersetzt First Input Delay (FID) als Core Web Vital. Warum? FID hat nur die Verzögerung vor dem Browser gemessen gestartet Verarbeitung der allerersten Interaktion. Es wurden zwei kritische Probleme übersehen: langsame Verarbeitungszeit (die eigentliche Arbeit, die der Browser verrichtet) und Präsentationsverzögerung (Zeit zum Zeichnen des Ergebnisses). Außerdem wurde jede Interaktion nach der ersten ignoriert.
INP behebt all das. Es verfolgt jede Interaktion and measures the full round trip — from the moment a user clicks to the moment the screen updates. Each interaction has three phases:
Phase 1
Eingabeverzögerung
Zeit zwischen dem Klicken/Tippen des Benutzers und dem Beginn der Ausführung von Ereignishandlern durch den Browser. Verursacht durch anderes JavaScript, das den Hauptthread blockiert.
Phase 2
Bearbeitungszeit
Zeitaufwand für die Ausführung Ihres Event-Handler-Codes. Starke DOM-Manipulationen, synchrone Vorgänge und komplexe Berechnungen verlangsamen diese Phase.
Phase 3
Präsentationsverzögerung
Zeit für den Browser, Stile neu zu berechnen, das Layout durchzuführen und das visuelle Update zu zeichnen. Große DOMs und Layout-Überlastung verlangsamen diese Phase.
INP meldet das schlimmste Interaktion (technisch gesehen das 98. Perzentil) über den gesamten Seitenbesuch. Das bedeutet, dass selbst eine langsame Interaktion – wie eine träge Schaltfläche „In den Warenkorb“ oder ein verzögertes Filter-Dropdown – Ihren INP-Score nicht erreichen kann.
< 200ms
Gut
200–500 ms
Muss verbessert werden
> 500ms
Schlecht
Warum INP für Ihren Shopify-Shop wichtig ist: Ein langsam reagierender Shop fühlt sich kaputt an. Wenn ein Kunde auf „In den Warenkorb“ tippt und 400 ms lang nichts passiert, tippt er noch einmal – und landet manchmal bei zwei Artikeln oder navigiert ganz weg. Schlechter INP beeinträchtigt sowohl Ihr SEO-Ranking als auch Ihre Conversion-Rate. Möchten Sie sehen, wo Ihr Geschäft steht? Führen Sie einen kostenlosen Geschwindigkeitstest durch.
Die einfache Lösung: Automatische INP-Optimierung
Bevor wir uns mit der manuellen JavaScript-Optimierung befassen, gibt es einen schnelleren Ansatz. Thunder Page Speed Optimizer behebt automatisch mehrere der häufigsten Ursachen für einen hohen INP in Shopify-Shops.
Wie Thunder INP reduziert:
Smart Script-Verzögerung
Verschiebt unkritisches JavaScript, damit es den Hauptthread bei Benutzerinteraktionen nicht blockiert
Abhängigkeitsbewusstes Laden
Lädt Skripte in der richtigen Reihenfolge, ohne dass Konflikte im Hauptthread entstehen, die Interaktionen verzögern
Skriptverwaltung von Drittanbietern
Prevents app scripts from running heavy code during critical interaction windows
Haupt-Thread-Schutz
Reduziert die Gesamtblockierungszeit (TBT), was direkt mit besseren INP-Werten korreliert
Durchschnittliche Verbesserung: +27 PageSpeed-Punkte
Thunder befasst sich neben LCP und CLS auch mit INP – in den meisten Geschäften verbessern sich alle drei Core Web Vitals innerhalb von Minuten nach der Aktivierung der Optimierungen.
Kostenloser Plan verfügbar · Keine Kreditkarte erforderlich · 30-Sekunden-Einrichtung · Funktioniert mit allen Themen
So messen Sie den INP in Ihrem Shopify-Shop
Bevor Sie INP beheben, müssen Sie ermitteln, welche Interaktionen langsam sind und warum. Hier sind die besten Tools:
PageSpeed Insights (hier beginnen)
Gehe zu pagespeed.web.dev oder nutzen Sie unser kostenloser Shopify-Geschwindigkeitstest. Überprüfen Sie beide Abschnitte:
- Felddaten — Real user INP from Chrome users over 28 days. This is what Google uses for rankings.
- Labordaten – Zeigt die Gesamtblockierungszeit (TBT) an, die mit INP korreliert. Labortests können INP nicht direkt messen, da sie keine echten Benutzerinteraktionen simulieren.
Suchen Sie nach Diagnosen wie „Haupt-Thread-Arbeit minimieren“ und „JavaScript-Ausführungszeit reduzieren“ – diese beziehen sich direkt auf INP.
Chrome DevTools Performance Panel (am besten zum Debuggen)
Öffnen Sie DevTools (F12), gehen Sie zur Registerkarte „Leistung“, aktivieren Sie „Web Vitals“ und zeichnen Sie auf, während Sie mit der Seite interagieren. Die Interaktionsverfolgung zeigt jede Interaktion mit Farbcodierung:
- Grün – Gut (unter 200 ms)
- Gelb – Verbesserungsbedarf (200–500 ms)
- Rot – Schlecht (über 500 ms)
Klicken Sie auf eine beliebige Interaktion, um die drei Phasen (Eingabeverzögerung, Verarbeitungszeit, Präsentationsverzögerung) einzeln aufgeschlüsselt anzuzeigen. Dadurch erfahren Sie genau, wo der Engpass liegt.
Google Search Console
Under Experience → Core Web Vitals, you'll see INP performance across your entire site. Since INP replaced FID in March 2024, this report now shows INP data from real users. Pages are grouped by status (Good / Needs Improvement / Poor). Note: Search Console uses a 28-day rolling average, so improvements take about a month to fully reflect.
Web Vitals-Erweiterung (Schnellcheck)
Installieren Sie die Web Vitals Chrome-Erweiterung für ein Echtzeit-INP-Overlay, während Sie in Ihrem Shop stöbern. Es zeigt an, dass Ihr INP-Score bei jeder Interaktion aktualisiert wird – ideal, um schnell zu erkennen, welche Schaltflächen, Links oder Formularelemente langsam sind.
JavaScript Performance Observer (Fortgeschritten)
Fügen Sie dies in Ihre Browserkonsole ein, während Sie mit Ihrem Shop interagieren, um die Dauer jeder Interaktion zu protokollieren:
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
const duration = entry.duration;
const status = duration < 200 ? '🟢' : duration < 500 ? '🟡' : '🔴';
console.log(
`${status} INP candidate: ${duration.toFixed(0)}ms`,
`| Input delay: ${entry.inputDelay?.toFixed(0) ?? '?'}ms`,
`| Processing: ${entry.processingDuration?.toFixed(0) ?? '?'}ms`,
`| Presentation: ${(duration - (entry.inputDelay ?? 0) - (entry.processingDuration ?? 0)).toFixed(0)}ms`,
`| Target: ${entry.target?.tagName ?? 'unknown'}`
);
}
}).observe({ type: 'event', buffered: true, durationThreshold: 16 }); Dadurch werden die drei Phasen jeder Interaktion protokolliert, sodass Sie genau bestimmen können, ob das Problem eine Eingabeverzögerung (Hauptthread blockiert), eine Verarbeitungszeit (langsamer Ereignishandler) oder eine Präsentationsverzögerung (teures Rendering) ist.
Häufige Ursachen für einen hohen INP bei Shopify
Bevor Sie mit der Fehlerbehebung beginnen, sollten Sie verstehen, was den hohen INP in Ihrem Shop verursacht. Hier sind die häufigsten Übeltäter, sortiert nach der Häufigkeit, mit der sie Shopify-Shops betreffen:
🔴 Schwere JavaScript-Ereignishandler
Klicken Sie auf Handler, die DOM-Manipulationen, API-Aufrufe oder komplexe Berechnungen synchron durchführen. Häufig in Einkaufswagenschubladen, Schnellansichtsmodalitäten und Produktvariantenauswahlen.
🔴 App-Skripte von Drittanbietern
Apps, die Ereignis-Listener zu allgemeinen Interaktionen hinzufügen – Analyse-Tracking bei jedem Klick, Überprüfungs-Widgets, die beim Scrollen verarbeitet werden, Chat-Widgets, die Klicks abfangen. Diese laufen zusätzlich zu die Handler Ihres Themes.
🟠 Große DOM-Größe
Shopify-Shops mit mehr als 1.500 DOM-Elementen (häufig bei Mega-Menüs, Produktrastern und Fußzeilen-Linklisten) verlangsamen jede Neuberechnung des Layouts. Die Präsentationsverzögerungsphase wächst mit der DOM-Komplexität.
🟠 Layout-Thrashing
JavaScript, das Layouteigenschaften (offsetHeight, getBoundingClientRect) liest und dann in einer Schleife in das DOM schreibt. Jeder Lesevorgang zwingt den Browser dazu, das Layout synchron neu zu berechnen, wodurch der Hauptthread blockiert wird.
🟡 Synchrone DOM-Operationen
Ereignishandler, die viele DOM-Elemente gleichzeitig aktualisieren (Preise auf einer Seite aktualisieren, ein Produktraster nach dem Filtern neu rendern). Ohne nachzugeben, blockieren diese den Hauptthread bis zur Fertigstellung.
Die meisten Shopify-Shops haben eine Kombination dieser Probleme. Die gute Nachricht: Selbst die Behebung einer oder zwei der Hauptursachen kann Ihren INP-Score erheblich verbessern. Gehen wir die Korrekturen durch. Weitere Hintergrundinformationen dazu, wie sich diese Probleme auf die Gesamtgeschwindigkeit des Geschäfts auswirken, finden Sie in unserem Vollständiger Leitfaden zur Shopify-Geschwindigkeitsoptimierung.
Fix Nr. 1: Lange JavaScript-Aufgaben aufteilen
Der Hauptthread des Browsers ist Single-Threaded – er kann jeweils nur eine Sache ausführen. Wenn JavaScript länger als 50 ms ohne Nachgeben ausgeführt wird, wird es zu einem „lange Aufgabe“ , das Benutzerinteraktionen blockiert. Wenn ein Benutzer klickt, während eine lange Aufgabe ausgeführt wird, kann der Browser erst reagieren, wenn die Aufgabe abgeschlossen ist – was die Eingabeverzögerung direkt erhöht.
Verwenden Sie Scheduler.yield() (empfohlen)
Die moderne Art, lange Aufgaben aufzuteilen, ist Scheduler.yield(). Es hält Ihren Code an, lässt den Browser ausstehende Interaktionen und das Rendern verarbeiten und fährt dann fort:
// Before: One long task blocking the main thread
async function processProducts(products) {
for (const product of products) {
updateProductCard(product); // DOM updates
calculatePricing(product); // Heavy computation
renderReviews(product); // More DOM work
}
}
// After: Yields between iterations so browser stays responsive
async function processProducts(products) {
for (const product of products) {
updateProductCard(product);
calculatePricing(product);
renderReviews(product);
// Yield to the browser between each product
if ('scheduler' in window && 'yield' in scheduler) {
await scheduler.yield();
}
}
} Fallback: setTimeout-Muster
Für Browser, die dies nicht unterstützen Scheduler.yield() verwenden Sie noch das setTimeout(0) Muster:
function yieldToMain() {
return new Promise(resolve => setTimeout(resolve, 0));
}
async function processProducts(products) {
for (let i = 0; i < products.length; i++) {
updateProductCard(products[i]);
// Yield every 5 iterations to balance throughput and responsiveness
if (i % 5 === 0) {
await yieldToMain();
}
}
} Verwenden Sie requestAnimationFrame für visuelle Updates
Wenn Ihr Event-Handler die Benutzeroberfläche aktualisieren muss, schließen Sie visuelle Änderungen ein requestAnimationFrame , um sie mit dem Rendering-Zyklus des Browsers zu stapeln:
// Bad: DOM updates interleaved with logic
button.addEventListener('click', () => {
const data = computeExpensiveData();
element.style.height = data.height + 'px'; // Forces layout
element.textContent = data.label;
element.classList.add('active');
});
// Good: Separate computation from rendering
button.addEventListener('click', () => {
const data = computeExpensiveData();
requestAnimationFrame(() => {
element.style.height = data.height + 'px';
element.textContent = data.label;
element.classList.add('active');
});
}); Fix Nr. 2: Event-Handler optimieren
Jeder Event-Handler, der während einer Benutzerinteraktion ausgeführt wird, verlängert die Verarbeitungszeitphase von INP. Das Ziel: Machen Sie Ihre Handler so schnell wie möglich und verschieben Sie alles, was nicht sofort sichtbar ist.
Schnellfeuer-Ereignisse abprallen lassen
Ereignisse wie Scrollen, Größenänderung und Eingabe werden mehrmals pro Sekunde ausgelöst. Ohne Entprellen führt jedes Ereignis Ihren Handler aus, wodurch ein Rückstand an langen Aufgaben entsteht:
// Bad: Fires on every keystroke in search
searchInput.addEventListener('input', (e) => {
fetchSearchResults(e.target.value); // API call on every keypress!
renderSuggestions();
});
// Good: Debounce to max once per 300ms
let debounceTimer;
searchInput.addEventListener('input', (e) => {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
fetchSearchResults(e.target.value);
renderSuggestions();
}, 300);
}); Nicht-visuelle Arbeit aufschieben
Wenn ein Benutzer auf „In den Warenkorb“ klickt, muss er dies tun siehe Feedback sofort – aber Analyseverfolgung, Bestandsprüfungen und Empfehlungsaktualisierungen können nach der visuellen Aktualisierung erfolgen:
addToCartButton.addEventListener('click', async () => {
// 1. Visual feedback FIRST (what the user needs to see)
showCartAnimation();
updateCartCount();
// 2. Defer non-visual work
requestIdleCallback(() => {
trackAnalyticsEvent('add_to_cart');
updateRecommendations();
syncInventory();
});
}); Verwenden Sie die Ereignisdelegation
Anstatt einzelne Klick-Handler an Dutzende von Produktkarten anzuhängen, verwenden Sie die Ereignisdelegierung mit einem einzigen Handler im übergeordneten Container:
// Bad: 50 individual handlers on a collection page
document.querySelectorAll('.product-card').forEach(card => {
card.addEventListener('click', handleProductClick);
});
// Good: One handler via event delegation
document.querySelector('.product-grid').addEventListener('click', (e) => {
const card = e.target.closest('.product-card');
if (card) handleProductClick(card);
}); Fix Nr. 3: DOM-Größe reduzieren
Jedes Element in Ihrem DOM verlangsamt die Neuberechnung des Layouts. Wenn der Browser den Bildschirm nach einer Interaktion aktualisieren muss (die Phase der Präsentationsverzögerung), muss er Stile und Layout für möglicherweise Tausende von Elementen neu berechnen. Google empfiehlt, Ihr DOM unter zu belassen 1.400 Elemente – viele Shopify-Shops haben mehr als 3.000.
Überprüfen Sie Ihre DOM-Größe
Überprüfen Sie Ihre aktuelle DOM-Größe in der Chrome DevTools-Konsole:
console.log('DOM elements:', document.querySelectorAll('*').length);
console.log('Max depth:', document.querySelector('[data-max-depth]')?.dataset.maxDepth);
// Find the heaviest sections
document.querySelectorAll('section, div[class]').forEach(el => {
const count = el.querySelectorAll('*').length;
if (count > 100) console.log(count, el.className || el.tagName);
}); Häufige DOM-Bloat-Quellen auf Shopify
- Mega-Menüs – Rendern Sie häufig den gesamten Dropdown-Inhalt, auch wenn er ausgeblendet ist. Verwenden Sie Lazy Rendering oder
Inhaltssichtbarkeit: automatischfür Abschnitte außerhalb des Bildschirms. - Produktvariantenauswahl – Geschäfte mit mehr als 50 Varianten können für jede einzelne ausgeblendete Optionselemente darstellen. Laden Sie Varianten nach Bedarf.
- Footer-Linklisten – Fußzeilen-Megalinks mit Dutzenden von Spalten fügen Hunderte von DOM-Elementen unterhalb der Falte hinzu.
- Versteckte Mobil-/Desktop-Duplikate – Themes, die sowohl die mobile als auch die Desktop-Navigation rendern (eines davon mit CSS ausblenden), verdoppeln die DOM-Elemente.
Nutzen Sie die Sichtbarkeit von Inhalten für Off-Screen-Inhalte
/* Skip rendering for sections below the fold */
.product-recommendations,
.footer-mega-links,
.recently-viewed {
content-visibility: auto;
contain-intrinsic-size: 0 500px; /* Estimated height */
} Diese CSS-Eigenschaft weist den Browser an, die Renderarbeit für Elemente außerhalb des Bildschirms zu überspringen. Wenn der Benutzer in der Nähe davon scrollt, rendert der Browser sie gerade noch rechtzeitig. Dies verbessert direkt die Präsentationsverzögerungsphase von INP, da bei Interaktionen weniger Elemente neu berechnet werden müssen. Weitere Informationen zum Reduzieren Layoutbezogene Probleme, siehe unseren CLS-Leitfaden.
Fix Nr. 4: Beseitigen Sie Layout-Thrashing
Layout-Thrashing tritt auf, wenn JavaScript in einer Schleife zwischen dem Lesen und Schreiben von DOM-Layout-Eigenschaften wechselt. Bei jedem Lesevorgang muss der Browser das Layout synchron neu berechnen – und wenn Sie unmittelbar danach schreiben, wird dies beim nächsten Lesevorgang erzwungen ein anderer Neuberechnung.
// Bad: Layout thrashing — forces layout recalc on EVERY iteration
function resizeCards() {
const cards = document.querySelectorAll('.product-card');
cards.forEach(card => {
const height = card.offsetHeight; // READ (forces layout)
card.style.minHeight = height + 'px'; // WRITE (invalidates layout)
// Next iteration's read forces ANOTHER layout recalculation
});
}
// Good: Batch reads, then batch writes
function resizeCards() {
const cards = document.querySelectorAll('.product-card');
// Phase 1: Read all values
const heights = Array.from(cards).map(card => card.offsetHeight);
// Phase 2: Write all values (only one layout recalc)
cards.forEach((card, i) => {
card.style.minHeight = heights[i] + 'px';
});
} Eigenschaften, die ein erzwungenes Layout auslösen: offsetHeight, offsetWidth, getBoundingClientRect(), scrollTop, clientHeight, und getComputedStyle(). Wenn eines davon nach einem DOM-Schreibvorgang gelesen wird, muss der Browser das Layout synchron neu berechnen.
Überprüfen Sie das JavaScript Ihres Themes auf diese Muster – sie kommen besonders häufig in Produktrasterlayouts, Sticky-Headern und Infinite-Scroll-Implementierungen vor.
Fix Nr. 5: Zähmen Sie Skripte von Drittanbietern
Skripte von Drittanbietern sind die stillen INP-Killer in Shopify-Shops. Jede von Ihnen installierte App kann JavaScript hinzufügen, das bei jedem Seitenaufruf und – was noch wichtiger ist – bei jeder Benutzerinteraktion ausgeführt wird. Analyseskripte, die Klicks verfolgen, Überprüfungs-Widgets, die beim Hover verarbeitet werden, und Chat-Widgets, die Ereignisse abfangen, konkurrieren alle um den Haupt-Thread.
Überprüfen Sie die Auswirkungen Ihres Skripts von Drittanbietern
In Chrome DevTools, record a Performance trace while interacting with your page. In the Main thread flame chart, look for long tasks from third-party domains. You can also use the Netzwerkpanel → nach „JS“ filtern → nach Größe sortieren, um zu sehen, welche Skripte geladen werden:
- Analytik – Google Analytics, Meta Pixel und TikTok Pixel fügen häufig Ereignis-Listener hinzu
- Bewertungen – Yotpo, Judge.me, Loox können Scroll- und Klickereignisse verarbeiten
- Chat – Tidio, Zendesk, Gorgias fangen Klickereignisse seitenweit ab
- Upselling/Cross-Selling – ReConvert, Bold-Apps fügen häufig Handler zu Warenkorbinteraktionen hinzu
Manueller Ansatz: Aufschieben mit Interaktionsauslöser
Laden Sie unkritische Skripte von Drittanbietern erst nach der ersten Benutzerinteraktion, wenn die Seite bereits reagiert:
<script>
// Load non-critical scripts after first user interaction
const loadDeferredScripts = () => {
// Analytics
const ga = document.createElement('script');
ga.src = 'https://www.googletagmanager.com/gtag/js?id=G-XXXXX';
ga.async = true;
document.head.appendChild(ga);
// Chat widget
const chat = document.createElement('script');
chat.src = 'https://cdn.chatwidget.com/widget.js';
chat.async = true;
document.head.appendChild(chat);
// Remove listeners after loading
['click', 'scroll', 'keydown', 'touchstart'].forEach(event =>
document.removeEventListener(event, loadDeferredScripts)
);
};
['click', 'scroll', 'keydown', 'touchstart'].forEach(event =>
document.addEventListener(event, loadDeferredScripts, { once: false, passive: true })
);
</script> Dieses Muster funktioniert, ist aber fragil – Sie müssen die Skriptliste manuell verwalten, Abhängigkeiten zwischen Skripten verwalten und sicherstellen, dass nichts kaputt geht, wenn Skripte nicht in der richtigen Reihenfolge geladen werden. Genau das automatisiert Thunder: Es identifiziert, welche Skripte sicher zurückgestellt werden können, verwaltet ihre Abhängigkeiten und lädt sie in der optimalen Reihenfolge. Lesen Sie mehr über Verwalten von Skripten von Drittanbietern auf Shopify.
Fortgeschritten: Web Worker und Code-Splitting
Für Geschäfte mit komplexen benutzerdefinierten Funktionen – erweiterte Produktkonfiguratoren, Preisberechnungen in Echtzeit oder kundenseitige Suche – können diese fortschrittlichen Techniken die Bearbeitungszeit drastisch verkürzen.
Verlagern Sie umfangreiche Rechenaufgaben auf Web Worker
Web Worker führen JavaScript in einem separaten Thread aus, völlig unabhängig vom Haupt-Thread. Dies bedeutet, dass Benutzerinteraktionen durch umfangreiche Berechnungen nicht blockiert werden:
// pricing-worker.js — runs on a separate thread
self.addEventListener('message', (e) => {
const { products, discountRules } = e.data;
const calculated = products.map(p => ({
...p,
finalPrice: applyDiscountRules(p, discountRules),
savings: calculateSavings(p, discountRules),
}));
self.postMessage(calculated);
});
// main.js — keeps the main thread free
const pricingWorker = new Worker('/pricing-worker.js');
variantSelector.addEventListener('change', () => {
// Show loading state immediately (fast — on main thread)
showPriceLoading();
// Offload heavy calculation to worker (won't block interactions)
pricingWorker.postMessage({
products: getSelectedProducts(),
discountRules: window.discountRules,
});
});
pricingWorker.addEventListener('message', (e) => {
// Update UI with results (fast — just DOM updates)
updatePriceDisplay(e.data);
}); Codeaufteilung für Theme-JavaScript
Laden Sie nicht das gesamte JavaScript im Voraus. Teilen Sie den Code auf, sodass jede Seite nur das lädt, was sie benötigt:
// Instead of loading everything in theme.js:
// import './product-zoom.js';
// import './cart-drawer.js';
// import './mega-menu.js';
// import './search-autocomplete.js';
// Load only when needed:
if (document.querySelector('.product-media')) {
import('./product-zoom.js');
}
if (document.querySelector('.cart-drawer')) {
import('./cart-drawer.js');
}
// Or load on first interaction:
document.querySelector('.search-input')?.addEventListener('focus', () => {
import('./search-autocomplete.js').then(mod => mod.init());
}, { once: true }); Dynamische Importe reduzieren die anfängliche JavaScript-Nutzlast, was zu einer geringeren Blockierung des Hauptthreads in den kritischen frühen Momenten führt, in denen Benutzer am wahrscheinlichsten interagieren. Dies reduziert auch die Auswirkungen von renderblockierende Ressourcen in Ihrem Shop.
Manuelle INP-Korrekturen vs. Thunder: Direkter Vergleich
Hier ist der Vergleich zwischen dem manuellen Ansatz und der automatischen INP-Optimierung durch Thunder:
| INP Fix | Manueller Ansatz | Donneransatz |
|---|---|---|
| Skriptverzögerung | Schreiben Sie eine benutzerdefinierte Verzögerungslogik und verwalten Sie Skriptabhängigkeiten manuell | Automatische abhängigkeitsbewusste Verzögerung mit einem Klick |
| Skripte von Drittanbietern | Überprüfen Sie das JS jeder App und erstellen Sie benutzerdefinierte Ladeauslöser | Identifiziert und verschiebt automatisch unkritische App-Skripte |
| Blockierung des Hauptthreads | Ereignishandler umgestalten, Ertragspunkte hinzufügen, Web Worker verwenden | Reduces blocking by deferring heavy scripts away from interaction windows |
| Lange Aufgaben | Profilieren, identifizieren und unterteilen Sie jede lange Aufgabe einzeln | Verhindert die meisten langen Aufgaben, indem es den Zeitpunkt der Skriptausführung steuert |
| Fähigkeitsniveau | Fortgeschrittene Kenntnisse in JavaScript-Profilierung und -Optimierung erforderlich | Keine Codierung erforderlich – Installation mit einem Klick |
| Zeit zur Umsetzung | 4–16 Stunden, abhängig von der Komplexität des Geschäfts | 30 Sekunden |
| Wartung | Muss nach dem Hinzufügen von Apps oder dem Aktualisieren von Designs erneut überprüft werden | Passt sich automatisch an gespeicherte Änderungen an |
Manuelle Korrekturen geben Ihnen eine detaillierte Kontrolle, erfordern jedoch erhebliche JavaScript-Kenntnisse und laufende Wartung. Thunder führt die wirkungsvollsten Optimierungen – insbesondere Skriptverzögerung und Drittanbieterverwaltung – automatisch durch. Viele Entwickler kombinieren beides: Installieren Sie Thunder für die schwere Arbeit und wenden Sie dann manuelle Korrekturen für benutzerdefinierte Code-Engpässe an. Siehe Thunder-Preispläne.
Häufig gestellte Fragen
Was ist ein guter INP-Score für Shopify-Shops?
Google betrachtet INP unter 200 ms als „gut“, 200–500 ms als „verbesserungswürdig“ und über 500 ms als „schlecht“. Die meisten gut optimierten Shopify-Shops können INP unter 200 ms auf dem Desktop und unter 300 ms auf Mobilgeräten erreichen. INP ersetzte First Input Delay (FID) im März 2024 als Core Web Vital und ist ein umfassenderes Maß für die Interaktivität, da es alle Interaktionen während des gesamten Seitenlebenszyklus verfolgt, nicht nur die erste.
Was hat FID als Core Web Vital ersetzt?
Interaction to Next Paint (INP) hat im März 2024 offiziell First Input Delay (FID) als Core Web Vital abgelöst. Während FID nur die Verzögerung misst, bevor der Browser mit der Verarbeitung der allerersten Interaktion beginnt, misst INP die vollständige Reaktionsfähigkeit jeder Interaktion (Klicks, Tippen, Tastendrücke) während des gesamten Seitenbesuchs. Dadurch ist INP ein viel genaueres Maß dafür, wie reaktionsschnell sich Ihr Shopify-Shop für echte Benutzer tatsächlich anfühlt.
Warum ist der INP meines Shopify-Shops auf Mobilgeräten hoch, auf dem Desktop jedoch in Ordnung?
Mobile Geräte haben deutlich weniger Rechenleistung als Desktops. Googles Labortests drosseln die CPU um das Vierfache, um Mobilgeräte der Mittelklasse zu simulieren, und echte Mobilnutzer verfügen oft über noch leistungsschwächere Hardware. Schweres JavaScript, das auf einem Desktop gut läuft, kann auf Mobilgeräten den Hauptthread für Hunderte von Millisekunden blockieren. App-Skripte von Drittanbietern, komplexe Event-Handler und große DOM-Größen sind auf Mobilgeräten stärker betroffen. Konzentrieren Sie sich darauf, die Ausführungszeit von JavaScript zu verkürzen und lange Aufgaben aufzuteilen.
Können Shopify-Apps von Drittanbietern einen hohen INP verursachen?
Ja – Apps von Drittanbietern sind eine der Hauptursachen für einen hohen INP in Shopify-Shops. Apps, die Klick-Handler hinzufügen (Schnellansichtsmodalitäten, Einkaufswagen-Schubladen, Wunschlisten-Schaltflächen), Analyse-Tracking bei jeder Interaktion einbinden oder umfangreiches JavaScript bei Benutzerereignissen ausführen, können die Fähigkeit des Browsers, den nächsten Frame zu zeichnen, erheblich verzögern. Thunder hilft, indem es unkritische App-Skripte zurückstellt und ihre Ladesequenz verwaltet, sodass sie den Hauptthread bei Interaktionen nicht blockieren.
Wie messe ich den INP in meinem Shopify-Shop?
Verwenden Sie Google PageSpeed Insights (pagespeed.web.dev) sowohl für Labor- als auch für Feld-INP-Daten. Für Echtzeit-Debugging öffnen Sie Chrome DevTools, gehen zum Leistungsbereich, aktivieren „Web Vitals“ und interagieren mit Ihrer Seite – der Interaktionstrack zeigt die Verarbeitungszeit jeder Interaktion an. Der Core Web Vitals-Bericht der Google Search Console zeigt den INP auf Ihrer gesamten Website anhand echter Benutzerdaten an. Für einen schnellen Check können Sie auch unseren kostenlosen Geschwindigkeitstest unter Thunderpagespeed.com/tools/speed-test/ nutzen.
Was ist Scheduler.yield() und wie hilft es INP?
scheduler.yield() is a newer browser API that lets you break up long JavaScript tasks by yielding control back to the browser's main thread. When you call await scheduler.yield() inside a function, the browser can process pending user interactions and paint updates before your code continues. This prevents long tasks from blocking responsiveness. It's supported in Chrome 129+ and can be polyfilled for older browsers. It's the recommended replacement for older patterns like setTimeout(0).
Verbessert die Korrektur von INP das SEO-Ranking von Shopify?
Ja. INP ist neben LCP und CLS eines der drei Core Web Vitals von Google, die als Ranking-Signale dienen. Seiten mit „guten“ INP-Werten (unter 200 ms) erhalten einen Ranking-Vorteil in der Google-Suche. Über SEO hinaus wirken sich reaktionsfähige Interaktionen direkt auf Conversions aus – Studien zeigen, dass alle 100 ms Interaktionsverzögerung die Conversion-Raten um bis zu 7 % senken können. Ein schnell reagierendes Geschäft vermittelt dem Käufer das Gefühl, professioneller und vertrauenswürdiger zu sein.