Đây là một giải pháp khác kết hợp các ý tưởng từ các câu trả lời trước. Nó sử dụng cách tiếp cận "quá trình tiêu diệt" trong khi giải quyết mối quan tâm về tính độc lập của nền tảng.
Nó dựa vào gói diệt cây để xử lý việc giết cây xử lý máy chủ. Tôi thấy việc giết toàn bộ cây quy trình là cần thiết trong các dự án của mình vì một số công cụ (ví dụ babel-node
) sinh ra các quy trình con. Nếu bạn chỉ cần diệt một quy trình duy nhất, bạn có thể thay thế diệt cây bằng process.kill()
phương pháp tích hợp sẵn.
Giải pháp sau (hai đối số đầu tiên spawn()
cần được sửa đổi để phản ánh công thức cụ thể để chạy máy chủ của bạn):
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"
}
Lưu ý rằng giải pháp này tách tập lệnh bắt đầu khỏi máy chủ (tức là npm start
sẽ trả về ngay lập tức và không chặn cho đến khi máy chủ bị dừng). Nếu bạn thích hành vi chặn truyền thống, chỉ cần xóa options.detached
đối số tới spawn()
và lệnh gọi tới child.unref()
.