Wählen Sie ein JavaScript-Framework? Unser Leitfaden vergleicht React, Angular, Vue, Svelte, Qwik und SolidJS hinsichtlich Bundle-Größe, Performance und Funktionen. Treffen Sie eine fundierte Entscheidung.
Performance von JavaScript-Frameworks: Ein detaillierter Einblick in Bundle-Größe vs. Funktionen
In der dynamischen Welt der Webentwicklung ist die Wahl eines JavaScript-Frameworks eine der folgenreichsten Entscheidungen, die ein Team treffen kann. Sie bestimmt nicht nur die Entwicklererfahrung und die Projektarchitektur, sondern entscheidend auch das Erlebnis des Endbenutzers. Heutzutage erwarten Benutzer, dass Webanwendungen blitzschnell, interaktiv und funktionsreich sind. Diese Erwartung stellt Entwickler vor einen Scheideweg, bei dem sie die inhärente Spannung zwischen robuster Funktionalität und schlanker, hochperformanter Auslieferung navigieren müssen.
Dies ist das zentrale Dilemma: Wählt man ein Framework voller Funktionen, das die Entwicklung beschleunigt, aber potenziell die finale Anwendung aufbläht? Oder entscheidet man sich für eine minimalistische Bibliothek, die eine winzige Bundle-Größe verspricht, aber mehr manuelle Einrichtung und Integration erfordert? Die Antwort ist, wie so oft in der Technik, nuanciert. Es geht nicht darum, das einzig „beste“ Framework zu finden, sondern die Kompromisse zu verstehen und das richtige Werkzeug für die jeweilige Aufgabe auszuwählen.
Dieser umfassende Leitfaden wird diese komplexe Beziehung analysieren. Wir werden über vereinfachte „Hello, World!“-Vergleiche hinausgehen, um zu untersuchen, wie führende JavaScript-Frameworks – von etablierten Giganten wie React und Angular bis hin zu innovativen Herausforderern wie Svelte, Qwik und SolidJS – Funktionen gegen Performance abwägen. Wir werden zentrale Leistungsmetriken analysieren, Architekturphilosophien vergleichen und einen praktischen Rahmen bereitstellen, der Ihnen hilft, eine fundierte Entscheidung für Ihr nächstes globales Webprojekt zu treffen.
Die Kernmetriken verstehen: Was ist „Performance“?
Bevor wir Frameworks vergleichen, müssen wir zunächst eine gemeinsame Sprache für Performance etablieren. Wenn wir im Kontext von Webanwendungen über Performance sprechen, geht es uns hauptsächlich darum, wie schnell ein Benutzer eine Seite wahrnehmen, mit ihr interagieren und einen Nutzen daraus ziehen kann.
Bundle-Größe: Das Fundament der Performance
Die Bundle-Größe bezieht sich auf die Gesamtgröße aller JavaScript-, CSS- und sonstigen Assets, die ein Browser herunterladen, parsen und ausführen muss, um eine Anwendung zu rendern. Sie ist der erste und oft bedeutendste Performance-Engpass.
- Download-Zeit: Ein größeres Bundle benötigt länger zum Herunterladen, insbesondere in langsameren mobilen Netzwerken, die in vielen Teilen der Welt verbreitet sind. Dies wirkt sich direkt darauf aus, wie schnell ein Benutzer etwas auf seinem Bildschirm sieht.
- Parse- & Kompilierzeit: Nach dem Herunterladen muss die JavaScript-Engine des Browsers den Code parsen und kompilieren. Mehr Code bedeutet mehr Verarbeitungszeit auf dem Gerät, was besonders auf leistungsschwachen Smartphones eine Belastung sein kann.
- Ausführungszeit: Schließlich wird der Code ausgeführt. Eine große Framework-Runtime kann während der Initialisierung erhebliche Zeit auf dem Hauptthread beanspruchen und verzögern, wann die Anwendung interaktiv wird.
Es ist wichtig, die gzipped-Größe zu berücksichtigen, da dies die über das Netzwerk übertragene Datenmenge ist. Die unkomprimierte Größe ist jedoch ebenfalls relevant, da der Browser den vollständigen Code dekomprimieren und verarbeiten muss.
Key Performance Indicators (KPIs)
Die Bundle-Größe ist ein Mittel zum Zweck. Das ultimative Ziel ist die Verbesserung der vom Benutzer wahrgenommenen Performance, die oft durch Googles Core Web Vitals und andere verwandte Metriken gemessen wird:
- First Contentful Paint (FCP): Misst die Zeit vom Beginn des Ladevorgangs der Seite bis zum Rendern eines beliebigen Teils des Seiteninhalts auf dem Bildschirm. Ein kleines initiales Bundle ist der Schlüssel zu einem schnellen FCP.
- Largest Contentful Paint (LCP): Misst die Zeit, die benötigt wird, um das größte Bild oder den größten Textblock, der im sichtbaren Bereich sichtbar ist, zu rendern. Es ist ein wichtiger Indikator für die wahrgenommene Ladegeschwindigkeit.
- Time to Interactive (TTI): Misst die Zeit vom Beginn des Ladevorgangs der Seite, bis sie visuell gerendert ist, ihre initialen Skripte geladen sind und sie zuverlässig in der Lage ist, schnell auf Benutzereingaben zu reagieren. Hier machen sich die Kosten eines großen JavaScript-Frameworks oft am stärksten bemerkbar.
- Total Blocking Time (TBT): Misst die Gesamtzeit, in der der Hauptthread blockiert war und die Verarbeitung von Benutzereingaben verhinderte. Lange JavaScript-Aufgaben sind die Hauptursache für eine hohe TBT.
Die Kandidaten: Ein übergeordneter Funktionsvergleich
Lassen Sie uns die Philosophien und Funktionssätze einiger der beliebtesten und innovativsten Frameworks untersuchen. Jedes trifft unterschiedliche Architekturentscheidungen, die sowohl seine Fähigkeiten als auch sein Leistungsprofil beeinflussen.
React: Die allgegenwärtige Bibliothek
Entwickelt und gepflegt von Meta, ist React kein Framework, sondern eine Bibliothek zur Erstellung von Benutzeroberflächen. Ihre Kernphilosophie basiert auf Komponenten, JSX (einer Syntaxerweiterung für JavaScript) und einem Virtuellen DOM (VDOM).
- Funktionen: Der Kern von React ist bewusst schlank gehalten. Er konzentriert sich ausschließlich auf die View-Schicht. Funktionen wie Routing (React Router), Zustandsmanagement (Redux, Zustand, MobX) und Formularbehandlung (Formik, React Hook Form) werden durch ein riesiges und ausgereiftes Drittanbieter-Ökosystem bereitgestellt.
- Performance-Aspekt: Das VDOM ist eine Performance-Optimierung, die DOM-Updates bündelt, um teure direkte Manipulationen zu minimieren. Die Runtime von React, die den VDOM-Diffing-Algorithmus und das Komponenten-Lebenszyklusmanagement umfasst, trägt jedoch zur grundlegenden Bundle-Größe bei. Die Performance hängt oft stark davon ab, wie Entwickler den Zustand verwalten und Komponenten strukturieren.
- Am besten geeignet für: Projekte, bei denen Flexibilität und der Zugang zu einem massiven Ökosystem von Bibliotheken und Entwicklern von größter Bedeutung sind. Es treibt alles an, von Single-Page-Anwendungen bis hin zu großen Unternehmensplattformen mit Meta-Frameworks wie Next.js.
Angular: Das Framework für Unternehmen
Gepflegt von Google, ist Angular ein komplettes „Batteries-included“-Framework. Es ist mit TypeScript gebaut und bietet eine stark meinungsbildende Struktur für den Aufbau großer, skalierbarer Anwendungen.
- Funktionen: Angular wird mit fast allem geliefert, was man braucht: einer leistungsstarken Befehlszeilenschnittstelle (CLI), einem ausgeklügelten Router, einem HTTP-Client, robuster Formularverwaltung und integriertem Zustandsmanagement mit RxJS. Die Verwendung von Dependency Injection und Modulen fördert eine gut organisierte Architektur.
- Performance-Aspekt: In der Vergangenheit war Angular aufgrund seiner umfassenden Natur für größere Bundle-Größen bekannt. Sein moderner Compiler, Ivy, hat jedoch erhebliche Fortschritte im Tree-Shaking (Eliminierung von ungenutztem Code) gemacht, was zu viel kleineren Bundles führt. Die Ahead-of-Time (AOT) Kompilierung verbessert ebenfalls die Laufzeitleistung.
- Am besten geeignet für: Große Unternehmensanwendungen, bei denen Konsistenz, Wartbarkeit und ein standardisiertes Toolset für ein großes Team entscheidend sind.
Vue: Das progressive Framework
Vue ist ein unabhängiges, von der Community getragenes Framework, das für seine Zugänglichkeit und sanfte Lernkurve bekannt ist. Es bezeichnet sich selbst als „Das progressive Framework“, da es schrittweise übernommen werden kann.
- Funktionen: Vue bietet das Beste aus beiden Welten. Sein Kern konzentriert sich auf die View-Schicht, aber sein offizielles Ökosystem bietet gut integrierte Lösungen für Routing (Vue Router) und Zustandsmanagement (Pinia). Seine Single-File Components (SFCs) mit `.vue`-Dateien werden sehr für die gemeinsame Organisation von HTML, JavaScript und CSS gelobt. Die Wahl zwischen seiner klassischen Options API und der neueren, flexibleren Composition API spricht verschiedene Entwicklungsstile an.
- Performance-Aspekt: Vue verwendet ein VDOM ähnlich wie React, aber mit vom Compiler unterstützten Optimierungen, die es in bestimmten Szenarien schneller machen können. Es ist im Allgemeinen sehr leichtgewichtig und liefert von Haus aus eine hervorragende Leistung.
- Am besten geeignet für: Eine breite Palette von Projekten, von kleinen Widgets bis hin zu großen SPAs. Seine Flexibilität und exzellente Dokumentation machen es zu einem Favoriten für Start-ups und Teams, die Wert auf Entwicklerproduktivität legen.
Svelte: Das verschwindende Framework
Svelte weicht radikal von den auf einer Runtime basierenden Modellen von React, Angular und Vue ab. Svelte ist ein Compiler, der zur Build-Zeit ausgeführt wird.
- Funktionen: Svelte-Code sieht aus wie Standard-HTML, -CSS und -JavaScript, jedoch mit einigen Erweiterungen für die Reaktivität. Es bietet integriertes Zustandsmanagement, standardmäßig bereichsbezogenes Styling und einfach zu bedienende Animations- und Übergangs-APIs.
- Performance-Aspekt: Dies ist das Hauptverkaufsargument von Svelte. Da es ein Compiler ist, liefert es keine Framework-Runtime an den Browser aus. Stattdessen kompiliert es Ihre Komponenten in hochoptimiertes, imperatives JavaScript, das das DOM direkt manipuliert. Dies führt zu unglaublich kleinen Bundle-Größen und blitzschneller Laufzeitleistung, da es keinen VDOM-Overhead gibt.
- Am besten geeignet für: Performance-kritische Projekte, interaktive Visualisierungen, eingebettete Widgets oder jede Anwendung, bei der ein minimaler Fußabdruck unerlässlich ist. Sein Meta-Framework, SvelteKit, macht es auch zu einem starken Anwärter für Full-Stack-Anwendungen.
Die neue Welle: SolidJS und Qwik
Zwei neuere Frameworks verschieben die Grenzen der Web-Performance noch weiter, indem sie grundlegende Konzepte neu denken.
- SolidJS: Übernimmt React-ähnliches JSX und ein Komponentenmodell, eliminiert aber das VDOM vollständig. Es verwendet ein Konzept namens feingranulare Reaktivität. Komponenten werden nur einmal ausgeführt, und reaktive Primitive (ähnlich wie Signale) erstellen einen Graphen von Abhängigkeiten. Wenn sich der Zustand ändert, werden nur die spezifischen DOM-Knoten, die von diesem Zustand abhängen, chirurgisch und sofort aktualisiert. Dies führt zu einer Leistung, die mit der von reinem JavaScript konkurriert.
- Qwik: Konzentriert sich auf die Lösung des TTI-Problems durch ein Konzept namens Resumability (Wiederaufnehmbarkeit). Anstatt Code auf dem Client erneut auszuführen, um eine serverseitig gerenderte Seite interaktiv zu machen (ein Prozess namens Hydration), pausiert Qwik die Ausführung auf dem Server und setzt sie auf dem Client erst dann fort, wenn der Benutzer mit einer Komponente interagiert. Es serialisiert den gesamten Anwendungs- und Framework-Zustand in das HTML. Das Ergebnis ist ein nahezu sofortiger TTI, unabhängig von der Komplexität der Anwendung, da beim Laden der Seite praktisch kein JavaScript ausgeführt wird.
Der Showdown: Bundle-Größe vs. Leistungsdaten
Obwohl sich die genauen Zahlen mit jeder Version ändern, können wir die allgemeinen Trends bei der Bundle-Größe und der Leistung basierend auf der Architektur jedes Frameworks analysieren.
Szenario 1: Die „Hello, World“-App
Für eine minimale, nicht-interaktive Anwendung werden die Frameworks, die als Compiler fungieren oder minimale Runtimes haben, immer den kleinsten Fußabdruck haben.
- Gewinner: Svelte und SolidJS werden die kleinsten Bundles produzieren, oft nur wenige Kilobytes. Ihre Ausgabe kommt handgeschriebenem, reinem JavaScript nahe.
- Mittelfeld: Vue und React (mit ReactDOM) haben größere Basis-Runtimes. Ihr anfängliches Bundle wird merklich größer sein als das von Svelte, aber immer noch relativ klein und handhabbar.
- Größtes initiales Bundle: Angular hat aufgrund seiner umfassenden Natur und der Einbeziehung von Funktionen wie Zone.js für die Änderungs-Erkennung typischerweise die größte anfängliche Bundle-Größe, obwohl moderne Versionen diese stark reduziert haben. Qwiks anfänglicher Payload ist ebenfalls klein, da sein Ziel darin besteht, minimales JavaScript auszuliefern.
Szenario 2: Die reale Anwendung
Hier wird der Vergleich interessanter. Eine reale Anwendung hat Routing, Zustandsmanagement, Datenabruf, Animationen und Dutzende von Komponenten.
- Reacts Skalierung: Die Größe einer React-Anwendung wächst mit jeder hinzugefügten Drittanbieter-Bibliothek. Eine einfache App mit `react`, `react-dom`, `react-router` und `redux` kann schnell die anfängliche Größe einer Angular-Anwendung übertreffen. Effektives Code-Splitting und Tree-Shaking sind entscheidend.
- Angulas Skalierung: Da Angular die meisten notwendigen Funktionen enthält, skaliert seine Bundle-Größe vorhersehbarer. Wenn Sie mehr eigene Komponenten hinzufügen, ist der inkrementelle Größenanstieg oft geringer, da das Kern-Framework bereits geladen ist. Sein CLI ist auch stark für das Code-Splitting von Routen optimiert.
- Sveltes & Solids Skalierung: Diese Frameworks behalten ihren Vorteil, wenn eine Anwendung wächst. Da es keine monolithische Runtime gibt, zahlen Sie nur für die Funktionen, die Sie verwenden. Jede Komponente wird zu effizientem, eigenständigem Code kompiliert.
- Qwiks einzigartiges Angebot: Die Skalierung der Bundle-Größe von Qwik ist ein anderes Paradigma. Der anfängliche JavaScript-Payload bleibt winzig und konstant, unabhängig von der Größe der Anwendung. Der Rest des Codes wird in winzige Chunks zerlegt, die bei Bedarf nachgeladen werden, wenn der Benutzer mit der Seite interagiert. Dies ist ein revolutionärer Ansatz zur Verwaltung der Performance in riesigen Anwendungen.
Jenseits der Bundle-Größe: Die Nuancen der Performance
Ein kleines Bundle ist ein großartiger Anfang, aber es ist nicht die ganze Geschichte. Die Architekturmuster eines Frameworks haben einen tiefgreifenden Einfluss auf die Laufzeitleistung und Interaktivität.
Hydration vs. Resumability
Dies ist einer der wichtigsten modernen Unterscheidungsmerkmale. Die meisten Frameworks verwenden Hydration, um serverseitig gerenderte (SSR) Anwendungen interaktiv zu machen.
Der Hydration-Prozess (React, Vue, Angular): 1. Der Server sendet statisches HTML an den Browser für einen schnellen FCP. 2. Der Browser lädt das gesamte JavaScript für die Seite herunter. 3. Das Framework führt den Komponentencode im Browser erneut aus, um eine virtuelle Darstellung des DOM zu erstellen. 4. Es fügt dann Event-Listener hinzu und macht die Seite interaktiv. Das Problem? Es gibt ein „Uncanny Valley“ zwischen dem FCP (wenn die Seite bereit aussieht) und dem TTI (wenn sie es tatsächlich ist). Auf komplexen Seiten kann dieser Hydration-Prozess den Hauptthread für Sekunden blockieren und die Seite nicht ansprechbar machen.
Der Resumability-Prozess (Qwik): 1. Der Server sendet statisches HTML, das serialisierten Zustand und Informationen über Event-Listener enthält. 2. Der Browser lädt ein winziges (~1KB) Qwik-Loader-Skript herunter. 3. Die Seite ist sofort interaktiv. Wenn ein Benutzer auf einen Button klickt, lädt und führt der Qwik-Loader nur den spezifischen Code für den Klick-Handler dieses Buttons aus. Resumability zielt darauf ab, den Hydration-Schritt vollständig zu eliminieren, was zu einem O(1) TTI führt – was bedeutet, dass sich der TTI nicht verschlechtert, wenn die Anwendung an Komplexität gewinnt.
Virtuelles DOM vs. Compiler vs. Feingranulare Reaktivität
Wie ein Framework die Ansicht nach einer Zustandsänderung aktualisiert, ist ein weiterer wichtiger Leistungsfaktor.
- Virtuelles DOM (React, Vue): Effizient, aber immer noch mit dem Overhead verbunden, einen virtuellen Baum zu erstellen und ihn bei jeder Zustandsänderung mit dem vorherigen zu vergleichen (Diffing).
- Compiler (Svelte): Kein Runtime-Overhead. Der Compiler generiert Code, der sagt: „Wenn sich dieser spezifische Wert ändert, aktualisiere dieses spezifische Stück des DOM.“ Das ist hocheffizient.
- Feingranulare Reaktivität (SolidJS): Potenziell am schnellsten. Es erstellt eine direkte Eins-zu-eins-Zuordnung zwischen einem reaktiven Zustandsteil und den DOM-Elementen, die davon abhängen. Es gibt kein Diffing und kein erneutes Ausführen ganzer Komponenten.
Die richtige Wahl treffen: Ein praktischer Entscheidungsrahmen
Die Wahl eines Frameworks erfordert die Abwägung von technischen Vorzügen mit Projektanforderungen und Teamdynamik. Stellen Sie sich diese Fragen:
1. Was ist das primäre Performance-Ziel?
- Schnellstmöglicher TTI ist entscheidend (z.B. E-Commerce, Landing Pages): Qwik ist architektonisch darauf ausgelegt, dieses Problem besser als jeder andere zu lösen. Frameworks mit exzellenter SSR/SSG-Unterstützung durch Meta-Frameworks wie Next.js (React), Nuxt (Vue) und SvelteKit sind ebenfalls starke Wahlmöglichkeiten.
- Minimale Bundle-Größe ist von größter Bedeutung (z.B. eingebettete Widgets, mobiles Web): Svelte und SolidJS sind hier die unangefochtenen Champions. Ihr Compiler-First-Ansatz gewährleistet den kleinstmöglichen Fußabdruck.
- Komplexe, langlebige Anwendungen (z.B. Dashboards, SaaS): Hier ist die Laufzeitleistung für häufige Aktualisierungen wichtiger. Die feingranulare Reaktivität von SolidJS glänzt hier. React und Vue haben ebenfalls hochoptimierte VDOM-Implementierungen, die sehr gut performen.
2. Was sind Umfang und Komplexität des Projekts?
- Große Unternehmensanwendungen: Angulas meinungsbildende Struktur, TypeScript-Integration und eingebaute Funktionen bieten eine stabile, konsistente Grundlage für große Teams und langfristige Wartung. React, gekoppelt mit einer strengen Architektur und einem Typsystem, ist ebenfalls eine sehr verbreitete und erfolgreiche Wahl.
- Mittelgroße Projekte & Start-ups: Vue, React und SvelteKit bieten eine hervorragende Balance aus Entwicklerproduktivität, Flexibilität und Leistung. Sie ermöglichen es Teams, sich schnell zu bewegen, ohne übermäßig einschränkend zu sein.
- Micro-Frontends oder einzelne Komponenten: Svelte oder SolidJS sind perfekt für den Bau isolierter, hochperformanter Komponenten, die mit minimalem Overhead in jede größere Anwendung integriert werden können.
3. Was ist die Expertise Ihres Teams und wie sieht der Arbeitsmarkt aus?
Dies ist oft die praktischste Überlegung. Der bei weitem größte Talentpool besteht für React. Die Wahl von React bedeutet einfacheres Einstellen und Zugang zu einem beispiellosen Reichtum an Tutorials, Bibliotheken und Community-Wissen. Vue hat ebenfalls eine sehr starke und wachsende globale Community. Während Angulas Popularität leicht nachgelassen hat, bleibt es eine dominierende Kraft im Unternehmenssektor. Svelte, SolidJS und Qwik haben leidenschaftliche, wachsende Communities, aber der Talentpool ist kleiner.
4. Wie wichtig ist das Ökosystem?
Ein Framework ist mehr als nur seine Kernbibliothek. Berücksichtigen Sie die Verfügbarkeit von hochwertigen Komponentenbibliotheken, Lösungen für das Zustandsmanagement, Test-Utilities und Entwicklerwerkzeugen. Das Ökosystem von React ist unübertroffen. Das von Angular ist kuratiert und umfassend. Das von Vue ist robust und gut integriert. Die Ökosysteme für die neueren Frameworks entwickeln sich schnell, sind aber noch nicht so ausgereift.
Die Zukunft der JavaScript-Frameworks
Die Branche tendiert eindeutig zu Lösungen, die die Menge an JavaScript, die an den Client gesendet und von ihm ausgeführt wird, minimieren. Mehrere Schlüsselthemen zeichnen sich ab:
- Der Aufstieg des Compilers: Svelte hat die Lebensfähigkeit des Compiler-als-Framework-Modells bewiesen, und diese Idee beeinflusst andere Projekte.
- Server-First-Mentalitäten: Frameworks setzen zunehmend auf serverseitiges Rendering, nicht nur für SEO, sondern als zentrale Performance-Strategie. Technologien wie React Server Components treiben dies noch weiter, indem sie Komponenten ermöglichen, ausschließlich auf dem Server zu laufen.
- Partielle Hydration & Islands-Architektur: Meta-Frameworks wie Astro verfechten die Idee, standardmäßig kein JavaScript auszuliefern und Entwicklern zu ermöglichen, nur bestimmte, interaktive Komponenten (Inseln) auf einer Seite zu „hydrieren“.
- Resumability als die nächste Grenze: Qwiks Pionierarbeit in der Resumability könnte den nächsten großen Paradigmenwechsel darstellen, wie wir sofort interaktive Webanwendungen bauen.
Fazit: Ein ausgewogener Ansatz
Die Debatte zwischen Bundle-Größe und Funktionen ist keine binäre Wahl, sondern ein Spektrum von Kompromissen. Die moderne JavaScript-Landschaft bietet eine bemerkenswerte Auswahl an Werkzeugen, die jeweils für verschiedene Punkte auf diesem Spektrum optimiert sind.
React und Vue bieten eine fantastische Balance aus Flexibilität, Ökosystem und Leistung, was sie zu sicheren und leistungsstarken Wahlmöglichkeiten für eine riesige Vielfalt von Anwendungen macht. Angular bietet eine unübertroffene, strukturierte Umgebung für große Unternehmensprojekte, bei denen Konsistenz entscheidend ist. Für diejenigen, die die absoluten Grenzen der Performance ausloten, liefern Svelte und SolidJS beispiellose Geschwindigkeit und minimale Fußabdrücke, indem sie die Rolle einer Runtime neu denken. Und für Anwendungen, bei denen sofortige Interaktivität in jeder Größenordnung das ultimative Ziel ist, präsentiert Qwik eine überzeugende und revolutionäre Zukunft.
Letztendlich ist das beste Framework dasjenige, das mit den spezifischen Leistungsanforderungen Ihres Projekts, den Fähigkeiten Ihres Teams und Ihren langfristigen Wartungszielen übereinstimmt. Indem Sie die hier skizzierten grundlegenden architektonischen Unterschiede und Leistungsimplikationen verstehen, sind Sie nun besser gerüstet, über den Hype hinauszuschauen und eine strategische Wahl zu treffen, die Ihr Projekt in einer Performance-First-Welt auf Erfolgskurs bringt.