Introduccion

Introducción a node.js

Qué es node.js

  • Sitio web de node.js:

    Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

  • Node.js es un intérprete de JavaScript que se ejecuta en servidor (sin navegador).

Google Chrome V8

Instalación.

  • ¿Qué necesitamos instalar?

    • Node.js: entorno de ejecución de JavaScript orientado a eventos asíncronos.

    • npm. Node Package Manager es un gestor de paquetes. Composer se basa en npm. Permite agragar dependencias y distribuir paquetes

    • nvm. Node Version Manager.

  • Si instalamos node de forma simple sólo tenemos una versión de node. La última.

  • Si trabajamos con múltiples proyectos puede ser que necesitemos varias versiones:

  • Nvm nos permite tener varias instaladas y seleccionar la que necesitemos en cada proyecto.

Hola Mundo en node

Hola Mundo en browser

HTML DOM

Objeto Window en JavaScript

  • Objeto global en JavaScript

  • Almacena todo sobre lo que se tiene acceso

Objeto "Window" en Node

  • El objeto global en Node, se llama global:

Objeto Document en JavaScript

  • Lo que se está viendo en el navegador

  • Podemos modificarlo en runtime

Objeto Process en node

  • process (node) = document (JavaScript)

  • Vemos la información del proceso node que se está ejecutando:

    • pid

    • versión de node

    • métodos

    • ...

Node vs JavaScript

  • El código en ambos es JavaScript

  • Ambos se ejecutan con el mismo motor (si usamos Chrome)

  • Node utiliza el motor fuera del contexto del navegador

    • No hay un browser sandbox

    • Tenemos funcionalidad añadida:

      • Acceso al file system

      • Acceso a bbdd completa

      • Incluso montar un servidor web

Funcionamiento código

  • Se lee el codigo en JavaScript

  • Se compila a código máquina por el V8 y se ejecuta:

V8 compiles JavaScript directly to native machine code before executing it, instead of more traditional techniques such as interpreting bytecode or compiling the whole program to machine code and executing it from a filesystem. The compiled code is additionally optimized (and re-optimized) dynamically at runtime, based on heuristics of the code's execution profile. (wikipedia)

Características de node

  • Mismo lenguaje en cliente y servidor

    • Permite a cualquier persona desarrollar en backend o en frontend

    • Permite reusar código o incluso mover código de cliente a servidor o al revés

  • No bloqueante (asíncrono) por naturaleza

    • Los métodos síncronos, llevan el sufijo sync

  • El mayor repositorio de código disponible: npm

    • composer(php) o jpm(java) están basados en npm

  • Orientado a eventos

  • Es monohilo

    • Utiliza un solo procesador

    • Si queremos usar toda la potencia de la CPU, tendremos que levantar varias instancias de node y utilizar un repartidor* de carga (P.ej. pm2)

      • Balancer no es balanceador (false friend)

  • Llamadas síncronas en servidor serían fatales:

    • ¡Bloqueariamos las conexiones al servidor hasta que acabase la instrucción bloqueante!

    • Al ser asíncrono podremos tener muchas sesiones concurrentes

Ejemplo código no bloqueante

Ejemplo código bloqueante

Consulta de API de node

  • El módulo fs pertenence a los core modules de node, no es necesario instalarlo

  • Para consultar la API:

Bloqueante vs no bloqueante

  • El código asíncrono tiene un throughput mucho mayor.

  • Se puede volver complejo el trabajar con el resultado de una función asíncrona.

    • El código asíncrono no se ejecuta de forma secuencial, más dificil de seguir

    • El método asíncrono recibe como último parámetro una función de callback

¿Qué sería lo ideal?

  • Utilizar código secuencial y asíncrono

    • Para ello utilizaremos promesas y async/await

  • Evitaremos la anidación de funciones de callback, conocido como callback hell

Versiones de JS

ECMAScript

  • Estándarización del JavaScript de NetScape (1997)

  • Implementaciones de ECMAScript:

    • JavaScript

    • JScript (Microsoft)

    • ActionScript (Adobe)

    • ..

JavaScript timeline

ECMAScript 4

  • A favor de grandes cambios:

    • Microsoft (Silverlight con C#)

    • Adobe (Adobe air con ActionScript)

  • A favor de mantener compatibilidad con lo anterior:

    • Google

    • Yahoo

ECMAScript 5

  • No tiene tantas grandes novedades

  • jQuery nace en el 2006 para paliar las diferencias entre navegadores

ECMAScript 6

Versiones actuales

  • ES6: Jun 2015

    • El comite decidió publicar especificaciones ECMAScript de forma anual

    • Se renombro a ES2015

  • ES2016 (ES7)

  • ES2017 (ES8) ... ES2019 (ES10)

  • ES.Next: Término dinámico, se refiere a la próxima versión de ECMAScript.

¿Qué puedo usar?

  • En Web tenemos que vivir con la fragmentación

    • V8 - Google Chrome (Chromium, MongoDB)

    • SpiderMonkey Firefox (GNOME, Adobe).

    • Chakra - Microsoft IE y Edge

  • En Node es más sencillo porque:

    • Solo hay un motor: v8

    • Nosotros elegimos su versión

Tablas de compatibilidades

¿Empezamos el código?

Módulos

¿Qué son los módulos?

  • Los módulos en Node.js pueden considerarse librerías.

  • Es el elemento que nos permite dividir un proyecto en unidades de código más pequeñas.

Módulos incorporados en Node.js

  • Node incorpora un buen número de módulos para ser utilizados en nuestros proyectos:

    • fs para el sistema de ficheros.

    • os para el sistema operativo.

    • http para montar un servidor web. ...

Usar módulos incorporados

require

  • require es un módulo que está en el objeto global

  • Este código no es necesario:

  • Funciona de forma síncrona

    • Por eso se ponen al comienzo

    • Podríamos colocarlos más tarde y hacer lazy loading

Módulos de terceros

  • npm install nos permite incorporar módulos de terceros:

  • Después son usados con require() igualmente

Módulos propios

Crear módulos propios:

  1. Crear un fichero javascript con definición de funciones, clases, constantes, ...

    • Cualquier fichero con definición de funciones, variables, constantes, ...

  2. Uso de exports

    • Las funciones o variables que puedan usarse desde el exterior se declaran con exports:

      Veamos ejemplos:

Ejemplo 1

  • Crear módulo en mensaje.js

  • Usar el módulo en app.js

Ejemplo 2

  • Crear módulo en mensaje.js

  • Usar el módulo en app.js

Ejemplo 3. Exportar función

  • Fichero log.js

Objeto exportado:

Uso en app.js

Ejemplo 4. Exportar objeto JSON

  • Fichero data.js

  • Uso en app.js

Ejemplo 5. Un módulo como una clase

Módulo Person.js

Ejemplo de uso en app.js

Ejemplo 6. Múltiples exports

O simplemente:

Y lo usaríamos así:

Ejemplo 7. Las funciones pueden estar definidas previamente

Ejemplo 8. Usando funciones flecha

Caso Práctico

Módulo Http

Node como servidor Http

  • Necesitamos usar el módulo Http:

  • Ejemplo:

Headers

  • Podemos agruegar cabecerars HTTP

  • Ejemplo:

Request

  • Podemos tomar toda la información del request

  • Por ejemplo la URL:

O los parámetros GET

Configurar Visual Code

  • Vamos a moficiar la configuración de Visual Code

  • Vamos a instalar eslint como linter

  • Vamos a modificar algunas configuraciones de preferecias y atajos:

Atajos

  • Añadimos el siguiente JSON para la configuración de shortcuts:

  • Si usamos linux y gnome:

    • El atajo de multicursor es alt+click pero esta combinación está usada por gnome

    • Así lo cambiamos por super+click y podremos usar la citada combinación de teclas:

esLint

  • Vamos a usar esLint como linter para:

    • Que nos ayude a generar un código homogéneo.

    • Que nos ayude a detectar errores.

  • Instalación como dependencia de desarrollo del proyecto:

Configuración de eslint

Análisis configuración

  • Ayuda: Pulsa CTRL + espacio para autocompletado

Modificaciones Visual Code Editor

  • Instalamos la extensión Prettier de Esben Petersen

  • Su funcionamiento se basa en el fichero eslintrc

  • Queremos las modificaciones de eslint al guardar

  • Cambiamos las preferencias en Visual Code Editor para formatear nuestro JavaScript:

Configuración de npm

  • Cuando creemos un nuevo proyecto nos interesa que genere automaticamente datos como nuestro nombre o email

  • Ver documentación para su configuación o mediante consola:

    • npm config --help para ver los comandos de configuración

  • Los cambios se guardan en el fichero $HOME/.npmrc

  • npm adduser genera un authtoken = login automático al publicar en el registro de npm

Versiones en node

  • Formato versiones: major.minor.patch

    • major: Cambios en compatibilidad de API

    • minor: Añade funcionalidad. Mantiene compatibilidad.

    • patch: Soluciona bug. Mantiene compatibilidad.

  • ¡Puede obligarnos a cambiar el major muy a menudo!

Last updated

Was this helpful?