Voici une autre solution qui mélange les idées des réponses précédentes. Il adopte l'approche du «processus d'élimination» tout en répondant aux préoccupations concernant l'indépendance de la plate-forme.
Il s'appuie sur le package tree-kill pour gérer la destruction de l'arborescence des processus du serveur. J'ai trouvé nécessaire de tuer tout l'arborescence des processus dans mes projets car certains outils (par exemple babel-node
) génèrent des processus enfants. Si vous n'avez besoin de tuer qu'un seul processus, vous pouvez remplacer tree-kill par la process.kill()
méthode intégrée .
La solution suit (les deux premiers arguments à spawn()
doivent être modifiés pour refléter la recette spécifique pour exécuter votre serveur):
build / start-server.js
import { spawn } from 'child_process'
import fs from 'fs'
const child = spawn('node', [
'dist/server.js'
], {
detached: true,
stdio: 'ignore'
})
child.unref()
if (typeof child.pid !== 'undefined') {
fs.writeFileSync('.server.pid', child.pid, {
encoding: 'utf8'
})
}
build / stop-server.js
import fs from 'fs'
import kill from 'tree-kill'
const serverPid = fs.readFileSync('.server.pid', {
encoding: 'utf8'
})
fs.unlinkSync('.server.pid')
kill(serverPid)
package.json
"scripts": {
"start": "babel-node build/start-server.js",
"stop": "babel-node build/stop-server.js"
}
Notez que cette solution détache le script de démarrage du serveur (ie npm start
retournera immédiatement et ne bloquera pas tant que le serveur ne sera pas arrêté). Si vous préférez le comportement de blocage traditionnel, supprimez simplement l' options.detached
argument à spawn()
et l'appel à child.unref()
.