Vous pouvez trouver le code source ici : https://github.com/aelassas/watcher
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.
La première étape sera d'initialiser notre projet Node.js :
npm init
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" }
Ensuite, nous installerons les dépendances de développement :
npm i -D @types/node
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)
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
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
process.argv sera le suivant :
[ 'C:\Program Files\nodejs\node.exe', 'C:\dev\watcher\src\watcher.js', 'server.js' ]
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
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" }
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
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)
Afin de démarrer notre application, tapez simplement la commande suivante :
node watcher.js server.js
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.
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
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 :
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!