Nodemon

nodemon es una herramienta que ayuda a desarrollar aplicaciones basadas en Node reiniciando automáticamente la aplicación node cuando se detectan cambios de archivos en el directorio. nodemon no requiere ningún cambio adicional en su código o método de desarrollo. nodemon es una envoltura de reemplazo para node. Para utilizar nodemon, sustituya la palabra node en la línea de comandos cuando ejecute su script.

Instalacion

Ya sea a través de la clonación con git o mediante el uso de npm (la forma recomendada):

$ npm install -g nodemon
 
    #o usando yarn:

$ yarn global add nodemon

Y nodemon se instalará globalmente en el path del sistema.

También se puede instalar nodemon como una dependencia de desarrollo. (Internamente en el cascaron de directorios y ficheros de la aplicación que estamos construyendo).

Con una instalación local, nodemon no estará disponible en la ruta de tu sistema o no podrás usarlo directamente desde la línea de comandos. En su lugar, la instalación local de nodemon se puede ejecutar llamándolo desde dentro de un script npm (como npm start) o usando npx nodemon.

Uso

nodemon envuelve tu aplicación, por lo que puedes pasar todos los argumentos que normalmente pasarías a tu aplicación:

 $ nodemon [tuApp]

Para las opciones CLI, usa la bandera -h (o –help) como argumento

 $ nodemon -h

Usar nodemon es fácil, si mi aplicación acepta host y puerto como argumentos, podría iniciarlo así:

 $ nodemon ./server.js localhost 8080

Cualquier salida de este script se prefija con [nodemon], de lo contrario toda la salida de su aplicación, errores incluidos, se hará eco como se esperaba.

También puede pasar la bandera inspect a node a través de la línea de comandos como lo haría normalmente:

$ nodemon --inspect ./server.js 80

Si tiene un archivo package.json para su aplicación, puede omitir el script principal por completo y nodemon leerá el package.json para la propiedad main y usará ese valor como aplicación (ref).

nodemon también buscará la propiedad scripts.start en package.json (a partir de nodemon 1.1.x).

Reejecución automática

nodemon fue escrito originalmente para reiniciar procesos colgados como servidores web, pero ahora soporta aplicaciones que salen limpiamente. Si su script sale limpiamente, nodemon continuará monitorizando el directorio (o directorios) y reiniciará el script si hay algún cambio.

Reinicio manual

Mientras nodemon se está ejecutando, si necesitas reiniciar manualmente tu aplicación, en lugar de parar y reiniciar nodemon, puedes escribir rs con un retorno de carro, y nodemon reiniciará tu proceso.

Archivos de configuración

nodemon admite archivos de configuración locales y globales. Normalmente se denominan nodemon.json y pueden estar ubicados en el directorio de trabajo actual o en su directorio personal. Se puede especificar un archivo de configuración local alternativo con la opción --config <archivo>.

La especificidad es la siguiente, de modo que un argumento de línea de comandos siempre anulará la configuración del archivo config:

  • argumentos de línea de comandos
  • configuración local
  • config global

Un archivo config puede tomar cualquiera de los argumentos de línea de comandos como valores clave JSON, por ejemplo:

{
  "verbose": true,
  "ignore": ["*.test.js", "**/fixtures/**"],
  "execMap": {
    "rb": "ruby",
    "pde": "processing --sketch= --run"}
}

El archivo nodemon.json anterior podría ser mi configuración global de modo que tengo soporte para archivos ruby y archivos de procesamiento, y puedo ejecutar nodemon demo.pde y nodemon automáticamente sabrá cómo ejecutar el script a pesar de estar que fuera de la caja de soporte para scripts de procesamiento.

paquete.json

Si desea mantener todas las configuraciones de sus paquetes en un solo lugar, nodemon soporta el uso de package.json para la configuración. Especifique la configuración en el mismo formato que lo haría para un archivo de configuración pero bajo nodemonConfig en el archivo package.json, por ejemplo, tome el siguiente package.json:

{
  "name": "nodemon",
  "homepage": "http://nodemon.io",
  "...": "... other standard package.json values",
  "nodemonConfig": {
    "ignore": ["**/test/**", "**/docs/**"],
    "delay": 2500}
}

Tenga en cuenta que si especifica un archivo –config o proporciona un nodemon.json local, se ignorará cualquier configuración package.json.

This section needs better documentation, but for now you can also see nodemon –help config (also here).

Using nodemon as a module

Please see doc/requireable.md

Using nodemon as child process

Please see doc/events.md

Ejecutar scripts que no son de node

nodemon también puede usarse para ejecutar y monitorizar otros programas. nodemon leerá la extensión del archivo del script que se está ejecutando y monitorizará esa extensión en lugar de .js si no existe nodemon.json:

$ nodemon --exec "python -v" ./app.py

Ahora nodemon ejecutará app.py con python en modo verbose (ten en cuenta que si no estás pasando args al programa exec, no necesitas las comillas), y buscará archivos nuevos o modificados con la extensión .py.

Ejecutables por defecto

Usando el archivo de configuración nodemon.json, puedes definir tus propios ejecutables por defecto usando la propiedad execMap. Esto es particularmente útil si está trabajando con un lenguaje que no está soportado por defecto por nodemon.

Para añadir soporte para que nodemon conozca la extensión .pl (para Perl), el archivo nodemon.json añadiría:

{
  "execMap": {
    "pl": "perl"}
}

Ahora ejecutando lo siguiente, nodemon sabrá usar perl como ejecutable:

$ nodemon script.pl

Generalmente se recomienda usar el archivo global nodemon.json para añadir sus propias opciones execMap. Sin embargo, si hay un valor predeterminado común que falta, esto se puede fusionar en el proyecto para que nodemon lo soporte de forma predeterminada, cambiando default.js y enviando una solicitud de extracción.

Monitorización de múltiples directorios

Por defecto, nodemon monitoriza el directorio de trabajo actual. Si desea tomar el control de esa opción, utilice la opción –watch para añadir rutas específicas:

$ nodemon --watch app --watch libs app/server.js

Ahora nodemon sólo se reiniciará si hay cambios en el directorio ./app o ./libs. Por defecto, nodemon recorrerá los subdirectorios, por lo que no es necesario incluirlos explícitamente.

Nodemon también soporta globbing unix, por ejemplo –watch ‘./lib/*’. El patrón globbing debe estar entre comillas.

Especificación de la lista de vigilancia de extensiones

Por defecto, nodemon busca archivos con las extensiones .js, .mjs, .coffee, .litcoffee y .json. Si usa la opción –exec y monitoriza app.py nodemon monitorizará archivos con la extensión .py. Sin embargo, puede especificar su propia lista con el modificador -e (o –ext) de esta forma:

$ nodemon -e js,pug

Ahora nodemon se reiniciará ante cualquier cambio en los archivos del directorio (o subdirectorios) con las extensiones .js, .pug.

Ignorar archivos

Por defecto, nodemon sólo se reiniciará cuando cambie un archivo JavaScript .js. En algunos casos querrá ignorar algunos archivos específicos, directorios o patrones de archivos, para evitar que nodemon reinicie prematuramente su aplicación.

Esto se puede hacer a través de la línea de comandos:

$ nodemon --ignore lib/ --ignore tests/

# O se pueden ignorar archivos específicos:

$ nodemon --ignore lib/app.js

Los patrones también pueden ignorarse (pero asegúrese de citar los argumentos):

$ nodemon --ignore 'lib/*.js'

Importante: las reglas de ignorar son patrones que coinciden con la ruta absoluta completa, y esto determina cuántos archivos se supervisan. Si se utiliza un patrón global comodín, debe utilizarse como ** u omitirse por completo. Por ejemplo, nodemon –ignore ‘**/test/**’ funcionará, mientras que –ignore ‘*/test/*’ no.

Tenga en cuenta que por defecto, nodemon ignorará los directorios .git, node_modules, bower_components, .nyc_output, coverage y .sass-cache y añadirá sus patrones ignorados a la lista. Si quieres vigilar un directorio como node_modules, necesitas anular las reglas de ignorar por defecto.

La aplicación no se reinicia

En algunos entornos en red (como un contenedor que ejecuta nodemon leyendo a través de una unidad montada), necesitará utilizar legacyWatch: true que habilita el sondeo de Chokidar.

A través de la CLI, utilice –legacy-watch o -L para abreviar:

$ nodemon -L

Aunque esto debería ser el último recurso, ya que sondeará todos los archivos que encuentre.

Retrasar el reinicio

En algunas situaciones, es posible que desee esperar hasta que una serie de archivos hayan cambiado. El tiempo de espera antes de comprobar los cambios en los archivos es de 1 segundo. Si estás subiendo un número de archivos y está tomando algún número de segundos, esto podría causar que tu aplicación se reinicie varias veces innecesariamente.

Para añadir un acelerador extra, o retrasar el reinicio, utiliza el comando –delay:

$ nodemon --delay 10 server.js

Para mayor precisión, se pueden especificar milisegundos. O bien como un flotador:

$ nodemon --delay 2.5 servidor.js

O utilizando el especificador de tiempo (ms):

$ nodemon --delay 2500ms servidor.js

La cifra del retardo es el número de segundos (o milisegundos, si se especifica) que hay que esperar antes de reiniciar. Así nodemon sólo reiniciará su aplicación el número de segundos dado después del último cambio de archivo.

Si está configurando este valor en nodemon.json, el valor siempre se interpretará en milisegundos. Por ejemplo, lo siguiente es equivalente:

$ nodemon --delay 2.5
{
  "delay": 2500
}

Recarga gradual del script

Es posible hacer que nodemon envíe cualquier señal que especifiques a tu aplicación.

nodemon --signal SIGHUP server.js

Su aplicación puede manejar la señal de la siguiente manera.

process.once("SIGHUP",function(){
    reloadSomeConfiguration();
})

Tenga en cuenta que nodemon enviará esta señal a cada proceso en el árbol de procesos.

Si está usando cluster, entonces cada worker (así como el master) recibirá la señal. Si desea terminar todos los workers al recibir un SIGHUP, un patrón común es capturar el SIGHUP en el maestro, y reenviar SIGTERM a todos los workers, mientras se asegura de que todos los workers ignoran SIGHUP.

if(cluster.isMaster){
    process.on("SIGHUP",function() {
        for(const workerofObject.values(cluster.workers)) {
            worker.process.kill("SIGTERM");
        }
    });
}else{  
    process.on("SIGHUP",function(){} )
}

Controlar el apagado de tu script

nodemon envía una señal de apagado a tu aplicación cuando ve una actualización de archivo. Si necesitas limpiar el cierre dentro de tu script puedes capturar la señal kill y manejarla tu mismo.

El siguiente ejemplo escuchará una vez la señal SIGUSR2 (usada por nodemon para reiniciar), ejecutará el proceso de limpieza y luego se suicidará para que nodemon continúe el control

process.once('SIGUSR2',function(){
    gracefulShutdown(function(){
        process.kill(process.pid,'SIGUSR2');
    });
});

Activación de eventos cuando cambia el estado de nodemon

Si quieres notificaciones tipo growl cuando nodemon se reinicia o activar una acción cuando ocurre un evento, puedes requerir nodemon o añadir acciones de evento a tu archivo nodemon.json.

Por ejemplo, para activar una notificación en un Mac cuando nodemon se reinicia, nodemon.json tiene este aspecto:

{
  "events": {
    "restart": "osascript -e 'display notification \"app restarted\"with title \"nodemon\"'"}
}

Canalizar la salida a otro lugar

nodemon({
    script: ...,
    stdout: false// important: this tells nodemon not to output to console
}).on('readable',function(){// the `readable` event indicates that data is ready to pick up
    this.stdout.pipe(fs.createWriteStream('output.txt'));
    this.stderr.pipe(fs.createWriteStream('err.txt'));
});

Usando nodemon en tu flujo de trabajo gulp

Echa un vistazo al plugin gulp-nodemon para integrar nodemon con el resto del flujo de trabajo gulp de tu proyecto.

Usando nodemon en tu flujo de trabajo Grunt

Echa un vistazo al plugin grunt-nodemon para integrar nodemon con el resto del flujo de trabajo grunt de tu proyecto.

Pronunciación

nodemon, ¿se pronuncia: node-mon, no-demon o node-e-mon (como pokémon)?

Bueno… ya me lo han preguntado muchas veces. Me gusta que me lo hayan preguntado antes. Ha habido apuestas sobre cuál es en realidad.

La respuesta es sencilla, pero posiblemente frustrante. No digo (cómo lo pronuncio). Depende de ti llamarlo como quieras. Todas las respuestas son correctas :)

Principios de diseño

  • Menos banderas es mejor
  • Funciona en todas las plataformas
  • Menos funciones
  • Permitir que los usuarios construyan sobre nodemon
  • Ofrecer toda la funcionalidad CLI como API
  • Las contribuciones deben tener y pasar pruebas

Nodemon no es perfecto, y los argumentos de la CLI se han extendido más allá de donde estoy completamente feliz, pero tal vez pueda reducirse un poco algún día.

Written on September 23, 2023