Praktische Tipps zur Minimierung Ihrer JavaScript-Bundle-Gr??e
Dec 31, 2024 am 01:39 AMKunstwerk: https://code-art.pictures/
Warum sich die Mühe machen?
Es mag heutzutage überraschend sein, aber der Internetverkehr ist in vielen Szenarien immer noch ein Problem. Mobilfunknetze verfügen oft über begrenzte Datentarife, die Akkus der Ger?te sind nicht unbegrenzt und vor allem ist die Aufmerksamkeit des Benutzers beim Warten auf das Laden Ihrer Website begrenzt. Deshalb ist die Paketgr??e immer noch wichtig. Hier sind sieben Tipps, die Sie berücksichtigen sollten.
1. Transpilieren Sie nicht auf ES5
Im Jahr 2020 pflegte ich eine Werbe-App für ein lokales soziales Netzwerk. Es handelte sich um eine typische React TypeScript-Webpack-Anwendung für ES5. Als Webpack 5 ver?ffentlicht wurde, entschied ich mich für ein Upgrade. Alles verlief reibungslos; Ich habe die Fehleranalyse und das Benutzerfeedback überwacht und es gab nichts Unerwartetes. Erst nach einer Woche entdeckte ich zuf?llig, dass mein Bundle Pfeilfunktionen enthielt – es war eine neue Webpack-Funktion.
Hier ist ein ausgezeichneter Artikel über den Zustand von ES5. Wichtige Erkenntnisse:
- Viele Bibliotheken enthalten bereits ES6-Code, was bedeutet, dass Bundles mit ihnen nicht ES5-kompatibel sind.
- Die meisten der weltweit beliebten Websites sind nicht ES5-kompatibel – Ihre Website ben?tigt dies m?glicherweise auch nicht.
- Wenn Sie sicher sind, dass Sie weiterhin ES5-Kompatibilit?t ben?tigen, müssen Sie die Bibliotheken in Ihren Build-Prozess einbeziehen.
2. Kennen und nutzen Sie die modernen JavaScript-Sprachfunktionen
Hier sind einige Funktionen, mit denen Sie besseren und kompakteren Code schreiben k?nnen.
2.1. Generatoren
Generatoren sind eine effiziente M?glichkeit, verschachtelte Strukturen zu durchqueren:
type TreeNode<T> = { left?: TreeNode<T> value: T right?: TreeNode<T> }; function* traverse<T>(root: TreeNode<T>): Generator<T> { if (root.left) yield* traverse(root.left) yield root.value if (root.right) yield* traverse(root.right) }
2.2. Private Klassenfelder
Minifizierer wissen mit Sicherheit, dass diese Felder keine externe Verwendung haben k?nnen, auch nicht in exportierten Objekten, und es steht ihnen frei, ihre Namen zu kürzen.
Quelle
export class A { #myFancyStateObject }
Paket
export class A{#t}
Das funktioniert natürlich nicht mit privaten TypeScript-Feldern, da das Wissen, dass sie privat sind, verschwindet, sobald tsc seine Arbeit erledigt hat.
2.3. Moderne APIs
Haben Sie schon von Promise.withResolvers() oder Map.groupBy() geh?rt? Diese APIs sind zum Zeitpunkt des Verfassens dieses Artikels noch nicht allgemein verfügbar, werden es aber bald sein. Nehmen Sie sich jetzt einen Moment Zeit, um sich mit ihnen vertraut zu machen, und seien Sie bereit, sie in ein paar Jahren zu übernehmen.
Tipp: So entdecken Sie neue JavaScript-APIs
Es gibt unz?hlige Blogs und Podcasts, aber ich finde, dass die besten ?Newsletter“ neue .d.ts-Dateien im TypeScript-Repository sind. ?ffnen Sie einfach zum Beispiel es2024.collection.d.ts und genie?en Sie ?
3. Vermeiden Sie Codeduplizierung
Bemerken Sie das sich wiederholende Muster?
type TreeNode<T> = { left?: TreeNode<T> value: T right?: TreeNode<T> }; function* traverse<T>(root: TreeNode<T>): Generator<T> { if (root.left) yield* traverse(root.left) yield root.value if (root.right) yield* traverse(root.right) }
Wiederholter Code erh?ht nicht nur die Paketgr??e, sondern macht es auch schwieriger zu verstehen, was die einzelnen Teile bewirken. Dies führt h?ufig dazu, dass Entwickler neuen Code schreiben, anstatt vorhandene Dienstprogrammfunktionen zu identifizieren und wiederzuverwenden, was das Paket weiter aufbl?ht.
Es gibt bereits eine Fülle exzellenten Materials zu diesem Thema, daher empfehle ich, anstatt es noch einmal zu erz?hlen, einen Klassiker: Refactoring von Martin Fowler. Es deckt nicht nur einfache Beispiele wie das obige ab, sondern auch komplexe F?lle wie gekoppelte Hierarchien und wiederholte Designs.
Jetzt verbessern wir unser kleines Beispiel. Es scheint, dass die Klammer h?ufig verwendet wird, um Parameter auf Array-Indexbereiche zu beschr?nken, sodass wir eine Verknüpfung erstellen k?nnen:
export class A { #myFancyStateObject }
Diese ?nderung macht deutlich, dass n wahrscheinlich eine Ganzzahl sein soll, die derzeit nicht überprüft wird. Au?erdem wird ein nicht behandelter Randfall hervorgehoben: leere Arrays. Durch diese kleine Deduplizierung haben wir auch zwei potenzielle Fehler entdeckt ?
4. Vermeiden Sie Overengineering
Ich erinnere mich nicht an die genaue Quelle dieses Sprichworts, aber ich denke, es ist genau richtig:
Overengineering bedeutet, ein Problem zu l?sen, das Sie nicht haben.
In der Welt der Webentwicklung habe ich zwei Haupttypen von Overengineering beobachtet.
4.1. überverallgemeinerung
Bedenken Sie diesen Code. Die Auffüllungen sind Vielfache von 4 Pixeln und die Hintergrundfarben sind Blaut?ne. Dies ist wahrscheinlich kein Zufall, und wenn ja, k?nnte dies auf eine m?gliche Duplizierung hinweisen. Aber verfügen wir wirklich über genügend Informationen, um die generische Button-Komponente zu extrahieren, oder überdimensionieren wir?
CSS
export class A{#t}
JSX
const clamp = (min, val, max) => Math.max(min, Math.min(val, max)) const x = clamp(0, v1, a.length - 1) const y = clamp(0, v2, b.length - 1) const z = clamp(0, v3, c.length - 1)
Dieser Rat steht etwas im Widerspruch zu ?Vermeiden Sie Doppelarbeit.“ Eine überm??ige Deduplizierung von Code kann zu Overengineering führen. Wo ziehen Sie also die Grenze? Pers?nlich verwende ich die magische Zahl ?3“: Sobald ich drei Stellen mit einem ?hnlichen Muster sehe, ist es m?glicherweise an der Zeit, die generische Komponente zu extrahieren.
Im Fall unserer blauen Schaltfl?chen w?re es meiner Meinung nach die beste L?sung, zumindest zum Auffüllen CSS-Variablen zu verwenden, anstatt eine neue Komponente zu erstellen.
4.2. Verwendung eines falschen Frameworks
Ja, ich spreche von dem, was wir lieben – Next.js, React, Vue und so weiter. Wenn Ihre App nicht viel Interaktivit?t auf der Ebene der DOM-Elemente beinhaltet, nicht dynamisch oder sehr einfach ist, ziehen Sie andere Optionen in Betracht:
- Statische Site-Generatoren – Sie k?nnen mit einigen kuratierten Listen beginnen.
- Vorsicht: Einige von ihnen nutzen unter der Haube React oder andere Frameworks. Wenn Ihr Ziel die Paketminimierung ist, versuchen Sie etwas anderes.
- Content-Management-Systeme wie WordPress.
- Vanille – besonders nützlich in zwei F?llen:
- Die App ist sehr einfach.
- Die App manipuliert nicht viel DOM, sondern malt stattdessen beispielsweise etwas auf eine Leinwand. Ich habe genau ein Projekt wie dieses.
5. Vermeiden Sie veraltete TypeScript-Funktionen
Das aktuelle Ziel von TypeScript ist haupts?chlich die Typprüfung von JavaScript, aber das war nicht immer so. In den Tagen vor ES6 gab es viele Versuche, ?besseres JavaScript“ zu entwickeln, und TypeScript bildete da keine Ausnahme. Einige Funktionen stammen aus diesen frühen Tagen.
5.1. Aufz?hlungen
Sie sind nicht nur schwierig richtig zu verwenden, sondern sie führen auch zu ziemlich ausführlichen Strukturen:
TypeScript
type TreeNode<T> = { left?: TreeNode<T> value: T right?: TreeNode<T> }; function* traverse<T>(root: TreeNode<T>): Generator<T> { if (root.left) yield* traverse(root.left) yield root.value if (root.right) yield* traverse(root.right) }
JavaScript
export class A { #myFancyStateObject }
Das offizielle TypeScript-Handbuch empfiehlt die Verwendung einfacher Objekte anstelle von Aufz?hlungen. Sie k?nnen auch Gewerkschaftstypen in Betracht ziehen.
5.2. Namensr?ume
Namespaces waren eine Modull?sung vor ESM. Sie erh?hen nicht nur die Bundle-Gr??e, sondern da Namespaces global sein sollen, wird es auch wirklich schwierig, Namenskonflikte in gro?en Projekten zu vermeiden.
TypeScript
export class A{#t}
JavaScript
const clamp = (min, val, max) => Math.max(min, Math.min(val, max)) const x = clamp(0, v1, a.length - 1) const y = clamp(0, v2, b.length - 1) const z = clamp(0, v3, c.length - 1)
Verwenden Sie anstelle von Namespaces ES-Module.
Hinweis: Namespaces sind jedoch immer noch nützlich, um Typdefinitionen für globale Bibliotheken zu schreiben.
6. Vernachl?ssigen Sie kleine Optimierungen nicht
Mit jedem dieser kleinen Tricks k?nnen Sie mehrere bis Dutzende Bytes im Paket einsparen. Bei konsequenter Anwendung k?nnen sie ein sichtbares Ergebnis bringen.
6.1. Verwenden Sie wahrheitsgem??e/falsche Eigenschaften
Zum Beispiel ist eine leere Zeichenfolge falsch. Um zu überprüfen, ob es definiert und nicht leer ist, k?nnen Sie einfach Folgendes schreiben:
const clampToRange = (n, {length}) => clamp(0, n, length - 1) const x = clampToRange(v1, a) // ...
6.2. Erlauben Sie manchmal nicht strikte Vergleiche
Ich glaube, dass die Verwendung von ==, um null in undefiniert umzuwandeln oder umgekehrt, v?llig gerechtfertigt ist.
.btn-a { background-color: skyblue; padding: 4px; } .btn-b { background-color: deepskyblue; padding: 8px; }
6.3. Verwenden Sie Nullish Coaleszenz, logisches ODER und Standardparameter, um Standardwerte zu ersetzen
<button className='btn-a' onClick={handleClick}> Show </button> // ... <button className='btn-b' onClick={handleSubmit}> Submit </button>
6.4. Verwenden Sie Pfeilfunktionen für Einzeiler
Stattdessen:
enum A { x, y }
Schreiben Sie dies:
var A; (function (A) { A[A["x"] = 0] = "x"; A[A["y"] = 1] = "y"; })(A || (A = {}));
6.5. Verwenden Sie keine Klassen für sehr einfache Objekte
Stattdessen:
namespace A { export let x = 1 }
Schreiben Sie dies:
var A; (function (A) { A.x = 1; })(A || (A = {}));
Sie k?nnen das Objekt auch einfrieren, um seine Eigenschaften vor ?nderungen zu schützen.
7. überprüfen Sie die Pakete regelm??ig
Für jeden Bundler gibt es Tools zur Visualisierung seines Inhalts, z. B. Webpack-Bundle-Analyzer für Webpack und Vite-Bundle-Analyzer für Vite. Tools wie diese helfen Ihnen, h?ufige Probleme mit Ihrem Bundle zu identifizieren:
- Eine Bibliothek nimmt unverh?ltnism??ig viel Platz ein – vielleicht ist es Zeit für eine Migration oder ein Upgrade?
- Zwei ?hnliche Bibliotheken werden in verschiedenen Teilen Ihres Projekts verwendet – k?nnen Sie nur eine konsolidieren und verwenden?
- Eine gro?e Datei ist in Ihrem Bundle vorhanden, wird aber nur von einer Seite aufgerufen, die 0,5 % der Benutzer besuchen (z. B. ein Lizenztext) – vielleicht k?nnen Sie das Bundle mit dynamischem Import() partitionieren?
Zus?tzlich zu diesen Tools ist es eine gute Idee, die Pakete gelegentlich manuell durchzulesen, um Unregelm??igkeiten zu erkennen. Aufgrund einer TypeScript-Fehlkonfiguration finden Sie beispielsweise ES5-Helfer in einem ES6-Bundle oder CJS-Helfer in einem ESM-Projekt. Diese Probleme werden von automatisierten Tools m?glicherweise nicht erkannt, k?nnen aber dennoch die Ladezeit verl?ngern und Sie m?glicherweise Ihr wertvollstes Gut kosten – die Aufmerksamkeit des Benutzers.
Vielen Dank fürs Lesen. Viel Spa? beim Codieren!
Das obige ist der detaillierte Inhalt vonPraktische Tipps zur Minimierung Ihrer JavaScript-Bundle-Gr??e. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der Müllsammlung von JavaScript verwaltet den Speicher automatisch über einen Tag-Clearing-Algorithmus, um das Risiko eines Speicherlecks zu verringern. Der Motor durchquert und markiert das aktive Objekt aus dem Wurzelobjekt, und nicht markiert wird als Müll behandelt und gel?scht. Wenn das Objekt beispielsweise nicht mehr referenziert wird (z. B. die Variable nach NULL), wird es in der n?chsten Runde des Recyclings freigegeben. Zu den h?ufigen Ursachen für Speicherlecks geh?ren: ① Unger?te Timer oder Event -H?rer; ② Verweise auf externe Variablen in Schlie?ungen; ③ Globale Variablen halten weiterhin eine gro?e Datenmenge. Der V8 -Motor optimiert die Recyclingeffizienz durch Strategien wie Recycling von Generationen, inkrementelle Markierung, paralleles/gleichzeitiges Recycling und verkürzt die Hauptblockierungszeit. W?hrend der Entwicklung sollten unn?tige globale Referenzen vermieden und Objektverb?nde umgehend dekoriert werden, um die Leistung und Stabilit?t zu verbessern.

Es gibt drei g?ngige M?glichkeiten, HTTP-Anforderungen in Node.js zu initiieren: Verwenden Sie integrierte Module, Axios und Knotenfetch. 1. Verwenden Sie das integrierte HTTP/HTTPS-Modul ohne Abh?ngigkeiten, das für grundlegende Szenarien geeignet ist, jedoch eine manuelle Verarbeitung von Datengen?hten und Fehlerüberwachung erfordert, z. 2.Axios ist eine auf Versprechen basierende Bibliothek von Drittanbietern. Es verfügt über eine kurze Syntax und leistungsstarke Funktionen, unterstützt Async/Auseait, automatische JSON -Konvertierung, Interceptor usw. Es wird empfohlen, asynchrone Anforderungsvorg?nge zu vereinfachen. 3.Node-Fetch bietet einen Stil ?hnlich dem Browser-Abruf, basierend auf Versprechen und einfacher Syntax

JavaScript -Datentypen sind in primitive Typen und Referenztypen unterteilt. Zu den primitiven Typen geh?ren String, Anzahl, Boolesche, Null, undefiniertes und Symbol. Die Werte sind unver?nderlich und Kopien werden bei der Zuweisung von Werten kopiert, sodass sie sich nicht gegenseitig beeinflussen. Referenztypen wie Objekte, Arrays und Funktionen speichern Speicheradressen, und Variablen, die auf dasselbe Objekt zeigen, wirkt sich gegenseitig aus. Typeof und Instanz k?nnen verwendet werden, um die Typen zu bestimmen, aber auf die historischen Probleme der TypeOfnull zu achten. Das Verst?ndnis dieser beiden Arten von Unterschieden kann dazu beitragen, einen stabileren und zuverl?ssigeren Code zu schreiben.

Welches JavaScript -Framework ist die beste Wahl? Die Antwort besteht darin, die am besten geeigneten nach Ihren Bedürfnissen zu w?hlen. 1.React ist flexibel und kostenlos und für mittlere und gro?e Projekte geeignet, für die hohe Anpassungs- und Teamarchitekturf?higkeiten erforderlich sind. 2. Angular bietet vollst?ndige L?sungen, die für Anwendungen auf Unternehmensebene und langfristige Wartung geeignet sind. 3.. Vue ist einfach zu bedienen, geeignet für kleine und mittlere Projekte oder schnelle Entwicklung. Unabh?ngig davon, ob es einen technologischen Stack, die Teamgr??e, der Projektlebenszyklus gibt und ob SSR erforderlich ist, sind auch wichtige Faktoren für die Auswahl eines Rahmens. Kurz gesagt, es gibt keinen absolut besten Rahmen, die beste Wahl ist die, die Ihren Bedürfnissen entspricht.

Hallo, JavaScript -Entwickler! Willkommen in den JavaScript -Nachrichten dieser Woche! Diese Woche konzentrieren wir uns auf: Oracas Markenstreit mit Deno, neue JavaScript -Zeitobjekte werden von Browsern, Google Chrome -Updates und einigen leistungsstarken Entwickler -Tools unterstützt. Fangen wir an! Der Markenstreit von Oracle mit dem Versuch von Deno Oracle, ein "JavaScript" -Marke zu registrieren, hat Kontroversen verursacht. Ryan Dahl, der Sch?pfer von Node.js und Deno, hat eine Petition zur Absage der Marke eingereicht, und er glaubt, dass JavaScript ein offener Standard ist und nicht von Oracle verwendet werden sollte

IIFE (SofortinvokedFunctionExpression) ist ein Funktionsausdruck, der unmittelbar nach der Definition ausgeführt wird und zum Isolieren von Variablen und zur Vermeidung des kontaminierenden globalen Bereichs verwendet wird. Es wird aufgerufen, indem die Funktion in Klammern umwickelt ist, um sie zu einem Ausdruck und einem Paar von Klammern zu machen, gefolgt von ihr, wie z. B. (function () {/code/}) ();. Zu den Kernverwendungen geh?ren: 1.. Variable Konflikte vermeiden und die Duplikation der Benennung zwischen mehreren Skripten verhindern; 2. Erstellen Sie einen privaten Bereich, um die internen Variablen unsichtbar zu machen. 3.. Modularer Code, um die Initialisierung zu erleichtern, ohne zu viele Variablen freizulegen. Zu den allgemeinen Schreibmethoden geh?ren Versionen, die mit Parametern und Versionen der ES6 -Pfeilfunktion übergeben wurden. Beachten Sie jedoch, dass Ausdrücke und Krawatten verwendet werden müssen.

Versprechen ist der Kernmechanismus für den Umgang mit asynchronen Operationen in JavaScript. Das Verst?ndnis von Kettenanrufen, Fehlerbehebung und Kombination ist der Schlüssel zum Beherrschen ihrer Anwendungen. 1. Der Kettenaufruf gibt ein neues Versprechen durch .then () zurück, um asynchrone Prozessverkampferung zu realisieren. Jeder. Dann () erh?lt das vorherige Ergebnis und kann einen Wert oder ein Versprechen zurückgeben; 2. Die Fehlerbehandlung sollte .Catch () verwenden, um Ausnahmen zu fangen, um stille Ausf?lle zu vermeiden, und den Standardwert im Fang zurückgeben, um den Prozess fortzusetzen. 3. Combinatoren wie Promise.All () (erfolgreich erfolgreich erfolgreich nach allen Erfolg), Versprechen.Race () (Die erste Fertigstellung wird zurückgegeben) und Versprechen.Allsettled () (Warten auf alle Fertigstellungen)

Cacheapi ist ein Tool, das der Browser zur Cache -Netzwerkanfragen bereitstellt, das h?ufig in Verbindung mit dem Servicearbeiter verwendet wird, um die Leistung der Website und die Offline -Erfahrung zu verbessern. 1. Es erm?glicht Entwicklern, Ressourcen wie Skripte, Stilbl?tter, Bilder usw. Zu speichern; 2. Es kann die Cache -Antworten entsprechend den Anfragen übereinstimmen. 3. Es unterstützt das L?schen bestimmter Caches oder das L?schen des gesamten Cache. 4.. Es kann Cache -Priorit?ts- oder Netzwerkpriorit?tsstrategien durch Servicearbeiter implementieren, die sich auf Fetch -Ereignisse anh?ren. 5. Es wird h?ufig für die Offline -Unterstützung verwendet, die wiederholte Zugriffsgeschwindigkeit, die Vorspannungs -Schlüsselressourcen und den Inhalt des Hintergrundaktualisierungss beschleunigen. 6. Wenn Sie es verwenden, müssen Sie auf die Cache -Versionskontrolle, Speicherbeschr?nkungen und den Unterschied zum HTTP -Caching -Mechanismus achten.
