Вот еще одно решение, в котором смешаны идеи из предыдущих ответов. Он использует подход «процесса уничтожения», решая проблему независимости платформы.
Он полагается на пакет tree-kill для обработки уничтожения дерева процессов сервера. Я обнаружил, что в моих проектах необходимо уничтожить все дерево процессов, потому что некоторые инструменты (например babel-node
) порождают дочерние процессы. Если вам нужно убить только один процесс, вы можете заменить tree-kill на встроенный process.kill()
метод.
Далее следует решение (первые два аргумента spawn()
должны быть изменены, чтобы отразить конкретный рецепт запуска вашего сервера):
сборка / 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'
})
}
сборка / стоп-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()
.