Cuando cambiamos de lenguajes como PHP a NodeJS, un elemento que se nos hace extraño, es la necesidad de reiniciar la aplicación en cada cambio de código para ver el resultado. NodeJS tiene herramientas que permiten que la própia aplicación se reinicie cada vez que actualizamos el código de la misma.


Usando Supervisor

Supervisor es un script que nos permite reiniciar la aplicación de NodeJS a cada cambio del código fuente. La suelo utilizar en entorno de desarrollo. Para instalarlo en nuestro proyecto ejecutamos:

npm install supervisor --save

Y en el archivo package.json cambiamos esta línea:

"scripts": {
   "start": "node_modules/.bin/supervisor ./bin/www"
},

Con esto podemos arrancar nuestra aplicación de la forma habitual: "npm start", y veremos que al tocar una línea de código, automáticamente se refleja en producción.

Usando PM2 en producción

En entornos en producción se necesita un programa que mantenga nuestras aplicaciones NodeJS en funcionamiento. Uno de los más utilizados últimamente es: PM2. Este es mi preferido para producción. Para arrancar nuestro programa y que se actualize el mismo, a cada subida de código, lo arrancamos de la siguiente forma:

pm2 start bin/www --watch

El comando "pm2 list" nos muestra la lista de aplicaciones en ejecución, y con "pm2 show id" podemos ver los detalles de cada una de ellas. Es muy interesante que la aplicación nos muestra el metadata del último pull de Git, lo que facilita enormemente controlar en que estado tenemos nuestro aplicativo.

Script para arrancar la aplicación en diferentes entornos

Por comodidad, ya que uso un arrancador diferente en entorno de desarrollo y en producción, he escrito este script que me facilita la vida:

#!/bin/bash

if [ "$#" -eq 1 ]; then
    if [ "$1" == "--debug" -o "$1" == "-d" ]; then
        DEBUG=iteracion42:* npm start
        exit
    elif [ "$1" == "--production" -o "$1" == "-p" ]; then
        NODE_ENV=production pm2 start bin/www --watch
        exit
    fi
fi

echo "$0: illegal option."
echo "usage: $0 [ --debug | -d | --production | -p ]"