Recientemente ha habido dos nuevas major release de dos de los indispensables actualmente en el mundo Javascript: Node y Babel. En concreto las versiones 5.0 y 6.0 reespectivamente. Si quieres ahorrarte el post hay un resumen abajo del todo.

Ya comenté como instalar ambos en el post de introducción sobre Javascript y como configurar nuestro ambiente de desarrollo. Sin embargo han cambiado algunas cosas en el funcionamiento de Babel, y tras probar recientemente la última versión de Ubuntu (Wily Werewolf) me he dado cuenta que las versiones de Node de los repositorios oficiales siguen congeladas en la rama 0.10.x.

En cambio en OSX con Homebrew si que está disponible ya la versión 5.0 de Node, pero durante esta semana me he visto obligado a usar una 0.10.x para probar cosas del blog en local, ya que Ghost no soporta aún las versiones nuevas.

Vaya lío de versiones ¿no? Bueno no es el fin del mundo. Tenemos soluciones para todo. Para no recurrir a respositorios de terceros, compilación de código, instalaciones manuales o soluciones engorrosas vamos a usar NVM.

Instalación de Node con NVM

NVM (Node Version Manager) es un script que se encarga de instalar las versiones de Node que le digamos y configurar nuestro ambiente con la que elijamos en cada momento. Simple ¿no?

Si ya tenéis instalada en vuestro sistema alguna versión de Node no hay problema, NVM no la modifica ni la sobreescribe, así que podéis seguir este tutorial igualmente. NVM se encarga de buscar los binarios en la página oficial de Node para el sistema que uséis y descargarlos. No compila código ni añade repositorios al sistema.

Para instalarlo sólo hay que ejecutar lo siguiente (da igual que versión de OSX ó Linux estéis usando):

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash  

El script se encargará de descargar lo necesario y añadir las variables a vuestro .bashrc, .zshrc ó .profile. Creará tambien la carpeta .nvm en el $HOME donde almacenará las versiones de Node y los paquetes que se instalen de forma global en cada una. Una vez acabe podéis probar a ejecutar nvm y mostrará la ayuda. Si por alguna razón da error es que el ambiente no está cargado, cerrad la terminal y arrancadla de nuevo.

El funcionamiento de nvm es sencillo. Me limitaré a explicar los comandos install, use y list que son los que usaremos más a menudo. Los comandos creo que son autoexplicativos pero pondré varios ejemplos.

nvm install 5.0      # Instala la última versión de la rama 5.0  
nvm install 0.10.23  # Instala una versión específica  
nvm install node     # Instala la última versión estable de la rama node  
nvm install iojs     # Lo mismo pero para io.js  
nvm install stable   # Instala la última versión estable  

En este momento 5.0, node y stable se corresponden con la misma versión 5.0.0, así que podeís instalar cualquiera de las tres. Cuando la instalación haya acabado, el script automáticamente ajusta el ambiente para la nueva versión. Sin embargo los cambios no son permanentes, si cerráis la terminal se pierden, por lo que es necesario usar el comand use.

nvm use 5.0      # Activa la última versión de la rama 5.0  
nvm use stable   # Activa la última versión estable  
nvm use 0.10.23  # Activa una versión en concreto  

La sintaxis es igual a la de install. Para activar cualquier versión es necesario haberla instalado antes. Basta con abrir una shell y usar el comando para tener nuestra instalación de Node disponible. Si no queréis hacer esto cada vez, podéis añadir nvm use VERSION con la versión que usáis regularmente a vuestro bashrc ó zshrc y se hará automáticamente (si usáis normalmente la shell para otras cosas no recomiendo hacerlo ya que añade un retraso al arrancar). Para desactivar el ambiente y restaurar el PATH podéis usar nvm deactivate.

El último comando es list que nos devuelve la lista de versiones que tengamos instaladas.

nvm list  
#        v0.10.40
# ->       v5.0.0
#          system
# node -> stable (-> v5.0.0) (default)
# stable -> 5.0 (-> v5.0.0) (default)
# iojs -> N/A (default)

Como vemos, node, stable y iojs son alias a las últimas versiones de cada rama. Vemos también dos versiones que hay instaladas y otra que se llama system. Ésta última es la versión que pudiéramos tener instalada a nivel de sistema, y la que se usará por defecto o en caso de que no tengamos ninguna otra.

Tenéis el resto de la documentación en el repositorio de NVM en Github. Hay otros comandos útiles como exec.

Babel 6.0

Con esta nueva versión ha habido cambios significativos en su uso. En concreto, a menos que desarrolléis plugins para Babel, hay dos que afectan a los usuarios: el transpiler se ha divivido en dos y ahora es necesario usar presets y plugins en función de qué necesitemos. El resto podéis consultarlas en su blog.

La parte de CLI se ha separado del core para no tener que instalar dependencias que no son necesarias. Básicamente ya no se instala necesariamente el CLI si estáis usando Babel como loader en Grunt, Gulp, Webpack, etc. Por lo que ahora, en lugar de instalar el paquete babel tendremos que instalar babel-cli para usarlo desde una shell.

# Para usar 'babel' y 'babel-node' desde la shell
npm install --global babel-cli

# Para instalarlo como dependencia de nuestro proyecto
npm install --save-dev babel-core  

No tiene gran complicación, solo saber que los nombres de los paquetes han cambiado y puede que tengáis que actualizar vuestros proyectos.

La otra novedad, es que las funcionalidades que proporcionaba Babel en conjunto se han dividido ahora en pequeños plugins. Será necesario por tanto instalar y configurar que cosas queremos añadir al transpiler de forma manual ó usando los nuevos presets.

Para resumir, tenemos plugins que añaden funcionalidades al transpiler y presets qué engloban conjuntos de plugins y configuraciones.

Lo bueno de esto es que ya no es necesario instalarlos de forma global con el CLI. Podéis activar unos u otros en función de que queréis probar y tenerlos sólamente instalados en las carpetas de vuestros proyectos

Por ejemplo, para activar el set de plugins para ES6 basta con instalar el preset es2015.

# De forma local
npm install babel-preset-es2015  

Y para usarlo luego solo hay que especificárselo al ejecutar babel-node.

babel-node --presets es2015 file.js  

Si en lugar de un preset queremos usar un plugin para probar una funcionalidad en concreto.

npm install babel-plugin-transform-es2015-arrow-functions  
babel-node --plugins transform-es2015-arrow-functions file.js  

Otra ventaja añadida es que podéis tener un preset establecido y probar nuevas implementaciones del lenguaje simplemente añadiendo nuevos plugins, ó por ejemplo probar vuestro proyecto con diferentes presets si queréis probar la compatibilidad con especificaciones futuras/antiguas.

Para establecer plugins y presets por defecto podéis crear el fichero .babelrc en el directorio que estéis trabajando (o de forma global en vuestro $HOME) y añadir lo que queráis usar. Para ES6, por ejemplo, bastaría con poner esto:

{
  "presets": ["es2015"]
}

En este enlace está la lista de plugins y presets oficiales de la gente de Babel, imagino que si os dáis una vuelta por Github encontraréis más.

Nota: Tras probar y echar uno ojo a la documentación de Babel para que sólo carga los presets de forma local y no global, si los instaláis con la opción npm install -g no funcionan y provoca una excepción. Mi recomendación es que tengáis un directorio con todo instalado a modo de sandbox para pruebas.

Resumen

Recapitulando, para tener una instalación "global" (realmente es a nivel de usuario, pero configurando todo de forma automática) habría que seguir estos pasos.

Paso 1: Instalación de NVM

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash  

Paso 2: Instalar Node

nvm install 5.0  
nvm use 5.0  

Paso 3: Instalar Babel 6.0 como ejecutable y el preset de ES6 en la carpeta de tu proyecto

npm install -g babel-cli  
# cd your-folder-project
npm install babel-preset-es2015  

Paso 4: Usar Babel con el preset

babel-node --presets es2015 file.js  

Opcional: Establecer Node 5.0 y el preset es2015 en Babel por defecto

echo "nvm use 5.0" >> $HOME/.bashrc  
echo "nvm use 5.0" >> $HOME/.zshrc  
echo "{ \"presets\": \"es2015\" }" > $HOME/.babelrc  

Con esto podemos tener no sólo un ambiente de desarrollo actualizado sino homogéneo en todas nuestras máquinas independientemente de la plataforma. Usando NVM podemos además instalar en cualquier momento otra versión de Node que nos haga falta momentáneamente sin tener que tocar archivos del sistema, o tener ambientes con distintas dependencias instaladas a nivel global para testear compatibilidad en migraciones.

Si en algún momento queréis deshaceros de todo y dejar el sistema limpio basta con borrar la carpeta $HOME/.nvm y eliminar de vuestro .bashrc ó .zshrc las líneas que añade el script.