domingo, 22 de enero de 2017

Como trabajar con múltiples versiones con node js


TRABAJANDO CON MÚLTIPLES VERSIONES DE NODE JS

A veces necesitamos usar más de una versión de Node js en un mismo equipo (ordenador). Ya sea porque estamos trabajando con proyectos escritos en nuevas versiones de Node js, proyectos escritos en antiguas versiones de Node js ó tal vez porque no usamos Docker (pero este es un tema para otro artículo).
Para entender el caso planteado en este artículo, veamos un ejemplo:
Digamos que actualmente estoy trabajando mis proyectos antiguos con la versión 0.12.9 de Node js, pero tengo un proyecto nuevo en el cual el cliente me pide que trabaje con la versión 5.6.0 de Node js. Y como bien sabemos esta versión de Node js tiene un amplio soporte para características de ES6, así que ¿Por qué no ir practicando algo de ES6 en este proyecto? (claro, siempre que lo hagamos de una forma muy responsable).
Debido a que los motivos pueden ser muchos otros, en este artículo veremos como solucionar de una manera práctica esta situación.

ENTONCES, ¿CÓMO HAGO PARA TRABAJAR CON DISTINTAS VERSIONES DE NODE JS?

Afortunadamente para eso existen los paquetes Node js: nvm n, que seguramente no son la únicas opciones, pero por esta vez y debido a su simplicidad nos enfocaremos sólo en el paquete n.

¿QUÉ ES N?

es un paquete de Node js que se encarga de administrar las versiones de Node js, su instalación y uso es tan simple como su nombre.

¿CÓMO INSTALAR N?

Para instalar n, obviamente necesitamos tener instalado Node js. Una vez que tenemos instalado Node js, entonces simplemente instalamos n de forma global, con el siguiente comando:
sudo npm install -g n
También existen otras formas de instalarlo, por ejemplo compilandolo o mediante otros instaladores de terceros, si deseas instalarlo de diversas formas puedes revisar la documentación para esos casos.

¿CÓMO USO N?

Es sencillo, una vez que instalaste n de forma global, simplemente debes comenzar a instalar las versiones de Node js con las que deseas trabajar o las versiones entre las que quieres cambiar rápidamente, por ejemplo instalaremos las versiones 0.12.94.2.65.6.0respectivamente con los siguientes comandos:
sudo n 0.12.9
sudo n 4.2.6
sudo n 5.6.0
A continuación veremos el caso en el que tengo instaladas las versiones 4.2.65.6.0 e instalo la versión 0.12.9. 


Como podemos ver, es muy sencillo instalar versiones adicionales de Node js, y también podemos ver que simplemente con escribir n ó sudo n, dependiendo de cómo tengamos configurado nuestro sistema operativo, podremos elegir con que versión de Node js trabajaremos y podremos cambiar de versión cada vez que así lo deseemos, como se puede apreciar en el siguiente video:



¿CÓMO DESINSTALO VERSIONES DE NODE JS CON N?

Desinstalar versiones de Node js con n es muy simple. Por ejemplo el comando para desinstalar la versión 0.12.9 de Node js sería el siguiente:
sudo n rm 0.12.9 
En el siguiente video podemos ver cómo desintalar la versión 0.12.9 de Node js.


Espero que este artículo les sirva para poder instalar múltiples versiones de Node js en un mismo Sistema Operativo y administrar estas versiones rápidamente con el paquete n.

FUENTES

NPM. Interactively Manage All Your Node Versions. [En línea] [Fecha de consulta: 18 de Febrero del 2016].

Read More »

miércoles, 7 de diciembre de 2016

PRIMEROS PASOS CON WEBPACK

Webpack es un sistema de bundling para preparar el desarrollo de una aplicación web para producción. En cierta medida se puede considerar un Browserify avanzado ya que tiene muchas opciones de configuración.

También se puede considerar una evolución de Grunt y Gulp, ya que permite de alguna manera automatizar los procesos principales que son transpilar y preprocesar código de .scss a .css, de ES7 a ES5/6, etc...

Para poder utilizar Webpack en tu proyecto web debes tener instalado Node.js en tu equipo y con el comando npm install -g webpack tendrás Webpack instalado de forma global en tu equipo (También puedes instalarlo a nivel de proyecto y correrlo con NPM scripts).

El comando más sencillo para realizar un bundle de tus archivos JavaScript es el siguiente:
$ webpack ./index.js ./build/app.js

Este comando lo que hace es leer tu fichero index.js que sería el principal de tu aplicación e importar todos los módulos que estén definidos y crear el fichero de "producción" app.js en la carpeta build.

Por supuesto esto se puede complicar mucho más. En lugar de escribir todo como comandos, podemos tener un fichero webpack.config.js donde escribamos toda la configuración que necesitemos.

Webpack permite que trabajemos con cualquier tipo de archivo (CSS, preprocesadores CSS, preprocesadores de JavaScript, imágenes, etc...) Con indicarle que loader debe utilizar e instalarlo, nos es suficiente.

Gracias a esto podemos por ejemplo preprocesar el código JSX de nuestros componentes de React facilmente. Veamos que fichero de configuración de Webpack debemos escribir para ello y a continuación te explico cada línea:



El fichero exporta un objeto JavaScript con las siguientes configuraciones:

resolve: {  
  extensions: ['', '.js', '.jsx']
},
context: __dirname  

Con esto le indicamos a webpack que se fije en los ficheros con extensión .js y .jsx desde el directorio en el que se encuentra el fichero webpack.config.js hacia dentro. El resto los va ignorar en el proceso de bundling.

entry: {  
  app: ['./index.jsx']
},

Aquí le indicamos que el punto de entrada desde el que debe empezar a leer y realizar el proceso es el fichero index.jsx

output: {  
  path: './build',
  filename: 'app.js',
  publicPath: '/build/
},

Con ésta configuración le estamos indicando donde ha de situarse el fichero de salida, y será en la carpeta build con el nombre app.js. Si lo servimos desde un servidor de desarrollo, la ruta pública será /build.

module: {  
  loaders: [
    {
      test: /(\.js|.jsx)$/,
      loader: 'babel',
      query: {
        presets: ['es2015', 'stage-2', 'react']
      }
    }
  ]
}

Llegamos a la parte más interesante, los loaders. Aquí en el objeto loaders podemos incluir tantos como queramos, dependiendo del tipo de archivo que queramos modificar. Podemos tener un loader para ficheros JavaScript y JSX como el ejemplo, podemos tener otro para ficheros de estilos y montar el CSS, podemos tener otro para imágenes, etc...

En este caso le estamos indicando con la expresión regular /(\.js|.jsx)$/ que a todos los ficheros con extensión .js y/o .jsx les pase el loader de Babel, que instalaremos con el paquete de npm babel-loader. Además le añadimos unas opciones de configuración a Babel con el objeto query. Le indicamos que utilice el preset de es2015 para transpilar la sintaxis de JavaScript que aún no soporten los browsers a la versión que si soportan, también el preset stage-2 que nos permite utilizar algunas cosas de la próxima versión de ECMAScript7, y por último el preset react que permite el preprocesamiento de JSX a JavaScript.
Para poder utilizar estos presets debemos instalar los siguientes paquetes desde NPM:

$ npm install --save-dev babel-cli
$ npm install --save-dev babel-preset-es2015
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-react

con esto, si corremos el comando webpack en nuestra terminal, tendremos el fichero final en pocos segundos. Si creamos un npm script con el comando:
"scripts": {
  "build": "webpack --watch --colors"
}
Al correr npm run build tendremos ejecutando webpack en modo watch lo que significa que a cada cambio que hagamos en nuestro código, webpack creará el bundle de nuevo pero de una manera más rápida que por ejemplo con Browserify o Gulp ya que lo mantiene en memoria. Y con el flag --colors vemos de una manera más gráfica el resultado en la consola:

> webpack --watch --colors

Hash: 29e741b4cf44e481459f  
Version: webpack 1.13.2  
Time: 7316ms  
 Asset    Size  Chunks             Chunk Names
app.js  751 kB       0  [emitted]  app  
   [0] multi app 28 bytes {0} [built]
    + 172 hidden modules

Webpack como servidor de desarrollo

También tenemos la opción de crear un servidor web de desarrollo con webpack. Para ello debemos instalar otra dependencia que es webpack-dev-server:
$ npm install --save-dev webpack-dev-server
Y modificar nuestro fichero webpack.config.js con el siguiente bloque:

devServer: {  
  host: '0.0.0.0',
  port: 8080,
  inline: true
},

Esto nos va a crear un servidor (basado en Node.js y Express) de desarrollo en local, en el puerto 8080que servirá nuestra carpeta build. Necesitaremos crear un sencillo fichero index.html en la carpeta /build con lo siguiente para poder ver el resultado en el navegador:

<!DOCTYPE html>  
<html lang="en">  
<head>  
  <meta charset="UTF-8">
  <title>Ejemplo Webpack</title>
</head>  
<body>  
  <script src="/build/app.js"></script>
</body>  
</html>  

Con esto y el comando webpack-dev-server corriendo tendremos un servidor mostrando el contenido de la caperta build y recreando el fichero de bundle en cada cambio que hagamos.
Para probar esto, tengamos por ejemplo en el fichero index.jsx lo siguiente:

import Persona from './persona'

const carlos = new Persona('Falcon')  
carlos.saluda()  
Y en el módulo persona.jsx lo siguiente:

export default class Persona {  
  constructor (nombre) {
    this.nombre = nombre
  }

  saluda () {
    console.log(`Hola! Soy ${this.nombre}`)
  }
}
En ambos ficheros no estamos utilizando React, pero si la extensión JSX y la versión ES2015 de JavaScript.

Al salvar estos ficheros, se recreará el bundle y si en el navegador escribimos la URL: http://0.0.0.0:8080/build veremos en la consola JavaScript del navegador el mensaje:

Hola! Soy Falcon  

A medida que vayamos desarrollando, creando componentes de React, ficheros CSS, etc... éste entorno de desarrollo nos agiliza el desarrollo y nos permite ir más rápido y enfocarnos en nuestro código.

Read More »

lunes, 7 de noviembre de 2016

React y ES6

React.js es una librería de JavaScript lanzada hace poco más de un año por Facebook, normalmente utilizada en el Frontend aunque puede ser utilizada en el Backend. Facebook la utiliza en producción para su red social en determinadas partes, como los comentarios y también en Instagram.

No se trata de un framework JS de cliente como pueden ser Angular, Backbone o Ember, si no de una librería que se encarga del renderizado de las vistas de una aplicación web. Es la V del patrón MVC por así decirlo.

Una de las primeras cosas que vi y no me gustaban mucho de React era que parecía que mezclaba el HTML con código JavaScript, pero cuando lo pruebas ves que no es así, si no que usa un transformador de código JSX (Creado por Facebook) a JavaScript para facilitarnos la vida a la hora de programar, por ejemplo este código de React usando JSX:

var Item = React.createClass({  
    render: function() {
        return <div>Hello Item</div>
    }
});
Y sin usar la transformación JSX sería así:
var Item = React.createClass({  
    render: function() {
        return React.createElement('div', {}, 'Hello Item'); 
    }
});
Commo puedes ver, se ve de una forma más clara con JSX lo que estamos renderizando que usando ECMAScript 5/6 puro, y eso que este ejemplo es pequeño, si estamos usando más elementos HTML, con clases, eventos, etc... se puede hacer inmanejable.

Principales características de React

DOM Virtual

Lo que ha hecho que React se vuelva trending es su velocidad de renderizado de vistas. Eso es posible gracias a un Virtual DOM que genera React con cada componente que creamos y el algoritmo de Diff que básicamente lo que hace es marcar que elementos dentro de nuestro DOM Virtual tienen cambios para renderizar solo ellos y no tener que revisar y repintar el DOM entero de nuestra página. Dónde más tiempo se pierde en una aplicación web es en el renderizado y pintado del DOM. React evita eso y por eso es tan rápido.

Diseño orientado a componentes

React nos obliga a pensar en componentes. Es la nueva tendencia en el mundo del desarrollo Frontend. Al igual que en el backend se tiende a usar micro-servicios y librerías que resuelvan una cosa concreta, en el Frontend cada vez más se está extendiendo ésta práctica de componetizar los elementos de nuestras aplicaciones para poderlos reutilizar.

Usando ES6 con React

Con React podemos usar el nuevo estándar ECMAScript 6 (o ECMAScript 2015) para escribir nuestras aplicaciones y con Babel y Browserify tener una versión traducida a ES5 que funcione en los navegadores actuales.

Si en nuestro index.html tenemos añadidos los enlaces a los scripts de React.js y JSX tranformer, un componente como el anterior en ES5 es así:

var ItemRow = React.createClass({  
    render: function () {
        return (
            <li className="Item-row">
                Elemento de una lista
            </li>
        );
    }
});
Usando ES6, e instalando las dependencias de React por npm, sería algo así:

import React from 'react'

class ItemRow extends React.Component {  
    render() {
        return (
            <li className="Item-row">
                Elemento de una lista
            </li>
        )
    }
}

export default ItemRow  

A mi me parece más claro lo que estamos haciendo utilizando ES6. Un componente de React es una clase, que hereda de un React Component. Importamos el módulo de React de forma nativa con el sistema de módulos de ES6 y también podemos exportarlo para utilizarlo en otra parte de la aplicación.

Para que esto funcione en un navegador moderno, podemos usar Gulp junto con unos plugins y tareas para crear la versión de producción. Primero necesitamos tener instaladas las siguientes dependencias:

$ npm install --save-dev browserify
$ npm install --save-dev babelify
$ npm install --save-dev vinyl-source-stream

Y el fichero Gulpfile.js con una tarea para hacer el build de la parte JavaScript/JSX sería:

// gulpfile.js

var gulp = require('gulp');  
var browserify = require('browserify');  
var babelify = require('babelify');  
var source = require('vinyl-source-stream');

gulp.task('build', function() {  
    browserify({
        entries: './src/index.jsx',
        extensions: ['jsx'],
        debug: true
    })
    .transform(babelify)
    .bundle()
    .pipe(source('bundle.js')
    .pipe(gulp.dest('./build'))
});

Esta tarea toma el fichero src/index.jsx, el principal de la aplicación para usar browserify. Después le aplica la transformación de babelify que no es más que traducir ES6 a ES5 y crea un fichero bundle.js con toda nuestra aplicación y dependencias listo para usar en el navegador.
Read More »