这是另一个解决方案,融合了先前答案中的想法。在解决有关平台独立性的问题时,它采用了“杀死进程”方法。
它依靠tree-kill软件包来处理杀死服务器进程树。我发现杀死我的项目中的整个过程树是必要的,因为某些工具(例如babel-node
)产生了子过程。如果只需要杀死一个进程,则可以使用内置process.kill()
方法替换tree-kill 。
解决方案如下(spawn()
应修改前两个参数以反映运行服务器的特定方法):
构建/启动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()
。