Node.js es una de las tecnologías «de moda» desde hace unos años y junto con la aparición de librerías y frameworks para facilitar el desarrollo de clientes enriquecidos en javascript, el gran responsable de que javascipt haya pasado de ser un lenguaje para añadir efectos simples en páginas web a ser un lenguaje usado en muchos proyectos «serios».
La propia página de node.js lo define como:
Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications.
Casi todo el mundo conoce node.js por esa faceta: poder crear fácilmente servidores para aplicaciones web y, en general, cualquier tipo de aplicación con una alta carga de entrada/salida. Lo que es menos conocido, sobre todo por la gente que no está muy metida en la comunidad de desarrollo javascript, es que node.js es mucho más y ofrece todo un ecosistema de herramientas que son muy útiles incluso si no estamos desarrollando una aplicación sobre node.js.
Desarrollar software no es sólo una cuestión de programar aquello que nos pide el cliente. Para desarrollar software de forma eficaz necesitamos contar con otras aplicaciones y herramientas que faciliten nuestro trabajo y nos ayuden a gestionar el proceso de desarrollo de una manera más cómoda y productiva.
Para la mayoría de desarrolladores .NET las herramientas empiezan y acaban en Visual Studio (algo lógico si tenemos en cuenta que probablemente sea uno de los mejores IDEs en la actualidad), pero en otras plataformas donde no hay un fabricante con un dominio tan claro del mercado, existe una mayor diversidad de herramientas y se tiende a tener pequeñas herramientas muy personalizables e interoperables con las que construir nuestro propio entorno de trabajo ajustado a las necesidades de cada proyecto.
En Ruby o Python, por ejemplo, es muy habitual que los proyectos incluyan diversos scripts, generalmente programados en el mismo lenguaje que la aplicación, para realizar tareas como ejecutar tests unitarios, generar paquetes de despliegue, actualizar documentación, etc.
Con node.js podemos disponer de muchas herramientas de este tipo que nos ayudan a mejorar nuestros procesos de desarrollo, y estas herramientas no son sólo útiles cuando estamos desarrollando una aplicación que luego se va a ejecutar sobre node.js. Por ejemplo, podemos estar desarrollando una aplicación con un backend usando WebAPI y un frontend basado en una SPA, y toda la parte de frontent hacerla desde fuera de Visual Studio, aprovechando herramientas desarrolladas sobre node.js.
Como estas cosas se ven mejor con ejemplos, vamos a ver algunas de las cosas que podemos hacer aprovechando node.js.
Comprobar la validez de nuestro javascript con jshint
Que javascript es un lenguaje dinámico lo sabemos todos, y que tiene sus «peculiaridades» también. Al ser un lenguaje dinámico no tenemos una fase de compilación como tal que nos permita detectar errores, pero existen herramientas como jshint que al menos nos ayudan a detectar errores sintácticos y nos pueden avisar de potenciales problemas.
Para utilizar jshint desde node.js primero tenemos que instalarlo:
npm install -g jshint
Y a continuación ejecutarlo sobre los ficheros que queramos:
jshint file.js
jshint tiene un montón de opciones para ajustar la forma en que queremos validar los ficheros, por lo que os recomiendo que le echéis un vistazo a la documentación antes de empezar a usarlo.
Ejecutar tests unitarios con jasmine
Ya que hemos hecho una validación somera de ficheros usando jshint, nada mejor que ejecutar unos tests sobre nuestro código hacer una comprobación más en profundidad. Sobre node.js podemos usar muchas librerías de tests, algunas incluso nos permiten ejecutar los tests en un browser real (como karma), pero vamos a ver una de las más sencillas: jasmine. La instalamos usando npm:
npm install -g jasmine-node
Y la ejecutamos sobre nuestros ficheros de test:
jasmine-node spec/
Reducir el tamaño de ficheros javascript con UglifyJS
Una de las cosas más habituales antes de poner en producción una aplicación desarrollada con javascript, es unificar los ficheros javascript y reducir su tamaño para mejorar el tiempo de descarga (algunos dirán que también para ofuscarlos y que no sea fácil ver el código fuente).
Hay varias herramientas para node.js que nos permiten hacer eso. Una de ellas es UglifyJS. Utilizarla es muy sencillo, la instalamos con:
npm install -g uglify-js
Y podemos invocarla con:
uglifyjs file1.js file2.js -o app.min.js
En la página de UglifyJS podéis encontrar muchas más opciones para controlar este proceso.
Compilar hojas de estilo con less
Cualquier que haya trabajado con hojas de estilo CSS para algo medianamente complejo, se habrá dado cuenta de que CSS es un lenguaje muy limitado y que no ayuda en absoluto a estructurar el código. Existen varios lenguajes que aumentan las capacidades de CSS para tratar de paliar estos problemas. Las más conocidas son Sass y less. Para usar less desde node.js, sólo necesitamos instalarlo usando npm:
npm install -g less
Después ya podremos invocarlo:
lessc styles.less > styles.css
Resumen
Aunque no estemos desarollando una aplicación para node.js, si estamos desarrollando una aplicación que incluya tecnologías web, podemos aprovecharnos de muchas herramientas muy útiles creadas sobre esta plataforma.
Una cosa que me parece muy atractiva de todo este tipo de herramientas es que están desarrolladas en javascript y toda la configuración se suele realizar utilizando javascript, ya sea a través de ficheros JSON o de código ejecutable javascript. Esto hace que sea muy sencillo personalizarlas y adaptarlas al flujo de trabajo que queremos aplicar a nuestro proyecto concreto.
En este post hemos visto algunos ejemplos (hay muchas más herramientas), pero si eres un buen programador y, por tanto, vago, te habrás dado cuenta de que implican un montón de trabajo estar lanzando continuamente todas estas herramientas por línea de comandos cada vez que realizamos un cambio en un fichero javascript y queremos probar el resultado.
No te preocupes, ahora que ya nos hemos hecho una idea de lo que pueden hacer estas herramientas por nosotros, en el siguiente post veremos cómo usar otra herramienta para automatizar la ejecución de todas estas tareas y que nuestro flujo de trabajo sea mucho más cómodo y ágil.
Hola, sé que esta es una pregunta muy de principiante en node.js y frameworks de javascript,
pero cómo alojas las aplicaciones webe n producción? Lo digo porqu een España no hay ninguna empresa de hoosting que incluya node.js por lo que veo.
Un saludo
Hola Igor,
No sé si hay empresas en España, pero si no te importa que sean extranjeras, hay muchas opciones.
Por ejemplo en Windows Azure puedes desplegar aplicaciones node e incluso enlazarlas con el repositorio en Github para hacer despliegues continuos (o al menos automatizados). Además es muy sencillo de manejar.
Saludos.
Hola Juan Ma, en serio que muchas gracias por tus aportes en este blog. Aunque soy Desarrollador Web, estoy más enfocado en el PHP. He hecho de todo, desde todo tipo de páginas Web y aplicaciones Web. Ahora me enfrento a todo este nuevo reto de frameworks no solo en lenguaje que manejo (Yii, laravel, etc.), sino también con framewokrs javascript, y veo que es un está en pleno auge.
Me has dado varias luces, como distinguir entre una página a una aplicación y tus impresiones después de una año con angular, o incluso ésta de node.js que está excelente. Pero aún me resulta un poco confuso por donde emprender, así que quisiera tu consejo.
Por cual podría inclinarme para aprender y que me sea útil para las labores que pueda ejecutar?
Sé que puede sonar muy ambigüo, pero en verdad apreciaría tu opinión al respecto
Gracias, Diego, me alegro mucho de que te resulte útil lo que escribo.
Es una pregunta complicada la que me haces. Yo si tuviera que empezar de cero (o con poco conocimiento), empezaría por aprender bien el lenguaje antes de meterme en un framework complicado. Dominando Javascript, jQuery, y algo como handlebars para montar templates, puedes llegar bastante lejos y lo que aprendas te servirá luego. Si te metes con un framework más pesado seguramente seas más productivo inicialmente, pero mucho de lo que aprendas será demasiado específico como para aplicarlo cuando quieras (o necesites) cambiar a otro.
En general, y como ya has visto en los posts que mencionas, ahora mismo me inclino más por ir construyendo la aplicación a base de librerías en lugar de usar frameworks. Creo que aunque pueda resultar algo más complicado al principio te da más libertad y te permite comprender mejor lo que estás haciendo.
Un saludo,
Juanma