从npm脚本在后台运行http-server

Dem*_*ian 15 javascript background-process httpserver node.js npm

你如何http-server从npm脚本开始后台,以便另一个npm脚本,如使用jsdomMocha测试,可以发出HTTP请求http-server

http-server软件包安装时:

npm install http-server --save-dev
Run Code Online (Sandbox Code Playgroud)

package.json文件包含:

"scripts": {
   "pretest": "gulp build-httpdocs",
   "test": "http-server -p 7777 httpdocs/ && mocha spec.js"
},
Run Code Online (Sandbox Code Playgroud)

运行npm test成功启动http-server,但当然命令在显示后挂起:

Starting up http-server, serving httpdocs/
Available on:
  http://127.0.0.1:7777
  http://192.168.1.64:7777
Hit CTRL-C to stop the server
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法来启动Web服务器,因此它不会阻止Mocha测试?

额外奖励:http-server摩卡测试结束后你如何关闭?

Ale*_*dis 16

您可以通过追加&到后台来运行后台进程.然后使用postscript钩子,npm提供给我们以便杀死后台进程.

"scripts": {
    "web-server": "http-server -p 7777 httpdocs &",
    "pretest": "gulp build-httpdocs && npm run web-server",
    "test": "mocha spec.js",
    "posttest": "pkill -f http-server"
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我有多个http-server跑步怎么办?

您可以通过在posttest脚本中指定其端口来终止进程:

    "posttest": "kill $(lsof -t -i:7777)"
Run Code Online (Sandbox Code Playgroud)

现在对于Windows,语法是不同的,据我所知,npm不支持多个OS脚本.为了支持多个我最好的选择将是一个gulp任务,将处理每个操作系统不同.

  • 这个答案让我到达了那里,但我必须进行两项调整(至少对于 *macOS*): **1)** `http-server` 命令需要是它自己的单独的 npm 脚本,因为尾随的 `&` 必须位于最后并且它会导致线路上的所有内容都在后台运行,并且 **2)** 需要 `-f` 标志来关闭 Web 服务器(`"pkill -f http-server"`) (2认同)
  • `&` 不是跨平台解决方案,这限制了 npm-scripts 的可移植性 (2认同)