-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
vite-node --watch doesn't close process before restarting #2334
Comments
Not sure if it's if (import.meta.hot) {
import.meta.hot.accept(() => {
server.close()
})
} |
HMR doesn't work for node processes — vite-node is creating new node process on changes and leaving the old ones running. I just expect the old one to be killed before the new one starts. |
import.meta.hmr is the way for developer to control watch mode behaviour |
I'm using vite-node directly in an npm script. Killing the old node process there is standard behavior for |
|
I ran into the same issue with a fastify server. By storing the server in globalThis and if present stop it before creating a new one i was able to make it work. declare global {
// eslint-disable-next-line no-var
var __app: FastifyInstance;
}
if (globalThis.__app) {
await globalThis.__app.close();
}
const app = (globalThis.__app = fastify({
logger: true
})); Edit: Nevermind! You suggestion works like a charm @sheremet-va if (import.meta.hot) {
import.meta.hot.accept(async () => {
await app.close();
});
} |
Can someone tell me what I'm doing wrong here then? const http = require('http');
const requestListener = function (req, res) {
res.writeHead(200);
res.end('Hello, World!');
}
const server = http.createServer(requestListener);
server.listen(8080, () => {
console.log(`listening2`)
});
if (import.meta.hot) {
import.meta.hot.accept(() => {
server.close()
})
} I started the server with |
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. 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). |
So, Vite considers editing the main entry here as a full reload type of HMR, so it won't call if (import.meta.hot) {
import.meta.hot.on("vite:beforeFullReload", () => {
server.close();
});
} Maybe it's a good idea to also add import.meta.hot.dispose(() => {
server.close()
}); 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. |
@sheremet-va Seems like it is working, however if I do something like this: if (import.meta.hot) {
import.meta.hot.on("vite:beforeFullReload", () => {
console.log("Reload");
});
} it keeps adding listeners and it prints |
@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 😞 |
I faced this issue today, don't think there is someone faced it already 😄 The temporary solution could be ... setTimeout |
Above solution doesn't work for me, can someone let me know what I'm doing wrong?
import config from './config';
import ApiRouter from '~/api';
import app from '~/app';
const PORT = config.PORT;
export const server = app(ApiRouter);
const _server = server.listen(PORT, () => {
console.log(`Server listening port ${PORT}`);
});
if (import.meta.hot) {
console.log('hot reload')
async function killServer() {
await _server.close((err) => {
console.log('server closed')
process.exit(err ? 1 : 0)
});
}
import.meta.hot.on("vite:beforeFullReload", () => {
console.log("full reload")
killServer()
});
import.meta.hot.dispose(() => {
console.log('dispose')
killServer()
});
} And my run command is 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? |
been having same issues, looks like #3834 resolved it. const httpTerminator = createHttpTerminator({ server, gracefulTerminationTimeout });
const releaseResources = async () => {
if (dataSource.isInitialized) {
try {
await dataSource.destroy();
logger.warn('successfuly closed typeorm connection to database');
} catch (error) {
logger.error('error when closing database connection', error);
}
}
await httpTerminator.terminate();
logger.warn('closed http server');
};
const attemptGracefulShutdown = async (signal: string) => {
logger.warn(`Attempting to gracefully shutdown for ${signal}`);
await releaseResources();
process.exit(0);
};
const signals = ['SIGTERM', 'SIGINT', 'SIGUSR2'];
signals.forEach((signal) => process.on(signal, () => attemptGracefulShutdown(signal)));
if (import.meta.hot) {
import.meta.hot.on('vite:beforeFullReload', releaseResources);
import.meta.hot.dispose(releaseResources);
} |
#3834 is released as part of 0.34.0. vite-node now waits until all callbacks are resolved before reloading. |
@sheremet-va Is the issue that @scarf005 mentioned also fixed? Looking at his screenshot it seems that event callback is not being removed from events map. 🤔 |
@sheremet-va i've updated to v0.34.1, however the error seems to persist even without 2023-08-14.17-42-09.mp4 |
Please, create a new issue with reproduction |
problem still exists: |
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:
Which shows that vite-node isn't closing the previous process when in watch mode.
Reproduction
https://stackblitz.com/edit/vitest-dev-vitest-7yrhdv?file=package.json,server.ts&initialPath=__vitest__
changing what is logged out starts to accumulate multiple log entries.
System Info
Used Package Manager
npm
Validations
The text was updated successfully, but these errors were encountered: