Ось ще одне рішення, яке змішує ідеї з попередніх відповідей. Він застосовує підхід "процесу вбивства", вирішуючи при цьому питання про незалежність платформи.
Він покладається на пакунок дерева-kill для обробки вбивства дерева серверного процесу. Я вважав, що вбивство всього дерева технологічних процесів необхідне в моїх проектах, оскільки деякі інструменти (наприклад babel-node) нерестові дочірні процеси Якщо вам потрібно вбити лише один процес, ви можете замінити дерево-убиття вбудованим process.kill()методом.
Рішення наступне (перші два аргументи, які spawn()слід змінити, щоб відобразити конкретний рецепт роботи сервера):
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"
}
Зауважте, що це рішення відокремлює стартовий скрипт від сервера (тобто npm startповернеться негайно і не заблокує, поки сервер не зупиниться). Якщо ви віддаєте перевагу традиційній поведінці блокування, просто видаліть options.detachedаргумент spawn()та заклик до child.unref().