นี่คืออีกวิธีหนึ่งที่ผสมผสานแนวคิดจากคำตอบก่อนหน้านี้ ใช้แนวทาง "กระบวนการฆ่า" ในขณะที่จัดการกับข้อกังวลเกี่ยวกับความเป็นอิสระของแพลตฟอร์ม
มันอาศัยแพ็กเกจtree-killเพื่อจัดการกับการฆ่าทรีกระบวนการของเซิร์ฟเวอร์ ฉันพบว่าการฆ่าโครงสร้างกระบวนการทั้งหมดเป็นสิ่งที่จำเป็นในโครงการของฉันเพราะเครื่องมือบางอย่าง (เช่นbabel-node
) วางไข่กระบวนการย่อย หากคุณต้องการฆ่าเพียงกระบวนการเดียวคุณสามารถแทนที่การฆ่าต้นไม้ด้วย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'
})
}
สร้าง / หยุดเซิร์ฟเวอร์ 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()