Zum Inhalt springen
Shops & CMS

Suchvorschläge ohne Wartezeit: die Shopsuche beschleunigen

Die Shopsuche als Echtzeitstrecke: Eingaben entprellen, überholte Anfragen abbrechen, häufige Präfixe cachen und die Vorschlagsliste schlank rendern.

15 Min. Lesezeit INPE-CommerceCachingJavaScriptShopsuche

Wer ins Suchfeld eines Shops tippt, weiß meist schon, was er will. Kein anderer Weg durch den Shop zeigt die Kaufabsicht so deutlich - und kaum ein anderer reagiert so unmittelbar auf jede einzelne Taste. Suchvorschläge sind längst Standard: 80 Prozent (Baymard Institute) der untersuchten Onlineshops bieten sie an, bei der ersten Erhebung 2014 waren es 72 Prozent (Baymard Institute). Umso stärker fällt auf, wenn die Liste hinterherhinkt, flackert oder Vorschläge für einen Begriff zeigt, den niemand mehr eingibt. Dieser Beitrag betrachtet die Suche als Echtzeitstrecke vom Tastendruck bis zur gezeichneten Vorschlagsliste, misst sie an den Wahrnehmungsgrenzen von 0,1 und 1,0 Sekunden (Nielsen Norman Group) und zeigt je Abschnitt die passende Maßnahme: Entprellen, Abbrechen überholter Anfragen, einen Antwort-Cache für häufige Präfixe und eine schlanke Trefferliste. Für Onlineshops und B2B-Portale ist das ein fester Baustein der E-Commerce-Performance.

Das Wichtigste in Kürze

  • Suchvorschläge sind Standard: 80 Prozent (Baymard Institute) der untersuchten Onlineshops bieten sie an. Die Suche ist der Weg mit der klarsten Kaufabsicht - jede Verzögerung trifft Besucher, die schon wissen, was sie wollen.
  • Jeder Tastendruck im Suchfeld zählt als Interaktion (web.dev) und geht damit in den INP ein. Als gut gilt ein INP von höchstens 200 Millisekunden (web.dev) - schwere Eingabe-Handler und eine lange Renderphase der Liste treffen diesen Wert direkt.
  • Die Zielwerte liefert die Wahrnehmung: Bis 0,1 Sekunden (Nielsen Norman Group) wirkt eine Reaktion sofort, bis 1,0 Sekunden (Nielsen Norman Group) bleibt der Gedankenfluss ungestört. Das getippte Zeichen gehört unter die erste Grenze, die Vorschlagsliste unter die zweite.
  • Entprellen und Abbrechen gehören zusammen: Die Anfrage startet erst in einer Tipp-Pause, und jede neue Suche bricht die noch laufende per AbortController ab (MDN). So zeigt die Liste nie Vorschläge für einen veralteten Begriff.
  • Häufige Präfixe wiederholen sich über alle Besucher. Ein Antwort-Cache mit normalisiertem Schlüssel beantwortet sie, ohne die Datenbank zu fragen; Verkaufskanal, Sprache und Kundengruppe gehören in den Schlüssel, Sitzungsdaten nicht.
  • Suchfeld und Ergebnisseite fehlen in üblichen Lighthouse-Läufen, weil dort niemand tippt. Gemessen wird im Zeitraum-Modus mit echter Eingabe und im Feld mit RUM-Daten, gefiltert auf das Suchfeld.

Warum die Shopsuche die klarste Kaufabsicht trägt

Ein Besucher, der über die Navigation kommt, stöbert. Ein Besucher, der ins Suchfeld tippt, sucht - einen bestimmten Artikel, eine Marke, eine Bestellnummer aus dem letzten Angebot. Im B2B-Portal ist das noch ausgeprägter: Einkäufer kennen ihre Artikelnummern und erwarten, dass nach wenigen Zeichen die richtige Position in der Liste steht. Die Suche ist damit der Weg durch den Shop, auf dem Absicht und Geduld am weitesten auseinanderliegen. Die Absicht ist hoch, die Bereitschaft zu warten gering. Wer hier ins Leere tippt, verliert den Faden, bevor der Shop überhaupt zeigen konnte, was er führt.

Suchvorschläge sind dabei kein Extra mehr, sondern die Erwartung. Das Baymard Institute stellt in seinem E-Commerce-Benchmark fest, dass 80 Prozent (Baymard Institute) der untersuchten Shops Suchvorschläge anbieten; bei der ersten Erhebung 2014 waren es bereits 72 Prozent (Baymard Institute). Wer das Suchfeld einmal mit Vorschlägen erlebt hat, liest jede Pause als Störung. Gleichzeitig ist die Autovervollständigung technisch eine der anspruchsvollsten Stellen im Shop: Sie verbindet Eingabeverarbeitung im Browser, eine Netzanfrage, eine Datenbank- oder Indexabfrage und das Rendern einer Liste - und das nicht einmal pro Seitenaufruf, sondern potenziell bei jedem Tastendruck.

Genau deshalb reicht der Blick auf die Ladezeit der Startseite hier nicht. Eine Shopsuche kann auf einer Seite mit gutem Largest Contentful Paint stecken und trotzdem träge wirken, weil ihre Zeit nicht beim Laden entsteht, sondern während der Nutzung. Wie sich solche Nutzungszeit in den Kennzahlen niederschlägt, ordnet unser Überblick zu den Core Web Vitals ein.

Die Suche ist Nutzungszeit, keine Ladezeit

Die meisten Performance-Maßnahmen zielen auf den ersten Aufbau der Seite. Suchvorschläge entstehen danach: Sie sind eine Kette von Interaktionen, deren Kosten sich mit jeder Eingabe wiederholen. Ein Shop kann im Labor glänzen und im Suchfeld trotzdem hängen. Darum wird die Suche als eigene Strecke gemessen - mit echter Eingabe, auf einem realistischen Gerät und über die gesamte Kette vom Tastendruck bis zur Liste.

Die Suchstrecke vom Tastendruck bis zur gezeichneten Liste

Zwischen dem Druck auf eine Taste und der fertigen Vorschlagsliste liegen drei Abschnitte, die unterschiedlich gemessen und unterschiedlich behoben werden. Der erste läuft im Hauptthread des Browsers: Das Eingabeereignis wird verarbeitet, das getippte Zeichen erscheint im Feld. Diese Strecke erfasst die Interaction to Next Paint. web.dev zählt das Drücken einer Taste auf einer physischen oder einer Bildschirmtastatur ausdrücklich zu den Interaktionen, die der INP bewertet, und nennt einen Wert von höchstens 200 Millisekunden (web.dev) als gute Reaktionsfähigkeit. Schwere Eingabe-Handler, synchrones Filtern großer Listen im Browser oder ein aufwendiges Neuzeichnen verlängern genau diesen Abschnitt. Wie sich der INP allgemein senken lässt, zeigt unser Beitrag INP optimieren.

Der zweite Abschnitt ist der Netzweg: Anfrage an den Server, Suche im Index oder in der Datenbank, Antwort zurück. Er erscheint nicht im INP des Tastendrucks, weil der Browser das getippte Zeichen längst gezeichnet hat, bevor die Antwort eintrifft. Für den Besucher zählt er trotzdem - er entscheidet, wann die Vorschläge erscheinen. Der dritte Abschnitt ist das Rendern der Liste, sobald die Antwort da ist. Er läuft wieder im Hauptthread, und wenn er lange dauert, blockiert er die nächste Eingabe: Der folgende Tastendruck muss warten, bis die Liste fertig ist, und diese Wartezeit geht als Eingabeverzögerung in die nächste Interaktion ein.

Als Zielwerte eignen sich die Wahrnehmungsgrenzen, die die Nielsen Norman Group beschreibt. Bis 0,1 Sekunden (Nielsen Norman Group) empfinden Menschen eine Reaktion als unmittelbar; eine besondere Rückmeldung ist dann nicht nötig, es genügt, das Ergebnis anzuzeigen. Bis 1,0 Sekunden (Nielsen Norman Group) bleibt der Gedankenfluss ununterbrochen, auch wenn die Verzögerung bemerkt wird. Für die Suche heißt das: Das getippte Zeichen gehört unter die erste Grenze, die Vorschlagsliste für den aktuellen Begriff unter die zweite. Alles, was darüber liegt, unterbricht den Besucher mitten in seiner Eingabe.

0,1 Sekunden sind etwa die Grenze, bis zu der Nutzer das Gefühl haben, dass das System unmittelbar reagiert - eine besondere Rückmeldung ist dann nicht nötig, es genügt, das Ergebnis anzuzeigen.

Nielsen Norman Group, Response Times: The 3 Important Limits (sinngemäß übersetzt)
AbschnittWas dort passiertTypische BremseMaßnahme
Eingabe im HauptthreadEreignis verarbeiten, Zeichen zeichnenSchwerer Eingabe-Handler, Filtern im BrowserHandler schlank halten, Arbeit verschieben
Netzweg und ServerAnfrage, Indexabfrage, AntwortAnfrage je Taste, ungecachte AbfrageEntprellen, Abbrechen, Präfix-Cache
Rendern der ListeTreffer in Markup umsetzen und zeichnenGroße Bilder, viele Knoten, Layout-SprüngeKurze Liste, feste Maße, Knoten wiederverwenden
Nächste EingabeFolgender Tastendruck wird verarbeitetListe blockiert noch den HauptthreadRendern aufteilen, dem Browser Luft lassen

Der Kern in einem Satz

Das Zeichen im Feld muss sofort stehen, die Liste darf kurz warten - aber nie so lange, dass sie einen Begriff zeigt, den niemand mehr tippt, und nie so schwer, dass sie den nächsten Tastendruck aufhält.

Entprellen: nicht jeder Tastendruck braucht eine Anfrage

Die häufigste Bremse ist zugleich die einfachste: Das Suchfeld schickt bei jedem Tastendruck eine Anfrage los. Wer einen längeren Begriff tippt, erzeugt so viele Anfragen, wie der Begriff Buchstaben hat - und fast alle davon beantworten eine Frage, die in dem Moment, in dem die Antwort eintrifft, niemand mehr stellt. Jede dieser Anfragen belegt eine Verbindung, einen Worker auf dem Server und am Ende Rechenzeit im Browser, wenn die Antwort verarbeitet wird. Bei Lastspitzen im Saisongeschäft wird aus dieser Verschwendung schnell ein Engpass für den ganzen Shop.

Entprellen, im Englischen debounce, löst das: Die Anfrage startet erst, wenn die Eingabe für einen kurzen Moment ruht. Tippt der Besucher zügig durch, entsteht eine Anfrage am Ende einer Tipp-Pause statt einer je Zeichen. Die Pause wird nicht geschätzt, sondern an der eigenen Messung eingestellt: lang genug, um schnelles Tippen zusammenzufassen, kurz genug, dass Pause, Serverantwort und Rendern zusammen unter der Grenze von 1,0 Sekunden (Nielsen Norman Group) bleiben. Dazu gehört eine Mindestlänge des Suchbegriffs. Ein einzelner Buchstabe liefert selten brauchbare Vorschläge, aber eine teure Abfrage mit riesiger Treffermenge - in Sortimenten mit kurzen Artikelnummern kann die Grenze dagegen niedriger liegen als in einem Modeshop.

Wichtig ist, was nicht entprellt wird: das Zeichnen des getippten Zeichens. Der Browser zeigt das Zeichen selbst an, sobald der Hauptthread frei ist. Wer im Eingabe-Handler dagegen synchron eine Liste filtert, Analyse-Ereignisse verschickt oder das halbe Suchmodul neu zeichnet, verlängert die Verarbeitungszeit jeder einzelnen Taste. Der Handler sollte nur den Wert entgegennehmen und den Zeitgeber neu starten - alles andere läuft später. Wie sich unvermeidbar lange Aufgaben aufteilen lassen, zeigt unser Beitrag zu scheduler.yield und langen Tasks.

suchfeld.js
const feld = document.querySelector('#suche');
const PAUSE_MS = 150;   // Startwert, an den eigenen Felddaten nachstellen
const MIN_ZEICHEN = 2;  // Startwert, je Sortiment prüfen
let zeitgeber;

// Der Handler nimmt nur den Wert entgegen und startet den Zeitgeber neu.
feld.addEventListener('input', () => {
  clearTimeout(zeitgeber);
  const begriff = feld.value.trim();
  if (begriff.length < MIN_ZEICHEN) {
    vorschlaegeLeeren();
    return;
  }
  zeitgeber = setTimeout(() => vorschlaegeLaden(begriff), PAUSE_MS);
});

Entprellen ersetzt keinen schnellen Server

Eine Tipp-Pause verringert die Zahl der Anfragen, aber nicht die Dauer der einzelnen. Ist die Serverantwort langsam, kommt die Liste mit Entprellen sogar später als ohne, weil zur Antwortzeit die Pause hinzukommt. Entprellen ist deshalb der erste Schritt, nicht der einzige: Erst zusammen mit einer schnellen, gecachten Antwort entsteht eine Liste, die unter der Ein-Sekunden-Grenze bleibt.

Überholte Anfragen abbrechen

Auch mit Entprellen laufen oft mehrere Anfragen gleichzeitig: Der Besucher tippt, stockt kurz, tippt weiter. Die Antworten kommen nicht zwingend in der Reihenfolge zurück, in der die Anfragen gestartet wurden. Braucht die Anfrage für einen kurzen Präfix länger - etwa weil sie mehr Treffer durchsucht -, trifft sie nach der Antwort für den längeren Begriff ein und überschreibt die richtige Liste mit einer veralteten. Der Besucher sieht Vorschläge für einen Begriff, den er gar nicht mehr eingegeben hat, und der Browser hat eine ganze Liste umsonst gerendert.

Die Lösung liefert der Browser mit: Ein AbortController kann eine oder mehrere laufende Anfragen jederzeit abbrechen (MDN). Jede neue Suche bricht die vorige ab, bevor sie selbst startet. Die abgebrochene Anfrage liefert keine Antwort mehr, die gerendert werden müsste. Zusätzlich lohnt ein einfacher Abgleich: Vor dem Rendern prüft der Code, ob die Antwort noch zum aktuellen Feldinhalt passt. Beides zusammen verhindert das Flackern zwischen alten und neuen Vorschlägen und spart dem Hauptthread genau die Renderarbeit, die sonst die nächste Taste aufhalten würde.

vorschlaege.js
let laufend;

async function vorschlaegeLaden(begriff) {
  laufend?.abort();                     // überholte Anfrage abbrechen
  laufend = new AbortController();
  try {
    const antwort = await fetch(
      `/api/vorschlaege?q=${encodeURIComponent(begriff)}`,
      { signal: laufend.signal }
    );
    const daten = await antwort.json();
    // Nur rendern, wenn der Begriff noch im Feld steht
    if (begriff === feld.value.trim()) listeZeichnen(daten);
  } catch (fehler) {
    if (fehler.name !== 'AbortError') throw fehler;
  }
}

Eine Grenze hat der Abbruch: Er beendet die Anfrage aus Sicht des Browsers, nicht zwingend die Arbeit auf dem Server. Ob eine bereits gestartete Datenbankabfrage abbricht, hängt vom Backend ab; oft läuft sie zu Ende, und ihr Ergebnis wird verworfen. Deshalb bleibt der Server-Abschnitt eine eigene Baustelle. Der Abbruch spart Rendering und Bandbreite, das Entprellen spart Anfragen, und erst der Cache spart Rechenzeit auf dem Server.

Die Serverseite: häufige Präfixe aus dem Cache

Suchbegriffe verteilen sich nicht gleichmäßig. Die Anfänge von Begriffen - die Präfixe - wiederholen sich über alle Besucher hinweg zwangsläufig öfter als ganze Begriffe: Jeder vollständige Begriff beginnt mit seinen Präfixen, und viele verschiedene Begriffe teilen sich denselben Anfang. Genau diese Anfragen sind oft die teuersten, weil kurze Präfixe die größten Treffermengen erzeugen. Und genau sie lassen sich am besten zwischenspeichern, weil ihre Antwort für alle Besucher mit gleichem Kontext identisch ist.

Ein Antwort-Cache für Suchvorschläge braucht einen sauberen Schlüssel. Der Suchbegriff wird vorher normalisiert: Leerzeichen am Rand entfernen, Groß- und Kleinschreibung vereinheitlichen, Unicode-Schreibweisen angleichen. Sonst landen Varianten desselben Präfixes als getrennte Einträge im Cache, und die Trefferquote sinkt. In den Schlüssel gehört alles, was die Antwort tatsächlich verändert - Verkaufskanal, Sprache, Währung und im B2B-Portal die Kundengruppe, wenn Vorschläge Preise oder kundenspezifische Sortimente zeigen. Nicht hinein gehören Sitzungskennungen oder Tracking-Parameter: Sie machen jeden Eintrag einmalig. Wie ein einziges Cookie die Trefferquote zerlegt, beschreibt unser Beitrag zu Cookies, Vary und Cache-Fragmentierung.

Für die Anfragen, die am Cache vorbeigehen, zählt die Abfrage selbst. Ein gewöhnlicher B-Tree-Index hilft einer Mustersuche nur, wenn das Muster am Anfang der Zeichenkette verankert ist - also bei LIKE 'bohr%', nicht bei LIKE '%hammer' (PostgreSQL-Dokumentation). Ohne nutzbaren Index bleibt der Datenbank meist nur, die Tabelle Zeile für Zeile zu durchsuchen. Eine Präfixsuche oder ein eigener Suchindex mit vorberechneten Wortanfängen beantwortet dieselbe Frage mit einem Bruchteil der Arbeit. Welche Abfragen in einem Shop die meiste Zeit kosten, zeigt der Beitrag zur Datenbank-Query-Optimierung; wie viel davon auf eine einzelne Suchanfrage entfällt, macht ein Antwortkopf sichtbar, den wir im Beitrag zu Server-Timing beschreiben.

Präfix-Cache mit kurzer Lebensdauer

Häufige Präfixe werden als fertige Antwort zwischengespeichert. Eine kurze Lebensdauer hält Bestand und Preise aktuell, ohne dass jede Eingabe die Datenbank erreicht.

Normalisierter Schlüssel

Rand-Leerzeichen, Groß- und Kleinschreibung und Unicode-Varianten werden vor dem Nachschlagen vereinheitlicht. Kanal, Sprache und Kundengruppe gehören in den Schlüssel, Sitzungsdaten nicht.

Schlanke Antwort

Der Endpunkt liefert nur, was die Liste zeigt: Name, Adresse, kleines Vorschaubild und bei Bedarf den Preis. Keine vollständigen Produktobjekte und keine Fragmente mit eingebetteten Skripten.

Den Cache vorwärmen, bevor der Besucher tippt

Häufige Präfixe lassen sich aus den eigenen Suchprotokollen bestimmen und nach jedem Import oder Preislauf gezielt neu befüllen. Dann trifft schon die erste Anfrage nach einer Aktualisierung einen warmen Cache. Liegt der Suchendpunkt auf einer eigenen Domain, kann der Browser die Verbindung schon aufbauen, sobald das Suchfeld den Fokus bekommt. Welche Cache-Schicht wofür taugt, ordnen unsere Caching-Strategien ein.

Die Vorschlagsliste schlank rendern

Ist die Antwort da, beginnt der dritte Abschnitt. Die Vorschlagsliste ist ein kleines Stück Oberfläche, das in kurzer Folge immer wieder neu entsteht - und deshalb zählt jedes Element darin. Eine Liste mit großen Produktbildern, ausführlichen Preisblöcken, Bewertungssternen und eigenen Skripten je Eintrag muss bei jeder Aktualisierung neu aufgebaut, gelayoutet und gezeichnet werden. Läuft das in einer einzigen langen Aufgabe, wartet der nächste Tastendruck, bis sie fertig ist.

Die wirksamsten Maßnahmen sind unspektakulär. Die Zahl der Einträge begrenzen: Eine kurze Liste ist schneller gezeichnet und leichter zu überblicken als eine lange; wer mehr sehen will, landet ohnehin auf der Ergebnisseite. Vorschaubilder klein ausliefern - in der Größe, in der sie angezeigt werden, in einem modernen Format und mit festen Abmessungen, damit die Liste beim Nachladen nicht springt. Bestehende Knoten wiederverwenden, statt die ganze Liste bei jeder Antwort zu verwerfen und neu anzulegen. Und alles, was nicht sofort sichtbar sein muss, etwa Lagerbestand oder Staffelpreise, erst auf der Produktseite laden. Warum jeder zusätzliche Knoten zählt, beschreibt unser Beitrag zur DOM-Größe.

Zur schlanken Liste gehört die Bedienung mit der Tastatur. Pfeiltasten, Eingabetaste und Escape sind ebenfalls Tastendrücke, die der INP bewertet. Wer beim Wechsel der Markierung die ganze Liste neu rendert, statt nur die Markierung zu verschieben, verlängert jede dieser Interaktionen. Die passende Auszeichnung - ein Eingabefeld mit der Rolle combobox, eine Liste mit der Rolle listbox und aria-activedescendant für den markierten Eintrag - hilft Screenreadern und kostet keine zusätzliche Renderzeit. Muss doch viel gezeichnet werden, hilft es, das Rendern in kleinere Aufgaben zu teilen, damit eine wartende Eingabe dazwischen verarbeitet werden kann.

Wenige Einträge

Eine kurze, gut sortierte Liste ist schneller gezeichnet und schneller erfasst. Mehr Treffer gehören auf die Ergebnisseite, nicht in das Aufklappmenü.

Kleine Bilder mit festen Maßen

Vorschaubilder in Anzeigegröße und modernem Format, mit Breite und Höhe im Markup. So springt die Liste nicht, wenn die Bilder nachkommen.

Knoten wiederverwenden

Einträge aktualisieren statt verwerfen: Text und Bild tauschen, die Struktur behalten. Das spart Stil- und Layoutberechnung bei jeder Antwort.

Merksatz für die Liste

Die Vorschlagsliste ist kein kleiner Katalog, sondern ein Wegweiser: so wenig wie möglich zeichnen und den Besucher so schnell wie möglich zur richtigen Seite führen.

Suchseiten messen, die im Lighthouse-Lauf fehlen

Übliche Lighthouse-Läufe laden eine Adresse, warten, bis die Seite ruhig ist, und bewerten den Aufbau. Getippt wird dabei nicht. Die Autovervollständigung wird so nie ausgelöst, und die Ergebnisseite der Suche steht meist gar nicht auf der Liste der geprüften Adressen, weil sie erst durch eine Eingabe entsteht. Ein Shop kann dadurch in jedem Bericht gut aussehen, während sein Einstieg mit der klarsten Kaufabsicht ungemessen bleibt. Wie sich Lighthouse-Ergebnisse einordnen lassen, zeigt der Beitrag zum Lighthouse-Report.

Für die Suche braucht es drei Blickwinkel. Im Labor analysiert Lighthouse im Zeitraum-Modus einen frei gewählten Zeitraum, der typischerweise Nutzerinteraktionen enthält - etwa das Tippen ins Suchfeld und das Absenden der Suche - und misst darin Layoutverschiebungen und JavaScript-Ausführungszeit (Lighthouse-Dokumentation). Das Leistungsfeld der Entwicklertools zeigt jede einzelne Taste mit Eingabeverzögerung, Verarbeitungszeit und Darstellungsverzögerung; mit gedrosselter CPU kommt das einem Mittelklasse-Smartphone näher als der Arbeitsrechner. Im Feld liefern RUM-Daten den echten INP, und wenn jede Interaktion ihr auslösendes Element mitschreibt, lässt er sich auf das Suchfeld filtern. Was Felddaten leisten und wo CrUX aufhört, vergleicht unser Beitrag zu RUM und CrUX.

Den Netzweg misst man getrennt: Wie viele Anfragen erzeugt ein typischer Suchbegriff, wie lange dauert jede, wie viele werden abgebrochen, und welche Präfixe verfehlen den Cache? Die Resource-Timing-Daten des Browsers und ein Server-Timing-Kopf am Suchendpunkt beantworten das ohne Zusatzwerkzeug. Die Ergebnisseite selbst gehört mit einer typischen Suchadresse in jede Messreihe - als eigene Vorlage, so wie Kategorie- und Produktseite. Warum die Startseite allein nie reicht, erklärt der Beitrag Vorlage statt Startseite.

  1. Typische Suchbegriffe festlegen: eine Artikelnummer, einen Markennamen, einen allgemeinen Begriff
  2. Im Zeitraum-Modus jeden Begriff in normalem Tempo tippen, einen Vorschlag auswählen und die Ergebnisseite öffnen
  3. Mit gedrosselter CPU wiederholen und je Taste Eingabeverzögerung, Verarbeitung und Darstellung festhalten
  4. Im Netzwerkfeld die Anfragen je Begriff zählen und Dauer sowie abgebrochene Anfragen notieren
  5. Server-Timing am Suchendpunkt auslesen: Cache-Treffer oder Datenbankabfrage?
  6. Im Feld den INP nach Zielelement filtern und das Suchfeld getrennt vom Rest der Seite auswerten
  7. Die Ergebnisseite mit einer echten Suchadresse in die regelmäßige Messreihe aufnehmen

Der Umsetzungspfad in der Praxis

Eine schnelle Shopsuche entsteht nicht durch einen einzelnen Kniff, sondern durch die Abstimmung aller drei Abschnitte. Der verlässliche Weg beginnt mit der Messung: Wo verliert die Strecke Zeit - im Eingabe-Handler, auf dem Server oder beim Rendern der Liste? Erst dann wird entschieden, ob zuerst die Anfragen reduziert, die Antworten gecacht oder die Liste verschlankt werden. In Shopware-Shops, in eigenen Storefronts und in B2B-Portalen sind die Hebel dieselben, nur ihre Reihenfolge unterscheidet sich.

  • Die Suchstrecke messen: Eingabe im Hauptthread, Netzweg und Rendern der Liste getrennt
  • Den Eingabe-Handler schlank halten - nur Wert übernehmen und Zeitgeber neu starten
  • Anfragen entprellen und eine Mindestlänge für Suchbegriffe festlegen
  • Jede überholte Anfrage per AbortController abbrechen und veraltete Antworten verwerfen
  • Häufige Präfixe mit normalisiertem Schlüssel cachen - Kanal, Sprache und Kundengruppe im Schlüssel
  • Die Abfrage selbst prüfen: Präfixsuche oder eigener Index statt Platzhalter am Wortanfang
  • Die Liste kurz halten, Bilder klein und mit festen Maßen, Knoten wiederverwenden
  • Suchfeld und Ergebnisseite in Labor- und Feldmessung aufnehmen

Diese Kette setzen wir in der Shopware-Performance und in eigenen Shop-Systemen um - vom Eingabe-Handler über den Suchendpunkt bis zur Liste. Wo die Serverantwort der Engpass ist, beginnt die Arbeit bei der Server-Optimierung; für Portale mit Kundengruppen und Staffelpreisen gelten die Besonderheiten der PageSpeed-Optimierung für B2B-Portale. Und welcher Abschnitt Ihrer Suche tatsächlich bremst, zeigt eine strukturierte Performance-Analyse, bevor eine einzige Zeile geändert wird.

Quellen und Studien

Dieser Artikel basiert auf Daten aus: Baymard Institute (Autocomplete Design), Nielsen Norman Group (Response Times: The 3 Important Limits), web.dev (Interaction to Next Paint), MDN Web Docs (AbortController), PostgreSQL-Dokumentation (Index Types) sowie Lighthouse-Dokumentation (User Flows in Lighthouse). Alle genannten Statistiken wurden zum Zeitpunkt der Veröffentlichung geprüft.

Verwandte Artikel

Frontend-Optimierung

Speicherlecks im Frontend: wenn die Seite träge wird

Die Oberfläche startet schnell und wird nach zwanzig Minuten zäh: wie Speicherlecks im Frontend entstehen, wie man sie im Verlauf misst und wieder loswird.

12 Min. Lesezeit
Core Web Vitals & Messung

Web Worker: Main-Thread entlasten und INP verbessern

Rechenintensives JavaScript in einen Web Worker auslagern hält den Main-Thread frei, senkt die Total Blocking Time und bringt INP unter die 200-ms-Schwelle.

12 Min. Lesezeit
Core Web Vitals & Messung

Lange Tasks aufteilen: INP mit scheduler.yield senken

Lange JavaScript-Tasks über 50 ms mit scheduler.yield() in Häppchen zerlegen, den Hauptthread zwischen den Chunks freigeben und den INP unter 200 ms halten.

12 Min. Lesezeit