Apprenez Node.js en construisant un cadre backend - Velocy

Vous pouvez accéder à la version actuelle du livre dans le répertoire des chapitres ou au format PDF (les modes clairs et sombres sont disponibles) en cliquant ici. Notez que cette version comprend la version actuelle du contenu et n'est pas la version finale.
Ce livre est encore à un stade très précoce. Il contient une partie insignifiante du contenu total que le livre est censé couvrir. Il va y avoir 0 dépendances pour notre framework backend, ainsi que notre bibliothèque de journalisation. Tout sera fait en utilisant Vanilla Node.js, le chemin durement (la meilleure façon d'apprendre).
Note
Si vous n'êtes pas familier avec JavaScript, vous pouvez également consulter mon autre référentiel - Apprenez JavaScript - la manière facile qui vous emmène dans un voyage profond et amusant dans JavaScript - des bases mêmes aux concepts avancés dont vous auriez jamais besoin, sans plonger dans trop de théorie. Seuls les exemples de code pratiques.
Pour maîtriser un nouveau concept, il est souvent préférable de commencer à partir de zéro. Ce n'est pas seulement un autre guide Node.js; Il s'agit d'une expérience complète et du code visant à construire un produit réel qui peut être utilisé par des milliers de développeurs. Le produit que nous allons construire sera un cadre backend, qui aussi à partir de zéro.
Vous n'apprendrez pas seulement comment fonctionne Node.js, mais aussi pourquoi il fonctionne d'une manière particulière. Le guide comprend également des discussions sur les structures de données pertinentes et les modèles de conception.
Le livre comprend également un large éventail d'exercices spécialement créés pour vous défier, ce qui peut nécessiter un engagement et des efforts cohérents de votre part. Les premiers exercices commencent du chapitre 7
Ce guide va au-delà des bases. Nous nous concentrons sur la livraison d'un cadre backend modulaire et optimisé qui est proche de la production de la production. Des sujets tels que l'optimisation des performances, les mesures de sécurité et diverses approches de test seront couvertes pour garantir que le cadre est à la fois fiable et extensible.
Je recommande fortement de coder activement à côté de ce guide, plutôt que de simplement le lire, pour une compréhension complète de Node.js et de ses aspects plus complexes.
Le dépôt de notre framework backend - Velocy. (WIP)

Table des matières
- (Facultatif) Node.js est bien plus rapide que vous ne le pensez
- Contendeurs pour le test
- Elysia - Bun
- Axum - rouille
- Express - node.js
- Velocy - Node.js
- La référence
- Code source
- Elysia - Bun
- Axum - rouille
- Express - node.js
- Velocy - Node.js
- Résultats - Benchmark typique
- Résultat: Elysia - Bun / Zig (149 047 req / s)
- Résultat: axum - Rust (208 938 req / s)
- Résultat: Express - Node.js (28 923 req / s)
- Résultat: Velocy - Node.js (83 689)
- Graphiques
- Latence
- Demandes / sec
- Mémoire de ralenti
- Mémoire sous une charge constante
- Verdict - Benchmark typique
- Le vrai référence
- Mise à jour de notre code
- Elysia
- Exprimer
- Velocy
- Résultats - un cas d'utilisation réel
- Résultat: Express - Node (50 275 req / sec)
- Résultat: VELOCY - NODE (138 956 REQ / SEC)
- Latence
- Latence sans barre
max latency - Demandes / sec
- Mémoire de ralenti
- Mémoire sous une charge constante
- Verdict final
- Qu'est-ce qu'un serveur Web est un serveur?
- Parties d'un serveur Web:
- Naviguer dans le monde des protocoles: un aperçu rapide
- La relation entre HTTP et TCP: assurer une communication Web fiable
- 1. Intégrité et commande des données
- 2. Mécanisme de reconnaissance
- 3. Interactions complexes
- 4. Offres de transmission
- Demander et obtenir: comment les serveurs Web réagissent à vos demandes
- Votre premier programme
node.js- Qu'est-ce que Node ou Nodejs exactement?
- Votre premier programme Node.js
- Comment
console.log() fonctionne-t-il dans Node.js? - L' objet
process : - La propriété
stdout de l'objet process :
- Travailler avec des fichiers
- Que fera la bibliothèque forestière
- Comment travaillez-vous avec des fichiers de toute façon?
- Revenons aux
files - Un peu plus sur les descripteurs de fichiers
- Création de notre premier fichier
- argument
path - argument
flag - argument
mode - Lire à partir d'un fichier
- Une petite amorce
for..of et for await..of en javascript - Lire le fichier
json - Tampons
-
logtar notre propre bibliothèque de journalisation- Initialisation d'un nouveau projet
- Un peu sur
SemVer - Création d'une classe
LogLevel - La classe
Logger- Encapsulation avec des champs
private
- La classe
LogConfig - Modèles de conception
- Utilisation du motif
builder avec la classe LogConfig - Commentaires JSDOC
- La classe
RollingConfig- La classe
RollingSizeOptions - La classe
RollingTimeOptions
- Terminer la classe
RollingConfig - Ajout de méthodes plus utiles dans la classe
LogConfig - Refactoriser le code
- La nécessité de refactoriser
- Création de fichiers séparés
- Le fichier
index.js - Le fichier
lib/logtar.js - Le fichier
lib/logger.js - Le fichier
lib/config/log-config.js - Le fichier
lib/config/rolling-config.js - Le fichier
lib/utils/log-level.js - La classe
lib/utils/rolling-options.js
- Écriture de journaux
- 1. Réutiliser la poignée du fichier
- 2. Rotation des journaux
- 3. Journalisation asynchrone
- 4. Obtenir des informations sur l'appelant (module et numéro de ligne)
- Tester notre API actuelle
- Implémentation de méthodes de journalisation
- Sec (ne vous répétez pas)
- La méthode
log - En considérant la variable de membre
log_level - Écriture dans un fichier
- Un autre gotcha
- Configuration du répertoire des journaux
- L'objet
require - Ajout d'une nouvelle aide pour créer un répertoire de journal
- Mise à jour de la méthode
init - Compléter la méthode
log
- Capturer les métadonnées
- Qu'est-ce qu'une pile?
- Exemples de piles
- La pile d'appels
- Obtenir les informations de pile
- Obtenir le nom
callee et le numéro de ligne - Une manière plus ergonomique
- Utilisation de la fonction
get_caller_info
- Une petite introduction à
async vs sync- L'équilibre entre les opposés
- Mélange de code asynchrone et synchrone
- E / S plus rapide hors de la boîte
- Code de blocage
- Concurrence
- Ajout de la prise en charge du fichier roulant
- Caractéristiques de roulement
- La méthode
rolling_check() -
file_handle.stat() - Appeler la méthode
rolling_check - Un gros gotcha!
- Les traces de pile à travers les points
await- Tester la nouvelle création de fichiers journaux
- Http plongée profonde
- Un petit serveur Web
- Démarrage de notre serveur Web
- Tester notre serveur Web
- Tester avec
cURL
- Verbes HTTP, versioning et avantages de
HTTP/1.1-
GET - récupérer les données -
POST - Créez quelque chose -
PUT - remplacer ou créer -
HEAD - Récupérer les métadonnées -
DELETE - Supprimer de l'existence -
PATCH - Mises à jour partielles - Un petit récapitulatif
- Le
/ chemin -
HTTP/0.9 -
HTTP/1.0 -
HTTP/1.1
- Agents des utilisateurs
-
User-Agent peut être bizarre
- Type MIME et
Content-Type- Comprendre l'en-tête
Accept - Type mime
- Anatomie d'un type mime
- Mais pourquoi le joker
*/* ? - L'
Content-Type - Le
charset=UTF-8 : codage des caractères
- Têtes
- Nom de tête
- Colon (
: - Valeur d'en-tête
- Espace blanc
- En-têtes basés sur
X- personnalisés
- Demander des en-têtes
- Accepter
- Référente
- Autorisation
- Cookie
- Hôte
- Type de contenu (demande)
- En-têtes de réponse
- Type de contenu (réponse)
- Contrôle du cache
- Cookie
- Codes de réponse et d'état
-
Connection: close en action - Codes d'état
-
Velocy - Notre cadre backend- Pourquoi Velocy?
- Qu'est-ce qu'un framework / bibliothèque backend de toute façon?
- Caractéristiques de base de notre cadre backend
- Routage et manipulation d'URL:
- Bouffées du milieu
- Construire notre propre base de données
- Mise en cache
- Limitation des taux
- Quelques autres fonctionnalités que nous allons implémenter
- Une implémentation de base
Router- Un routeur de jouets
-
Transfer-Encoding: chunked - Chunks, oh non!
- Spécification de
Content-Length - Réutilisabilité du code
- La classe
Router- Utilisation
Router avec un serveur HTTP
-
this n'est pas bon- Contexte lexical
- Les fonctions de flèche ne sont pas gratuites
- Pourquoi devrions-nous nous soucier de la mémoire?
- Tester le code mis à jour
- Amélioration de l'API
Router - Le besoin d'un
Trie- Qu'est-ce qu'un
Trie de toute façon?
- Ex. Implémentation d'un
Trie- Nœud racine
- Fin du mot
- Défi 1: Trie de base avec méthode
insert - Défi 2: implémenter la méthode
search
- Ex. Implémentation de notre
Router à base de trie- Défi 1: implémentation de la méthode
addRoute - Défi 2: Mise en œuvre de la méthode
findRoute
- Ex. Ajout de support de méthode
HTTP- Exigences
- Plus de détails
- Exemple
- Indices
- Solution
- Ajout de méthodes HTTP au routeur
- Mettre à jour la classe
TrieRouter
- Ex. Implémentation de routage dynamique
- Pourquoi le routage dynamique?
- Anatomie d'un itinéraire dynamique
- Défi: Améliorez la classe
TrieRouter pour prendre en charge le routage dynamique - Visualisation de notre structure
TrieRouter - Résumé
- Exécution de notre serveur
- Refactoriser la classe
TrieRouter - Type Alias
- La fonction
run
- Construire notre premier serveur Web
- Plus de refactorisation
- Votre premier serveur Web
- Ex. Paramètres de requête (avancé)
- Anatomie d'une URL avec paramètres de requête
- Défi 1: Implémentation de l'analyse des paramètres de requête de base
- Nous devons aborder plus de cas de bord
- Défi 2: Analyser les paramètres de requête manuellement