Berikut solusi lain yang mencampurkan ide dari jawaban sebelumnya. Dibutuhkan pendekatan "proses pembunuhan" sambil menangani kekhawatiran tentang kemandirian platform.
Ini bergantung pada paket penghentian pohon untuk menangani pembunuhan pohon proses server. Saya merasa perlu membunuh seluruh pohon proses dalam proyek saya karena beberapa alat (misalnya babel-node) menelurkan proses anak. Jika Anda hanya perlu mematikan satu proses, Anda dapat mengganti tree-kill dengan process.kill()metode bawaan.
Solusinya mengikuti (dua argumen pertama yang spawn()harus dimodifikasi untuk mencerminkan resep khusus untuk menjalankan server Anda):
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"
}
Perhatikan bahwa solusi ini melepaskan skrip mulai dari server (yaitu npm startakan segera kembali dan tidak memblokir hingga server dihentikan). Jika Anda lebih suka perilaku pemblokiran tradisional, cukup hapus options.detachedargumen ke spawn()dan panggilan ke child.unref().