Oto inne rozwiązanie, które łączy pomysły z poprzednich odpowiedzi. Przyjmuje podejście „procesu zabijania”, rozwiązując jednocześnie obawy dotyczące niezależności platformy.
Opiera się na drzewo-kill pakietu do obsługi zabijając drzewo procesów serwera. Zauważyłem, że zabijanie całego drzewa procesów jest konieczne w moich projektach, ponieważ niektóre narzędzia (np. babel-node
) Uruchamiają procesy potomne. Jeśli chcesz zabić tylko jeden proces, możesz zastąpić zabijanie drzewa process.kill()
metodą wbudowaną .
Rozwiązanie jest następujące (pierwsze dwa argumenty spawn()
należy zmodyfikować, aby odzwierciedlić konkretną receptę na uruchomienie serwera):
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"
}
Zauważ, że to rozwiązanie odłącza skrypt startowy od serwera (tzn. npm start
Zwróci natychmiast i nie zablokuje się, dopóki serwer nie zostanie zatrzymany). Jeśli wolisz tradycyjne zachowanie blokujące, po prostu usuń options.detached
argument do spawn()
i wywołanie do child.unref()
.