Reiniciar nodo al cambiar un archivo


172

Para alguien que viene de un fondo PHP, el proceso de matar el nodo y comenzarlo nuevamente después de cada cambio de código, parece muy tedioso. ¿Hay algún indicador al iniciar un script con nodo para reiniciar automáticamente el nodo cuando se guarda el cambio de código?

Respuestas:


94

El módulo forever tiene un concepto de múltiples servidores node.js, y puede iniciar, reiniciar, detener y enumerar los servidores que se ejecutan actualmente. También puede observar el cambio de archivos y reiniciar el nodo según sea necesario.

Instálalo si aún no lo tienes:

npm install forever -g

Después de instalarlo, llame al forevercomando: use la -wbandera para ver el archivo en busca de cambios:

forever -w ./my-script.js

Además, puede mirar el directorio e ignorar patrones:

forever --watch --watchDirectory ./path/to/dir --watchIgnore *.log ./start/file

+1 forever es bastante versátil tanto para desarrollo / pruebas como para producción.
— smertrios

1
He intentado usar forever para reiniciar mi servidor ES2015 Expess.js / Webpack con este comando, forever -c babel-node -w --watchDirectory ./server ./server/index.js pero lamentablemente parece que se envía para siempre a una picada y reinicia el servidor con demasiada frecuencia, lo que resulta en errores de puerto ya en uso ... ¿hay alguna manera de agregar una pausa después de reiniciar?
— Brian Di Palma

1
@BrianDiPalma Quizás deba agregar algunos patrones de ignorar, si hay archivos cambiantes, como registros, en el directorio de observación. Verifique los documentos para ver si puede definir un retraso entre reinicios.
— hyde

1
@hyde No se requirió un retraso, era la opción -tu killTreeopción requerida, supongo que se estaba matando el nodo babel, pero no el servidor Express que generó.
— Brian Di Palma

2
Forever JS tiene un error en Windows que no elimina el proceso Node cuando finaliza el script. Tiene que matar manualmente el proceso Node :( stackoverflow.com/questions/14556852/…
— pmont

157

Una buena opción es Node-supervisor y Node.js Restart on File Change es un buen artículo sobre cómo usarlo, generalmente:

 npm install supervisor -g

y después de migrar a la raíz de su aplicación, use lo siguiente

 supervisor app.js

lo mismo aquí, por cualquier razón, ya que usé nodemon antes sin ningún problema.
— ZenMaster

1
A mí también me funcionó. Tuve que anular el parámetro de observación comodín predeterminado server.jsporque se reiniciaba constantemente, esto se debía a que mi servidor construía el cliente en el arranque y, por lo tanto, cambiaba los archivos. supervisor --watch server.js server.jsresuelto.
— scipilot

2
Node-supervisor ya no se mantiene.
— aleung

¡¡Funciona de maravilla!!
— JRichardsz

Mi favorito, ¡los intervalos de actualización para verificar si el archivo se modifica es casi instantáneo!
— NiCk Newman

100

Deberías mirar algo como nodemon .

Nodemon observará los archivos en el directorio en el que se inició nodemon, y si cambian, reiniciará automáticamente su aplicación de nodo.

Ejemplo:

nodemon ./server.js localhost 8080

o simplemente

nodemon server

¿Alguna idea de por qué Node requiere reiniciar para implementar cambios de código? ¿Y por qué otros servidores (como Apache / PHP) no requieren reinicio?
— inconformista

2
@ dk49 porque los scripts PHP en ese caso se inician para cada solicitud entrante y se detienen después de que hayan terminado de generar la página.
— Daerdemandt

@Daerdemandt gracias por compartir eso ... pero aún no entendí por qué el servidor (en cualquier plataforma) necesita comenzar y detenerse. ¿Es porque mantiene un caché de archivos (respuestas)? Pensé que el servidor cargará los archivos desde el disco en el momento de la solicitud, lo procesará y luego enviará la respuesta. Soy nuevo en la programación del lado del servidor.
— inconformista

¿Puedes / debes usar nodemon en el entorno de producción?
— JoeTidee

1
No estoy seguro de cómo se mantiene hoy nodemon (ya que esto fue en 2012), pero por razones de seguridad, no estoy seguro de querer que mi servidor se reinicie en prod cada vez que cambie un archivo. Algo como pm2 podría ser más apropiado para un entorno de producción.
— Menztrual

43

Varios paquetes de NPM están disponibles para facilitar esta tarea.

Para desarrollo

  • nodemon : el más popular y mantenido activamente
  • siempre : el segundo más popular
  • node-dev : sin compromisos desde mayo de 2019
  • supervisor : - ya no se mantiene

Para producción (con funcionalidad extendida como agrupación, implementación remota, etc.)

Comparación entre Siempre, PM2, y StrongLoop se puede encontrar en StrongLoop página web 's.


3
@ 2019 nodemon parece ser la única de las 4 opciones de desarrollo que aún se mantiene.
— mvermand

1
@mvermand Sí, no se han lanzado nuevos lanzamientos recientemente para ninguno de ellos, excepto para nodemon. Para la producción, PM2 todavía está bien mantenido.
— Kay


9

nodo-dev

node-dev es una gran alternativa tanto para nodemon como para supervisor para desarrolladores a los que les gusta recibir notificaciones de gruñido (o libnotificar) en su escritorio cada vez que el servidor se reinicia o cuando se produce un error o cambio en el archivo.

Instalación:

npm install -g node-dev

Use node-dev, en lugar de node:

node-dev app.js

Notificación al cambiar el archivo para que el servidor se inicie automáticamente

ingrese la descripción de la imagen aquí

consola fuera puesto

ingrese la descripción de la imagen aquí


3

Yo uso runjscomo:

runjs example.js

El paquete se llama solo run

npm install -g run

2
no es mejor, solo otra opción
— sp2danny

Esta respuesta sería mucho más valiosa si explicara por qué la usa runy cómo se compara con las alternativas existentes. Simplemente descartar otra opción solo contribuye a la paradoja de la elección. (Afortunadamente runno se ha actualizado desde 2015, por lo que ahora no es una gran opción.)
— Dan Dascalescu

0

Sigue los pasos:

  1. npm install --save-dev nodemon

  2. Agregue las siguientes dos líneas a la sección "script" de package.json:

"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"

Como se muestra abajo:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./bin/www",
    "devstart": "nodemon ./bin/www"
}
  1. npm run devstart

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/skeleton_website


Bueno, es esencialmente la misma respuesta que la de 2012 , pero presente con más "magia" a su alrededor. Pero la esencia de la respuesta es "use nodemon". El reinicio es tangencial. Y estaba mal formateado, pero veo que David lo arregló, así que deshaceré mi voto negativo.
— Dan Dascalescu
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.