vitest: vite-node --watch doesn't close process before restarting
Describe the bug
I created a simple Typescript Express app that I wanted to try vite-node with. It runs fine but when I edit the src code, I get this error:
[vite-node] Failed to execute file:
Error: listen EADDRINUSE: address already in use :::4000
Which shows that vite-node isn’t closing the previous process when in watch mode.
Reproduction
changing what is logged out starts to accumulate multiple log entries.
System Info
n/a
Used Package Manager
npm
Validations
- Follow our Code of Conduct
- Read the Contributing Guidelines.
- Read the docs.
- Check that there isn’t already an issue that reports the same bug to avoid creating a duplicate.
- Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
- The provided reproduction is a minimal reproducible example of the bug.
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Reactions: 15
- Comments: 21 (10 by maintainers)
So, Vite considers editing the main entry here as a full reload type of HMR, so it won’t call
dispose
, and it callsaccept
too late. But I found a way to close server before ViteNode reevaluates file:Maybe it’s a good idea to also add
dispose
just in case:It will be called only if HMR is triggered not as a full reload. According to Vite docs it’s meant to clear all side effects.
We should probably add this information to docs.
@jgoux That seems to have fixed the issue, but it seems there is another one - if you quickly double save file, I can still get port in use error which crashes server. It seems that if callback is async, vite-node doesn’t wait for it to finish 😞
Above solution doesn’t work for me, can someone let me know what I’m doing wrong?
/src/index.ts
And my run command is
vite-node --watch src/
output:
Looks like neither of the callbacks are getting hit, so the server doesn’t get killed.
EDIT: looks like run command is incorrect, changing it to this works:
I have another issue now, where the server reloads, but the files don’t actually get updated. Anyone hit this before?
EDIT 2: ok so some deeper files are getting updated but it takes a long time (maybe ~10s), anyone face this before?
Alright, i have to revert what i´ve said. The error still appears, i just didn´t fully tested it.
Using vite-node for running servers in development doesnt seems to work at the moment. What could eventually solve it would be an option to completely get rid of the current node process that runs the code and spawn a new process with the latest code (basically rebuild the whole app and run it like nodemon). I´ve tried disabling hmr but that just disables all reload capabilities.
I´d love to use vite for this due to the speed and plugin ecosystem but i wonder if this kind of usage is in the scope of vite-node or if we should rather use something else to run our server (something like nodemon/ts-node-dev).
Can someone tell me what I’m doing wrong here then?
I started the server with
npx vite-node --watch index.ts
and it outputtedlistening
. I then changed that to outputlistening2
and there was the immediate “address already in use” error.