Lernen Sie Node.js, indem Sie ein Backend -Framework erstellen - Velozy

Sie können auf die aktuelle Version des Buches im Kapitelverzeichnis oder im PDF -Format (sowohl helle als auch dunkle Modi verfügbar) zugreifen, indem Sie hier klicken. Beachten Sie, dass diese Version die aktuelle Version des Inhalts enthält und nicht die endgültige Version ist.
Dieses Buch befindet sich noch in einer sehr frühen Phase. Es enthält einen unbedeutenden Teil des Gesamtinhalts, den das Buch abdecken soll. Es wird 0 Abhängigkeiten für unser Backend -Framework sowie unsere Protokollierungsbibliothek geben. Alles wird mit Vanilleknoten.js, dem harten Weg (der beste Art zum Lernen).
Notiz
Wenn Sie mit JavaScript nicht vertraut sind, können Sie sich auch mein anderes Repository ansehen - JavaScript lernen - die einfache Weise, die Sie auf eine tiefe und eine lustige Reise in JavaScript führt - von den Grundlagen zu den fortgeschrittenen Konzepten, die Sie jemals benötigen würden, ohne in zu viel Theorie zu tauchen. Nur praktische Code -Beispiele.
Um ein neues Konzept zu beherrschen, ist es oft am besten, von Grund auf zu beginnen. Dies ist nicht nur ein weiterer Node.js -Leitfaden; Es ist eine umfassende Erfahrung, die sich mit dem Aufbau eines realen Produkts, das von Tausenden von Entwicklern verwendet werden kann, darauf abzielt, ein reales Produkt aufzubauen. Das Produkt, das wir bauen werden, ist ein Backend -Framework, das auch von Grund auf neu sein wird.
Sie werden nicht nur lernen, wie Node.js funktioniert, sondern auch, warum es auf eine bestimmte Weise funktioniert. Der Leitfaden enthält auch Diskussionen zu relevanten Datenstrukturen und Entwurfsmustern.
Das Buch enthält auch eine breite Palette von Übungen, die speziell für Sie herausgefordert wurden, die möglicherweise Engagement und konsistente Anstrengungen für Ihre Seite erfordern. Die ersten Übungen beginnen aus Kapitel 7
Dieser Leitfaden geht über die Grundlagen hinaus. Wir konzentrieren uns darauf, ein modulares, optimiertes Backend-Framework zu liefern, das kurz vor der Produktion ist. Themen wie Leistungsoptimierung, Sicherheitsmaßnahmen und verschiedene Testansätze werden abgedeckt, um sicherzustellen, dass das Rahmen sowohl zuverlässig als auch erweiterbar ist.
Ich empfehle dringend, aktiv mit diesem Leitfaden zu codieren, anstatt sie nur durch das Lesen von Node.js und seinen komplizierteren Aspekten zu lesen.
Das Repo für unsere Backend Framework-Velocy. (WIP)

Inhaltsverzeichnis
- (Optional) node.js ist viel schneller als Sie denken
- Kandidaten für den Test
- Elysia - Brötchen
- Axum - Rost
- Express - node.js
- Velozy - Node.js
- Der Benchmark
- Quellcode
- Elysia - Brötchen
- Axum - Rost
- Express - node.js
- Velozy - Node.js
- Ergebnisse - Typischer Benchmark
- Ergebnis: Elysia - Bun/Zig (149.047 req/s)
- Ergebnis: Axum - Rost (208.938 Req/s)
- Ergebnis: Express - Node.js (28.923 req/s)
- Ergebnis: Velocy - Node.js (83.689)
- Grafiken
- Latenz
- Anfragen/Sek
- Leerlaufspeicher
- Speicher unter konstanter Last
- Urteil - Typische Benchmark
- Der echte Benchmark
- Aktualisieren unseres Code
- Elysia
- Äußern
- Velozie
- Ergebnisse-eine reale Anwendungsfall.
- Ergebnis: Express - Knoten (50,275 Req/Sek.)
- Ergebnis: Velozy - Knoten (138.956 Req/Sek.)
- Latenz
- Latenz ohne
max latency - Anfragen/Sek
- Leerlaufspeicher
- Speicher unter konstanter Last
- Abschlussfazit
- Wie zum Teufel ist ein Webserver auf irgendeine Weise?
- Teile eines Webservers:
- Navigieren in der Welt der Protokolle: eine schnelle Übersicht
- Die Beziehung zwischen HTTP und TCP: Gewährleistung einer zuverlässigen Webkommunikation
- 1. Datenintegrität und Reihenfolge
- 2. Anerkennungsmechanismus
- 3.. Komplexe Wechselwirkungen
- 4. Getriebe Overhead
- Fragen und Erhalten: Wie Webserver auf Ihre Anfragen reagieren
- Die Anfrage:
- Die Antwort:
- Ihr erstes
node.js -Programm- Was genau ist Knoten oder Knoten?
- Ihr erstes Node.js -Programm
- Wie funktioniert
console.log() in node.js? - Das
process : - Die
stdout -Eigenschaft des process :
- Arbeiten mit Dateien
- Was wird die Protokollierungsbibliothek tun?
- Wie arbeiten Sie überhaupt mit Dateien?
- Kommen wir zurück zu
files - Ein bisschen mehr über Dateideskriptoren
- Erstellen unserer ersten Datei
-
path -
flag -
mode - Lesen aus einer Datei
- Eine kleine Grundierung für
for..of und for await..of in JavaScript - Lesen der
json -Datei - Puffer
-
logtar unsere eigene Protokollierungsbibliothek- Initialisierung eines neuen Projekts
- Ein wenig über
SemVer - Erstellen einer
LogLevel -Klasse - Die
Logger -Klasse- Verkapselung mit
private Feldern
- Die
LogConfig -Klasse - Entwurfsmuster
- Verwenden von
builder -Muster mit der LogConfig -Klasse - JSDOC -Kommentare
- Die
RollingConfig -Klasse- Die
RollingSizeOptions -Klasse - Die
RollingTimeOptions -Klasse
- Beenden Sie die
RollingConfig -Klasse- Lassen Sie uns zusammenarbeiten
- Hinzufügen weiterer nützlicher Methoden in der
LogConfig -Klasse - Refactoring des Code
- Die Notwendigkeit von Refactoring
- Erstellen separater Dateien
- Die
index.js -Datei - Die
lib/logtar.js -Datei - Die
lib/logger.js -Datei - Die Datei
lib/config/log-config.js - Die Datei
lib/config/rolling-config.js - Die
lib/utils/log-level.js Datei - Die
lib/utils/rolling-options.js Klasse
- Schreiben von Protokollen
- 1. Wiederverwenden des Dateihandels
- 2. Log -Rotation
- 3. Asynchrone Protokollierung
- 4. Abrufen von Anruferinformationen (Modul- und Zeilennummer)
- Testen unserer aktuellen API
- Implementierung von Protokollierungsmethoden
- Trocken (wiederholen Sie sich nicht)
- Die
log - Berücksichtigung der Mitgliedsvariable
log_level - Schreiben in eine Datei
- Ein anderer Gotcha
- Protokolle Verzeichniskonfiguration
- Das
require Objekt - Hinzufügen eines neuen Helfers zum Erstellen von Protokollverzeichnissen
- Aktualisieren der
init -Methode - Fertigstellung der
log
- Metadaten erfassen
- Was ist ein Stapel?
- Beispiele für Stapel
- Der Anrufstack
- Die Stapelinformationen erhalten
- Erhalten Sie den
callee -Namen und die Zeilennummer - Ein ergonomischerer Weg
- Verwenden Sie die Funktion
get_caller_info
- Ein kleines Intro in
async vs sync- Das Gleichgewicht zwischen Gegensätzen
- Mischen asynchroner und synchroner Code
- Schneller I/O aus der Box
- Blockierungscode
- Parallelität
- Hinzufügen von Rolling -Dateiunterstützung
- Rolling -Funktionen
- Die Methode
rolling_check() -
file_handle.stat() - Aufrufen der Methode
rolling_check - Ein großer Gotcha!
- Stapelspuren über die Punkte
await Punkte- Testen der neuen Protokolldateierstellung
- Http Deep Dive
- Ein kleiner Webserver
- Starten Sie unseren Webserver
- Testen Sie unseren Webserver
- Testen mit
cURL
- HTTP -Verben, Versioning und die Vorteile von
HTTP/1.1-
GET - Daten abrufen -
POST - etwas erstellen -
PUT - ersetzen oder erstellen -
HEAD - Metadaten abrufen -
DELETE - aus der Existenz entfernen -
PATCH - Partielle Updates - Eine kleine Zusammenfassung
- Der
/ Pfad -
HTTP/0.9 -
HTTP/1.0 -
HTTP/1.1
- Benutzeragenten
-
User-Agent kann seltsam sein
- MIME-Typ und
Content-Type- Den Header
Accept - MIME -Typ
- Anatomie eines Mime -Typs
- Aber warum die Wildcard
*/* ? - Der Header
Content-Type - Das
charset=UTF-8 : Zeichenkodierung
- Header
- Headername
- Dickdarm (
: - Kopfwert
- Whitespace
- Benutzerdefinierte
X- basierte Header
- Anfordern von Headern
- Akzeptieren
- Referer
- Genehmigung
- Plätzchen
- Gastgeber
- Inhaltstyp (Anfrage)
- Reaktionsüberschriften
- Inhaltstyp (Antwort)
- Cache-Kontroll
- Set-Cookie
- Antwort- und Statuscodes
-
Connection: close in Aktion - Statuscodes
-
Velocy - unser Backend -Framework- Warum Velozy?
- Was ist überhaupt ein Backend -Framework/eine Bibliothek?
- Kernmerkmale unseres Backend -Frameworks
- Routing- und URL -Handling:
- Middlewares
- Aufbau unserer eigenen Datenbank
- Ausschnitt
- Ratenbeschränkung
- Einige andere Funktionen, die wir implementieren werden
- Eine grundlegende Implementierung
Router- Ein Spielzeugrouter
-
Transfer-Encoding: chunked - Stücke, oh nein!
-
Content-Length angeben - Wiederverwendbarkeit von Code
- Die
Router -Klasse- Verwenden von
Router mit einem HTTP -Server
-
this ist nicht gut- Lexikalischer Kontext
- Pfeilfunktionen sind nicht kostenlos
- Warum sollten wir uns um das Gedächtnis kümmern?
- Testen des aktualisierten Code
- Verbesserung der
Router -API - Die Notwendigkeit eines
Trie- Was ist überhaupt ein
Trie ?
- Ex. Implementierung eines
Trie- Wurzelknoten
- Ende des Wortes
- Herausforderung 1: Basic Tries mit
insert -Methode - Herausforderung 2:
search implementieren
- Ex. Implementierung unseres Trie -basierten
Router- Herausforderung 1: Implementierung der
addRoute -Methode - Herausforderung 2: Implementierung der
findRoute -Methode
- Ex. Hinzufügen von
HTTP -Methodenunterstützung- Anforderungen
- Weitere Details
- Beispiel
- Hinweise
- Lösung
- Hinzufügen von HTTP -Methoden zum Router
- Aktualisieren Sie die
TrieRouter -Klasse
- Ex. Implementierung dynamischer Routing
- Warum dynamisches Routing?
- Anatomie einer dynamischen Route
- Herausforderung: Verbessern Sie die
TrieRouter -Klasse, um dynamisches Routing zu unterstützen - Visualisierung unserer
TrieRouter -Struktur - Zusammenfassung
- Ausführen unseres Servers
- Refactoring der
TrieRouter -Klasse - Geben Sie Aliase ein
- Die
run
- Aufbau unseres ersten Webservers
- Mehr Refactoring
- Ihr erster Webserver
- Ex. Abfrageparameter (Fortgeschrittene)
- Anatomie einer URL mit Abfrageparametern
- Herausforderung 1: Implementierung der Grundanalyse der grundlegenden Abfrageparameter
- Wir müssen mehr Kantenfälle angehen
- Herausforderung 2: Anfragungsparameter manuell analysieren