Investigación y desarrollo de una aplicación con tecnología NodeJS



Monografias.com

¿Qué es Node.js?

Básicamente el Node JS es una implementación de JavaScript bajo el Runtime V8 (Con el que se Desarrolló Google Chrome) que permite que JavaScript funcione como lenguaje utilizable del lado del Servidor. De esta forma se puede trabajar del lado del cliente y del servidor con el mismo conocimiento para el desarrollo de desde aplicaciones para celulares, Web Services, hasta sockets y real-time apps, entre otras cosas.

Node.js puede hacer

¿Qué es un archivo de Node.js?

¿Por qué Node.js?

¡Node.js utiliza la programación asíncrona!

Una tarea común para un servidor web puede ser abrir un archivo en el servidor y devolver el contenido al cliente.

Así es como PHP o ASP maneja una petición de archivo:

Así es como Node.js maneja una petición de archivo:

Node.js elimina la espera, y simplemente continúa con la siguiente petición.

Node.js se ejecuta, sin bloqueo de un solo subproceso, programación asíncrona, que es muy eficiente de la memoria.

Algunas Características

Funcionamiento de NodeJS

Al estar basado en el motor V8, está diseñado para correr en un navegador y ejecutar el código de JavaScript de una forma extremadamente rápida.

Su Tecnología nos permite ejecutar este motor en el lado del servidor, abriendo un nuevo abanico de posibilidades en cuanto al mundo de desarrollo se refiere. Para ello su entorno ha desarrollado un conjunto amplio de librerías comparables a las de otras plataformas. Y, por otro lado, se han eliminado algunas funcionalidades que en el entorno de servidor no tenían sentido como por ejemplo el uso de Document Object Model. Además trabaja con un único hilo de ejecución (Single Thread) que es el encargado de organizar todo el flujo de trabajo que se deba realizar.

Single Thread (único hilo)

La idea principal de Node.js: uso no bloqueante, event driven I/O, permanecer ligero y eficiente en la superficie del uso intensivo de datos en tiempo real de las aplicaciones que se ejecutan en dispositivos distribuidos.

Frente a las tradicionales técnicas de servicio web donde cada conexión (solicitud) genera un nuevo subproceso, retomando la RAM del sistema y finalmente a tope a la cantidad de RAM disponible, Node.js opera en un solo subproceso, no utiliza el bloqueo de llamadas de E/S, esto permite admitir decenas de miles de conexiones simultáneas.

Programación Asíncrona

Éste es un concepto que toma especial importancia, dado que NodeJS fue pensado desde el primer momento para potenciar los bene?cios de la programación asíncrona.

Imaginemos que un programa tiene un fragmento de código que tarda cinco segundos en resolverse. En la mayoría de los lenguajes de programación precedentes, durante todo ese tiempo el hilo de ejecución se encuentra ocupado, esperando a que pasen esos cinco segundos, o los que sea, antes de continuar con las siguientes instrucciones. En la programación asíncrona eres capaz de liberar el proceso de modo que los recursos se quedan disponibles para hacer otras cosas durante el tiempo de espera.

Un ejemplo claro de esto es una llamada a un servicio web, o una consulta a la base de datos. Una vez realizada la solicitud generalmente pasará un tiempo hasta que se obtenga la respuesta. Ese tiempo, por corto que sea, dejaría un proceso esperando en la programación tradicional y en la asíncrona simplemente se libera.

En Node JS, o en Javascript en general, cuando esa espera ha terminado y se ha recibido la respuesta, se retomará la ejecución del código. Para de?nir las acciones a realizar (código a ejecutar) cuando se haya terminado esa espera, se especi?ca el código mediante funciones llamadas habitualmente "callbacks". Esas funciones contendrán las líneas de código que ejecutan al de esos procesos de espera, y una vez se ha recibido la respuesta.

Monografias.com

NPM: El Node Package Manager

La herramienta de gestor de paquetes "NPM (package manager)" viene por defecto con cada instalación de Node.js.

El código se organiza por medio de módulos, la idea de los módulos NPM es muy similar a la de Ruby o java: un conjunto de componentes reutilizables, como los paquetes o librerías, disponibles públicamente a través de una fácil instalación a través de un repositorio en línea, con la versión y la dependencia de gestión.

Una lista completa de los paquetes de módulos puede encontrarse en el sitio web de NPM Https://npmjs.org/.

El módulo es un ecosistema abierto a todos, y cualquiera puede publicar su propio módulo que será incluido en el repositorio de NPM.

NPM

Incluir módulos con "require"

Javascript nativo no da soporte a los módulos. Esto es algo que se ha agregado en NodeJS y se realiza con la sentencia require ( ), que está inspirada en la variante propuesta por CommonJS.

La instrucción require () recibe como parámetro el nombre del paquete que queremos incluir e inicia una búsqueda en el sistema de archivos, en la carpeta "node_modules" y sus hijos, que contienen todos los módulos que podrían ser requeridos.

Podemos crear fácilmente nuestros módulos exportando las funciones que deseemos, también podemos escribir nuestros propios módulos y para ello usamos module.exports. Escribimos el código de nuestro módulo, con todas las funciones locales que queramos, luego hacemos un module.exports = {} y entre las llaves colocamos todo aquello que queramos exportar.

Comando npm para gestión de paquetes

Por lo que respecta al uso de npm, es un comando que funciona desde la línea de comandos de NodeJS. Por tanto lo tenemos que invocar con npm seguido de la operación que queramos realizar.

npm install [paquete]

Esto instalará el paquete async dentro delproyecto. Lo instalará dentro de la carpeta "node_modules" y a partir de ese momento estará disponible en el proyecto y podrá incluirlo por medio de "require".

Instalar paquetes de manera global con npm

Estos paquetes, una vez instalados, se convierten en comandos disponibles en terminal, con los que se pueden hacer multitud de cosas.

Existen cada vez más módulos de Node que nos ofrecen muchas utilidades para los desarrolladores, accesibles por línea de comandos, como Bower, Grunt, etc.

Las instrucciones para la instalación de paquetes de manera global son prácticamente las mismas para la instalación de paquetes en proyectos.

En este caso simplemente colocamos la opción "-g" que permite que ese comando se instale de manera global en tu sistema operativo.

npm install -g grunt-cli

Algunas de sus Ventajas

Se maneja a base de eventos capaz de escalar simultáneas conexiones a la vez, además trabaja de manera asincrónica (es decir en un segundo plano, mientras las solicitudes van llegando, otras se están ejecutando).

Algunas de sus Desventajas

Nuestro Ejemplo de aplicación NodeJS

Tomaremos un aspecto práctico en NodeJS creando una pequeña aplicación de chat orientada a eventos.

Monografias.com

Visión general de la aplicación

La aplicación permite a los usuarios chatear en línea entre sí, introduciendo mensajes en un formulario simple. Un mensaje, una vez ingresado, se envía a todos los demás usuarios en la misma sala de Chat.

Al iniciar la aplicación, se asigna automáticamente a un usuario un nombre de invitado, pero pueden cambiarlo introduciendo un comando. Los Comandos de Chat son precedidos por una barra diagonal (/).

Del mismo modo, un usuario puede ingresar un comando para crear una nueva sala de chat (o unirse a ella si ya está existe. Al unirse o crear una sala, el nuevo nombre de la sala se mostrará en la barra horizontal en la parte superior de la aplicación de Chat. La sala también se incluirá en la lista de salas disponibles a la derecha del área de mensajes de Chat. Después de que el usuario cambie a una nueva sala, el sistema confirmará el cambio.

La aplicación muestra cómo NodeJS puede servir simultáneamente datos HTTP (como archivos estáticos) y datos en tiempo real (mensajes de Chat). También muestra cómo las aplicaciones de NodeJS están organizadas y cómo se gestionan las dependencias.

Requisitos de la aplicación y configuración inicial

La aplicación de chat necesita hacer lo siguiente:

Para servir archivos estáticos, usará el módulo http integrado en NodeJS. Pero al servir archivos a través de HTTP, generalmente no es suficiente enviar el contenido de un archivo; también debes Incluir el tipo de archivo que se envía.

Para manejar la mensajería relacionada con el chat, puede realizar un sondeo en el servidor con Ajax. Pero para hacer esta aplicación tan sensible como sea posible, evitará usar el Ajax tradicional como un medio para enviar mensajes. Ajax utiliza HTTP como mecanismo de transporte, y HTTP no fue diseñado para la comunicación en tiempo real. Cuando se envía un mensaje utilizando HTTP un nuevo TCP/IP debe utilizarse en la conexión.

Abrir y cerrar las conexiones lleva tiempo, y el tamaño de la transferencia de datos es mayor porque HTTP envían los encabezados en cada solicitud.

En lugar de emplear una solución HTTP, esta aplicación preferirá WebSocket

(Http://en.wikipedia.org/wiki/WebSocket), que fue diseñado como un ligero protocolo bidireccional de comunicaciones de apoyo en tiempo real.

Ya que los navegadores compatibles, en su mayor parte, admiten WebSocket, la Aplicación aprovechará la popular biblioteca Socket.IO (http://socket.io/), que proporciona una serie de fallbacks, incluyendo el uso de Flash. Socket.IO maneja la funcionalidad de fallback de forma transparente.

Servidor HTTP y WebSocket

Aunque esta aplicación evitará el uso de Ajax para enviar y recibir mensajes, seguirá utilizando HTTP para entregar el HTML, CSS, y JavaScript del lado del cliente necesario para configurar las el navegador del usuario.

NodeJS puede manejar fácilmente simultáneamente HTTP y WebSocket con una solo puerto TCP/IP, viene con un módulo que proporciona Funcionalidad de servicio HTTP.

Estructura del archivo de la aplicación

Para comenzar la aplicación, contiene un directorio de proyecto para ello los archivos principales de la aplicación irá directamente en este directorio. Contiene un subdirectorio llamado "lib", dentro del cual se colocará alguna lógica del lado del servidor. Además contiene un subdirectorio donde los archivos del lado del cliente serán metido (public). Dentro del subdirectorio public, existe un subdirectorio javascripts y CSS una hoja

NodeJS no requiere que mantenga una estructura de directorio particular;

Los archivos de aplicación se pueden organizar de cualquier manera.

chatrooms

|---->lib

|---->public

|---->js

|---->css

|>package.json

|>Server.js

Monografias.com

Especificación de dependencias

Aunque puede crear aplicaciones de NodeJS sin especificar formalmente dependencias, es un buen hábito tomar el tiempo para especificarlos. De esta forma, si desea que otros utilicen su aplicación, o planea ejecutar en más de un lugar, se vuelve más sencillo de configurar.

Las dependencias de la aplicación se especifican utilizando un archivo package.json. Este archivo esta siempre en el directorio raíz de una aplicación. Un archivo package.json consiste en una expresión JSON que sigue el estándar descriptor del paquete CommonJS (http://wiki.commonjs.org/wiki/Packages/1.0) y describe su aplicación. En un archivo package.json puede especificar muchas cosas, pero las más importantes son el nombre de su aplicación, la versión, una descripción de lo que hace la aplicación y la dependencias de la aplicación.

{

"name": "chatrooms",//Nombre del paquete

"version": "0.0.1",

"description": "Multiroom chat server",

"dependencies": { //Dependencias del paquete

"mime": "~1.2.7",

"semantic-ui": "^2.2.10",

"socket.io": "~0.9.6"

}

}

Instalando dependencias

Con un archivo package.json definido, la instalación de las dependencias de su aplicación se vuelve trivial. El Administrador de Paquetes de NodeJS (npm; https://github.com/isaacs/npm) es una utilidad que viene con NodeJS. Ofrece una gran cantidad de funcionalidad, lo que le permite instalar fácilmente módulos de NodeJS de terceros y publicar globalmente cualquier módulo de NodeJS qué cree usted mismo. Otra cosa que puede hacer es leer las dependencias de los archivos package.json e instalar cada uno de ellos con un solo comando, (npm install).

Servidor básico de archivos estático

Para crear un servidor de archivos estático, aprovecharemos parte de la funcionalidad incorporada de NodeJS, así como el complemento de mime de terceros para determinar un tipo MIME de archivo.

Para iniciar el archivo principal de la aplicación, denominado server.js, guardado en la raíz del directorio del proyecto, contiene las declaraciones de variables.

Estas declaraciones le darán acceso a la funcionalidad relacionada con HTTP de NodeJS, a la capacidad de interactuar con el sistema de archivos, la funcionalidad relacionada con las rutas del archivo y la capacidad de tipo de archivo MIME. La variable de caché se utilizará para almacenar en caché los datos del archivo.

var http = require('http');

El módulo http incorporado proporciona funcionalidad de servidor HTTP y cliente.

var fs = require('fs');

El módulo fs incorporado proporciona funcionalidad relacionada con el sistema de archivos.

var path = require('path');

El módulo "path" incorporado proporciona funcionalidad relacionada con la ruta del sistema de archivos.

var mime = require('mime');

Módulo complementario "MIME" proporciona la capacidad de derivar un tipo MIME basado en una extensión de nombre de archivo.

var cache = { };

Objeto de caché es donde se almacenan los contenidos de los archivos almacenados en caché.

El acceso al almacenamiento de memoria (RAM) es más rápido que el acceso al sistema de archivos. Debido a esto, es común que las aplicaciones de NodeJS almacenen en caché los datos más utilizados en la memoria. Nuestra aplicación de chat almacenará en caché los archivos estáticos en la memoria, solo se leerán desde el disco la primera vez que se accede a ellos. El siguiente ayudante determina si un archivo se almacena en caché y, si es así, lo sirve. Si un archivo no se almacena en caché, se lee desde el disco y se sirve. Si el archivo no existe, se devuelve un error HTTP 404 como una respuesta.

Visión general de la aplicación NodeJS

Monografias.com

Monografias.com

Conclusión

Es una herramienta para todo tipo de usos: Aplicaciones web, aplicaciones en línea de comandos, scripts para administración de sistemas, todo tipo de aplicaciones de red, etc.

NodeJS definitivamente no es un programa de servidor, el producto base no es como Apache o Tomcat. De forma similar a como Apache puede agregar un módulo PHP para permitir a los desarrolladores crear páginas Web dinámicas, y un módulo SSL para conexiones seguras, también tiene el concepto de módulos que se pueden agregar a su núcleo mismo.

NodeJS cambia la forma en que se realiza una conexión con el servidor. En lugar de generar un nuevo hilo para cada conexión (y asignar la memoria acompañante), cada conexión dispara una ejecución de evento dentro del proceso del motor de NodeJS.

Además de la alta velocidad de ejecución de Javascript, detrás de Node.js existe algo que se llama Bucle de Eventos (Event Loop) que gestiona todas las operaciones asíncronas. (Para escalar grandes volúmenes de clientes, todas las operaciones intensivas I/O en Node.js se llevan a cabo de forma asíncrona.); cuando una aplicación necesita realizar una operación de bloqueo (operaciones I/O como trabajo con archivos… etc.) envía una tarea asíncrona al Event Loop, junto con un callback, y luego continúa.

Comunidad

Existe  una  comunidad  muy  activa  de  desarrolladores  de  Node.js  que  se  comunican  a  través  de  grupos  de  discusión, nodejs  (http://groups.google.com/group/nodejs)  y  nodejs­dev  (http://groups.google.com/group/nodejs­dev)  y  el canal  IRC  #node.js  en  freenode.  La  comunidad  se  reúne  en  NodeConf  (http://nodeconf.com/),  una  convención  de desarrolladores centrada en Node.js.

N O D E . J S - P R I M E R O S P A S O S -

[1] Ejecutamos la consola de NodeJS

[2] Verificamos la ruta especifica del proyecto ejemplo [C:\Users\HP\Desktop\chatrooms]

Accedemos a cada directorio con el comando [cd]

cd chatrooms

[3]Importar módulos a nuestro proyecto de manera local.

[ npm install]

Instala todas las dependencias del paquete: [package.json]

[4]Ejecutaremos el archivo server.js con la sentencia:

[ node server.js ]

[5]En el browser ejecutamos [ localhost:8080 ]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Si queremos salir y parar la ejecución de Node.js, usaremos CTRL+C.

Bibliografía

Node.js Tutorial. In: Node.js Tutorial. https://www.w3schools.com/nodejs. Accessed 2017

Google. In: Google. https://www.google.com.ar/?gws_rd=ssl#q=node js. Accessed 2017

Cantelon M, Harter M, Holowaychuk TJ, Rajlich N (2014) Node.js in action. Manning, Shelter Island

Holmes S (2016) Getting MEAN With Mongo, Express, Angular, and Node. Manning Publications, Shelter Island, NY

Newest 'node.js' Questions. In: Newest 'node.js' Questions - Stack Overflow. http://stackoverflow.com/questions/tagged/node.js. Accessed 2017

Node.js Fde Node.js. In: Node.js. https://nodejs.org/es. Accessed 2017

Sitio oficial (http://nodejs.org) (inglés)

Repositorio de código fuente (https://github.com/joyent/node) (inglés)

NPMJS. El gestor de paquetes de Node.js (http://npmjs.org/) (inglés)

Monografias.com

 

Universidad Nacional de la Matanza

Técnicatura en Desarrollo WEB

Monografias.com

Apellido y Nombre del Alumno: Objetivos del trabajo práctico

El objetivo de este documento es indagar en esta nueva tecnología, conocer sus ventajas y saber específicamente para qué entorno de desarrollo puede ser más óptima su utilización.

 

 

 

Autor:

Canosa Ezequiel.