Node.js Paso a Paso Introducción

Node.js es una tecnología nueva e increíble, pero, a menos que seas un desarrollador de JavaScript específicamente, el proceso de familiarización con él puede convertirse rápidamente en algo abrumador. ¡Pero por eso estamos aquí! Si quieres De Verdad aprenda cómo usar Node.js, este conjunto de artículos y screencasts hará el truco.


Una introducción a Node.js


Transcripción de Screencast

Hola chicos, mi nombre es Christopher Roach, y seré su guía en esta serie de capturas de pantalla en Node.js. En esta serie usaremos Node para crear un motor de blog simple, como el que se hizo famoso en el popular video introductorio de Ruby on Rails. El objetivo de esta serie es ofrecerle al espectador una sensación real de cómo funciona Node, de modo que, incluso cuando trabaje con cualquiera de los marcos de desarrollo web populares, como Express o Getty, se sienta lo suficientemente cómodo con el funcionamiento interno de Node para poder desplegar en su origen y realizar cambios para satisfacer sus necesidades según sea necesario.


Instalación

Antes de entrar en algunos de los detalles de qué es Node y por qué querría usarlo, me gustaría seguir adelante y comenzar con la instalación de Node, ya que, aunque es muy fácil, puede llevar algo de tiempo..

Node aún es muy joven y está en desarrollo activo, por lo que es mejor instalarlo desde la fuente.

Node aún es muy joven y está en desarrollo activo, por lo que es mejor instalarlo desde la fuente. Dicho esto, Node tiene muy pocas dependencias, por lo que la compilación no es tan complicada como otros proyectos con los que quizás hayas luchado en el pasado. Para obtener el código, visite el sitio web Node.js. Si recorres la página hacia la sección de descargas, encontrarás un par de opciones. Si tiene Git instalado, puede hacer una copia del repositorio e instalar desde allí. De lo contrario, hay un enlace a un archivo comprimido que puede descargar en su lugar. En este video, mantendré las cosas simples e instalaré desde el tarball..

Mientras se está descargando, ahora es un buen momento para mencionar que se están realizando esfuerzos para proporcionar un puerto de Node para Windows, y hay instrucciones para instalar en Windows para Cygwin o MinGW. Creo que incluso hay algunos paquetes binarios que se pueden instalar, pero en el momento de escribir esto, su entorno principal es Unix y plataformas basadas en Linux. Si está en una máquina con Windows, puede hacer clic en el enlace para obtener instrucciones de construcción y seguir el conjunto de instrucciones para una instalación de Windows o puede instalar una versión de Linux, como Ubuntu, e instalar Node allí..

Cuando termine de descargar, simplemente descomprima y descomprima el paquete con tar -xvf y discos compactos en el directorio que creó. Primero tenemos que hacer un ./ configurar, entonces hacer, y finalmente hacer instalar. Eso tomará un poco de tiempo construirlo, así que lo dejaré en segundo plano y aprovecharé esta oportunidad para hablar un poco más sobre Node y por qué está causando tanto revuelo en la comunidad de desarrollo web..


Introducción al nodo

Nodo es JavaScript en el servidor.

Entonces, si este artículo y este video son su primera introducción a Node, probablemente se esté preguntando qué es y qué hace que valga la pena aprender cuando ya existen muchos otros marcos de desarrollo web para elegir. Bueno, para empezar, una razón que debería preocuparte es que Node es JavaScript en el servidor, y seamos sinceros, si trabajas en la web, lo amas o lo odias, tendrás que trabajar con JavaScript en algún momento. . Usar JavaScript como su lenguaje de fondo, así como para el lado del cliente, significa mucho menos cambio de contexto para su cerebro.

Oh, sé lo que estás pensando: "por lo que Node es JavaScript en el servidor, bueno, eso es genial, pero ha habido otros intentos de JavaScript en el servidor en el pasado que básicamente han fracasado".

Lo que hace a Node diferente del resto?

Bueno, la respuesta corta es: Nodo es el servidor de JavaScript finalmente hecho correctamente. Donde otros intentos básicamente han sido puertos de frameworks web tradicionales MVC al lenguaje JavaScript, Node es algo completamente diferente. De acuerdo con su sitio web, Node está programado como I / O para V8 JavaScript, pero ¿qué significa eso exactamente? Empecemos con V8.

V8 es la implementación de JavaScript súper rápida de Google que se usa en su navegador Chrome.

A través de una aplicación realmente ingeniosa de la compilación "Just in Time", V8 puede alcanzar velocidades para JavaScript que hacen que los usuarios de otros lenguajes dinámicos, como Python y Ruby, se pongan verdes de envidia. Eche un vistazo a algunos de los puntos de referencia y creo que se sorprenderá. V8 JavaScript está arriba con muchos lenguajes basados ​​en JVM como Clojure y Java y lenguajes compilados, como Go en muchos casos.

La capacidad de JavaScript para pasar los cierres hace que la programación basada en eventos sea muy simple.

La otra frase clave en esa declaración es E / S eventual. Este es el biggie. Cuando se trata de crear un servidor web, básicamente tiene que tomar dos decisiones al tratar con múltiples solicitudes de conexión simultáneas. La primera, que es la ruta más tradicional que toman los servidores web, como Apache, es usar hilos para manejar las solicitudes de conexión entrantes. El otro método, el tomado por Node y algunos servidores modernos extremadamente rápidos como Nginx y Thin, es usar un solo hilo no bloqueante con un bucle de eventos. Aquí es donde la decisión de usar JavaScript realmente brilla, ya que JavaScript fue diseñado para ser utilizado en un entorno de bucle de eventos de un solo hilo: el navegador. La capacidad de JavaScript para pasar los cierres hace que la programación basada en eventos sea muy simple. Básicamente, simplemente llama a una función para realizar algún tipo de E / S y le pasa una función de devolución de llamada y JavaScript crea automáticamente un cierre, asegurándose de que se mantenga el estado correcto incluso después de que la función de llamada haya estado fuera de alcance. Pero todo esto es solo una jerga técnica y estoy seguro de que te mueres por ver algún código en acción. Voy a avanzar un poco hasta el final de esta instalación, para que podamos comenzar a jugar con nuestra nueva copia de Node recién acuñada..


Confirmando la instalación

Entonces, parece que mi compilación finalmente ha terminado; Quiero comprobar rápidamente y asegurarme de que todo haya ido bien con la instalación. Para hacerlo, simplemente ejecuta nodo --version desde la línea de comandos, y debería ver alguna indicación de que está ejecutando la última versión de Node que, en este momento, es la versión 0.4.5. Si ve una versión impresa, puede estar seguro de que todo salió bien y está listo para escribir su primera aplicación Node. Entonces vamos discos compactos vuelva a nuestro directorio de inicio y cree una nueva carpeta para mantener todo nuestro trabajo durante el curso de esta serie de capturas de pantalla. Aquí simplemente voy a llamar mío 'Blog'y vamos a discos compactos en eso para empezar.


Nodo - El marco del servidor

A diferencia de otros marcos, Node no es estrictamente para desarrollo web. De hecho, puede pensar en Node como un marco para el desarrollo de servidores de cualquier tipo. Con Node puede crear un servidor IRC, un servidor de chat o, como veremos en este conjunto de tutoriales, un servidor http. Entonces ya que no podemos tener un tutorial introductorio sin el obligatorio 'Hola Mundo'aplicación, vamos a empezar con eso.


Hola Mundo

Vamos a crear un nuevo archivo llamado app.js. Ahora Node incluye varias bibliotecas para facilitar el desarrollo de servidores basados ​​en eventos. Para usar una de las bibliotecas disponibles, simplemente incluya su módulo usando la función requerida. La función requerida devolverá un objeto que representa el módulo que le pasa y puede capturar ese objeto en una variable. Esto crea efectivamente un espacio de nombres para la funcionalidad de cualquier módulo requerido. Para la creación de un servidor HTTP, Node proporciona la biblioteca http. Así que avancemos y exigamos que ahora asignemos el objeto devuelto a la variable http.

A continuación, necesitaremos crear nuestro servidor. La biblioteca http proporciona una función llamada createServer que toma una función de devolución de llamada y devuelve un nuevo objeto de servidor.

La función de devolución de llamada es lo que Node llama una función de escucha y es llamada por el servidor cada vez que entra una nueva solicitud.

Cada vez que se realiza una solicitud HTTP, se llamará a la función de escucha y los objetos que representan la solicitud y respuesta HTTP se pasarán a la función. Luego podemos usar el objeto de respuesta dentro de nuestra función de escucha para enviar una respuesta al navegador. Para hacerlo, primero tendremos que escribir los encabezados HTTP apropiados, así que llamemos al escribir funciona en nuestro objeto de respuesta.

los escribir La función toma un par de argumentos. El primero es un valor entero que representa el código de estado de la solicitud, que para nosotros será 200, en otras palabras, OK. El segundo valor es un objeto que contiene todos los encabezados de respuesta que nos gustaría establecer. En este ejemplo, simplemente configuraremos el Tipo de contenido en 'texto / sin formato' para enviar texto sin formato.

Una vez que hemos establecido los encabezados, podemos enviar los datos. Para ello, llamarás al escribir Funciona y pasa los datos que deseas enviar. Aquí, llamemos al escribir Funciona en nuestro objeto de respuesta y pasa la cadena "Hola Mundo".

Para enviar realmente la respuesta, debemos indicar al servidor que hemos terminado de escribir el cuerpo de nuestra respuesta; podemos hacerlo llamando respuesta.end. los fin La función también nos permite pasar datos también, por lo que podemos acortar nuestro código de servidor eliminando la llamada a la función de escritura que hicimos anteriormente y en su lugar, pasando la cadena "Hola Mundo"a la función final, como tal.

Ahora que hemos creado nuestro servidor, debemos configurarlo para escuchar las nuevas solicitudes. Eso es bastante fácil de hacer: llamar a la función de escucha en nuestro objeto de servidor y pasar un número de puerto para que escuche; En este caso usaré el puerto. 8000. La función de escucha también toma un segundo parámetro opcional, que es la URL del nombre de host, pero como solo ejecutamos esto localmente, podemos omitir ese parámetro de forma segura por ahora.

Finalmente, imprimamos un mensaje para informarnos que nuestro servidor se está ejecutando y en qué puerto está escuchando nuevas solicitudes. Puedes hacerlo llamando console.log, como lo haríamos en el navegador, y pasar la cadena "Escuchando en http://127.0.0.1:8000". Ahí vamos, ahora ejecutemos nuestra aplicación llamando al nodo y pasándole el nombre del archivo que queremos que ejecute.


La réplica

Antes de cerrar este primer artículo y video de la serie, volvamos al terminal y echemos un vistazo rápidamente a la REPL de Node..

Un REPL, para aquellos que no están familiarizados con el acrónimo, significa Read-Eval-Print-Loop, que no es más que un simple programa que acepta comandos, los evalúa e imprime sus resultados..

Esencialmente, es un indicador interactivo que te permite hacer casi todo lo que puedes hacer con Node regular, pero sin la sobrecarga de crear un archivo separado, y es genial para la experimentación, así que juguemos un poco con el REPL y aprendamos un un poco más sobre Node.

Primero tendremos que detener nuestra aplicación de servidor pulsando Ctrl-C. Luego ejecute el nodo nuevamente, esta vez, sin embargo, sin un nombre de archivo. El nodo en ejecución sin ningún argumento activará el REPL, como podemos ver aquí por el cambio en el indicador. El REPL es muy simple: básicamente puedes escribir código JavaScript y ver la evaluación de ese código. Sin embargo, a pesar de su simplicidad, el REPL tiene pocos comandos que pueden ser útiles y puede verlos llamando al comando .help cuando se le solicite. Aquí (refiérase a screencast) vemos una lista de cuatro comandos, el primero de los cuales es el .descanso mando. Si está escribiendo un código que abarca varias líneas y se da cuenta de que ha cometido algún tipo de error y necesita romper por cualquier motivo, el .descanso Se puede usar el comando para hacerlo. Vamos a probarlo ahora?

Voy a crear una función aquí y la llamaré foo y abre el cuerpo de la función y luego pulsa entrar. Observe que, en la siguiente línea, en lugar de ver el símbolo mayor que el típico, ahora vemos un conjunto de tres puntos o puntos suspensivos. Esta es la forma en que Node nos indica que aún no hemos terminado el comando en la línea anterior y que Node todavía espera más de nosotros antes de evaluar el código que hemos ingresado. Entonces, sigamos adelante y agreguemos una línea. de código ahora: lo haremos console.log e imprimiremos el nombre de la función. Ahora presionemos enter, y, nuevamente, notemos que el carácter de puntos suspensivos se muestra una vez más. Node aún espera que terminemos la función en algún momento. Ahora supongamos que he cometido un error y solo quiero volver a un aviso normal. Si continúo presionando enter, Node continúa mostrando el carácter de puntos suspensivos. Pero, si llamo al .descanso comando, Node nos sacará del comando actual y nos llevará de vuelta al indicador normal.

A continuación, tenemos la .claro mando. Éste borrará nuestro contexto actual. Por lo tanto, si ha saturado el entorno con la creación de varias variables y funciones y desea una pizarra limpia, simplemente ejecute .claro Command and Voila, todo desaparece mágicamente..

.salida y .ayuda

Finalmente, está la .salida y .ayuda comandos los .ayuda El comando es bastante obvio, ya que es el comando que usamos para ver la lista de comandos en primer lugar. los .salida El comando es igualmente obvio: básicamente lo llamas para salir del REPL, como así.

Entonces, eso cubre prácticamente toda la funcionalidad que el REPL proporciona fuera de la evaluación del código que ingresa. Pero antes de dejar el REPL por completo, me gustaría aprovechar esta oportunidad para discutir algunas diferencias y similitudes entre JavaScript en el navegador y la variedad de JavaScript de Node. Así que vamos a ejecutar Node de nuevo y saltar de nuevo a la REPL.

La primera diferencia entre JavaScript y Nodo del lado del cliente es que, en el navegador, cualquier función o variable creada fuera de una función u objeto está vinculada al alcance global y está disponible en todas partes. En Nodo, sin embargo, esto no es cierto. Cada archivo, e incluso el REPL, tiene su propio alcance de nivel de módulo al que pertenecen todas las declaraciones globales. Veremos este uso más adelante en la serie cuando discutamos módulos y creamos algunos de los nuestros. Pero por ahora, puede ver el objeto de módulo real para el REPL escribiendo módulo en el indicador. ¿Observa que hay un atributo de solicitud enterrado a unos pocos niveles en nuestro objeto de módulo? Esto controla el aviso que vemos cuando estamos en el REPL. Cambiemos eso a algo ligeramente diferente y veamos qué sucede. Ahora hay un nuevo aviso..

Otra diferencia entre Node JavaScript y JavaScript de navegador es que en el navegador, tiene un objeto de ventana global que esencialmente lo vincula con el entorno del navegador..

En Nodo, no hay navegador, y, por lo tanto, no hay tal cosa como un ventana objeto. Sin embargo, el nodo tiene una contraparte que lo conecta al entorno operativo que es el objeto de proceso que podemos ver simplemente escribiendo proceso en el REPL. Aquí encontrará varias funciones e información útiles, como la lista de variables de entorno..

Una similitud que es importante mencionar aquí es la función setTimeout. Si está familiarizado con el JavaScript del lado del cliente, sin duda ha usado esta función una o dos veces. Básicamente, te permite configurar una función para que sea llamada más tarde. Sigamos adelante y probemos eso ahora.

> función decir hola (segundos) ? console.log ('Hello') ;? setTimeout (function () ? console.log ('World') ;?, segundos * 1000) ;? 

Esto creará una función que cuando sea llamada, imprime la cadena "Hola" y luego, unos segundos más tarde, imprime la cadena "Mundo". Ejecutemos la función ahora para verla en acción..

> decir hola (2);

Hay un par de ideas importantes a tener en cuenta aquí. Primero, Ryan Dahl, el creador de Node, ha hecho todo lo posible para que el entorno sea lo más familiar posible para cualquier persona con experiencia de JavaScript del lado del cliente. Así que el uso de nombres como setTimeout y setInterval en lugar de dormir y repetir, por ejemplo, fue una decisión consciente de hacer coincidir el entorno del lado del servidor, donde sea que tenga sentido, el entorno del navegador.

El segundo concepto del que quiero que sepan es el realmente importante. Note que cuando llamamos di hola, Inmediatamente después de imprimir la primera cadena, el control se devuelve inmediatamente al REPL. En el tiempo que transcurre desde que se imprime la primera cadena y se ejecuta la función de devolución de llamada, puede continuar haciendo lo que quiera en el indicador del REPL. Esto se debe a la naturaleza basada en eventos de Node. En Node, es casi imposible llamar a cualquier función que bloquee por algún motivo, y esto es cierto para la función setTimeout. Llamemos a nuestro di hola funciona de nuevo, sin embargo, esta vez pasemos en un intervalo de tiempo de espera ligeramente más largo para darnos el tiempo suficiente para jugar un poco y demostrar nuestro punto. Creo que 10 segundos deberían hacer el truco..

Ahí vemos la primera cuerda. Vamos a seguir adelante y ejecutar un código propio, ¿qué tal 2 + 2. Genial, vemos que la respuesta es 4 ¿y? Hay nuestra segunda cadena siendo impresa ahora.


Conclusión

Así que eso nos lleva al cierre del primer episodio de esta serie. Espero que esta haya sido una introducción bastante informativa de Node para usted, y espero que haya hecho un trabajo lo suficientemente decente para explicar por qué es tan emocionante, qué tiene para ofrecer, y cuán simple y divertido es usarlo. En el próximo episodio, comenzaremos a escribir algunos de los códigos para nuestro motor de blog; así que espero que todos ustedes se unan a mí nuevamente cuando las cosas se pongan un poco más prácticas. Hasta entonces!