Maison > interface Web > js tutoriel > Créez votre propre nodemon en quelques lignes de code

Créez votre propre nodemon en quelques lignes de code

Linda Hamilton
Libérer: 2024-10-19 22:32:02
original
348 Les gens l'ont consulté

Build Your Own nodemon in Few Lines of Code

Table des matières

  1. Présentation
  2. Mise en place du projet
  3. Serveur
  4. Observateur
  5. Rassembler les pièces
  6. Références

Vous pouvez trouver le code source ici : https://github.com/aelassas/watcher

Introduction

Lorsque vous travaillez sur des applications Node.js, vous devez souvent redémarrer votre serveur après quelques modifications. Eh bien, ce serait ennuyeux si vous deviez redémarrer manuellement votre serveur à chaque fois que vous apportez des modifications à votre code source. Heureusement, certains utilitaires sont disponibles qui vous permettent de redémarrer automatiquement votre serveur lorsque des modifications sont détectées. Et le plus célèbre est nodemon. nodemon est un outil qui permet de développer des applications basées sur Node.js en redémarrant automatiquement l'application de nœud lorsque des modifications de fichiers dans le répertoire sont détectées. Le but de cette astuce n'est pas de réinventer la roue, mais de vous montrer comment créer votre propre utilitaire qui surveille toute modification dans votre application Node.js et redémarre automatiquement le serveur en quelques lignes de code seulement.

Mise en place du projet

La première étape sera d'initialiser notre projet Node.js :

npm init
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, nous devrons mettre à jour package.json afin d'ajouter le support d'ES6 en définissant le module comme type :

{
  "name": "watcher",
  "type": "module",
  "version": "1.0.0",
  "author": "Akram El Assas"
}
Copier après la connexion
Copier après la connexion

Ensuite, nous installerons les dépendances de développement :

npm i -D @types/node
Copier après la connexion
Copier après la connexion
  • @types/node : Pour avoir la saisie semi-automatique dans Visual Studio Code

Serveur

Nous allons créer un simple serveur web server.js comme suit :

import { createServer } from 'http'

const PORT = 8888

createServer((_, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' })
    res.write('Hello World!')
    res.end()
}).listen(PORT)

console.log('HTTP server is running on Port', PORT)
Copier après la connexion
Copier après la connexion

Ensuite, nous créerons un watcher afin de redémarrer le serveur à chaque fois que des changements sont détectés sur le dossier parent du serveur et dans ses sous-dossiers grâce à la commande suivante :

node watcher.js server.js
Copier après la connexion
Copier après la connexion
Copier après la connexion

Observateur

L'observateur redémarrera le serveur chaque fois que des changements sont détectés.

Tout d'abord, nous devrons récupérer les arguments de la ligne de commande. Dans Node.js, nous pouvons avoir accès aux arguments de ligne de commande via process.argv. La propriété process.argv renvoie un tableau contenant les arguments de ligne de commande passés lors du lancement du processus Node.js. Le premier élément sera execPath. Le deuxième élément sera le chemin d'accès au fichier JavaScript en cours d'exécution. Les éléments restants seront des arguments de ligne de commande supplémentaires.

Si on exécute la commande suivante :

node watcher.js server.js
Copier après la connexion
Copier après la connexion
Copier après la connexion

process.argv sera le suivant :

[
  'C:\Program Files\nodejs\node.exe',
  'C:\dev\watcher\src\watcher.js',
  'server.js'
]
Copier après la connexion

Le premier élément est le chemin d’accès à l’exécutable Node.js. Le deuxième élément est le chemin vers watcher.js. Et le dernier élément est server.js. Ainsi, nous pouvons commencer notre code en déclarant le premier et le troisième éléments comme suit :

npm init
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous devons ensuite créer une fonction qui démarre un processus enfant qui lance Node.js avec le fichier spécifié comme argument qui dans notre cas est server.js. Pour ce faire, nous utiliserons la méthode spawn du module child_process. La méthode child_process.spawn() génère un nouveau processus en utilisant la commande donnée, avec des arguments de ligne de commande dans args. Les avantages de l'utilisation de la méthode spawn sont que nous pouvons rediriger stdout et stderr du processus enfant vers le processus parent à l'aide de la méthode pipe. La méthode pipe est utilisée pour attacher un flux inscriptible à un flux lisible afin qu'il passe par conséquent en mode fluide, puis pousse toutes les données dont il dispose vers le flux inscriptible attaché. Le code source de notre fonction ressemblera à ceci :

{
  "name": "watcher",
  "type": "module",
  "version": "1.0.0",
  "author": "Akram El Assas"
}
Copier après la connexion
Copier après la connexion

Tout d'abord, nous générons un processus Node.js enfant avec l'argument de fichier donné. Ensuite, nous redirigeons stdout et stderr du processus enfant vers le processus parent à l'aide de la méthode pipe. Ensuite, lorsque le processus enfant est fermé, nous quittons le processus parent avec le même code de sortie. La méthode process.exit() demande à Node.js de terminer le processus de manière synchrone avec un état de sortie de code. Si le code est omis, exit utilise soit le code de réussite 0, soit la valeur de process.exitCode si elle a été définie. Node.js ne se terminera pas tant que tous les écouteurs d'événements de sortie ne seront pas appelés. Et enfin, nous renvoyons le processus enfant.

Maintenant, nous devons détecter les modifications sur le dossier parent du fichier et ses sous-dossiers. Et chaque fois qu'un changement lié à un fichier JavaScript est détecté, nous tuerons le processus enfant et le réengendrerons. Pour ce faire, nous utiliserons la méthode watch du module fs/promises. La méthode fs/promises.watch() renvoie un itérateur asynchrone qui surveille les modifications apportées au nom de fichier, où le nom de fichier est soit un fichier, soit un répertoire. Nous allons créer un observateur sur le dossier parent du fichier. Ensuite, nous allons parcourir watcher. Nous ignorerons le dossier node_modules et chaque fois qu'un changement est détecté sur un fichier JavaScript, nous tuerons le processus enfant et le réengendrerons comme suit :

npm i -D @types/node
Copier après la connexion
Copier après la connexion

La méthode subprocess.kill() envoie un signal au processus enfant. Si aucun argument n'est donné, le processus recevra le signal SIGTERM. Le signal SIGKILL ne peut pas être intercepté, bloqué ou ignoré et force l'arrêt du processus enfant. Voir signal(7) pour une liste des signaux disponibles.

C'est ça ! Nous avons terminé notre propre nodemon en quelques lignes de code.

Enfin, mais non le moindre, nous devons ajouter les scripts de démarrage et de développement à notre package.json comme suit :

import { createServer } from 'http'

const PORT = 8888

createServer((_, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' })
    res.write('Hello World!')
    res.end()
}).listen(PORT)

console.log('HTTP server is running on Port', PORT)
Copier après la connexion
Copier après la connexion

Afin de démarrer notre application, tapez simplement la commande suivante :

node watcher.js server.js
Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant, si nous exécutons notre application et apportons des modifications à server.js, le serveur sera redémarré automatiquement. Nous n'avons plus besoin d'arrêter et de démarrer le serveur manuellement.

Rassembler les pièces

Nous avons configuré notre propre nodemon en quelques lignes de code seulement. Maintenant, l'intégralité du code source de notre watcher.js ressemble à ceci :

npm init
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce n'est qu'un exemple simple mais vous pouvez imaginer d'autres situations dans lesquelles vous surveillez les modifications sur les fichiers vidéo et chaque fois qu'une modification est détectée, un processus enfant de conversion (ffmpeg) est lancé.

Vous pouvez également mettre en œuvre d'autres options telles que :

  • Ignorer des fichiers ou des répertoires spécifiques
  • Regarder des répertoires spécifiques
  • Surveillance de plusieurs répertoires
  • Spécification de la liste de surveillance des extensions
  • Retarder le redémarrage
  • Exécuter des exécutables autres que Node.js tels que Python, Ruby, make, etc.
  • et ainsi de suite...

Références

  • nœudmon
  • child_process.spawn(command[, args][, options])
  • processus.exit([code])
  • fsPromises.watch(nom de fichier[, options])
  • process.kill(pid[, signal])
  • signal(7)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal