Guía de Node.js, Parte 2: JavaScript, V8, algunos trucos de desarrollo

Al publicar la primera parte de la traducción de esta guía en Node.js, decidimos conocer la opinión de la audiencia sobre si deberíamos seguir trabajando en el proyecto y realizamos una pequeña encuesta. Al final resultó que, aproximadamente el 94% de los que votaron apoyaron nuestra iniciativa. Así que conoce la segunda parte del tutorial de Node.js.



Hoy hablaremos sobre qué tipo de conocimiento JS necesita tener para desarrollar aplicaciones de manera eficiente para la plataforma Node.js, discutiremos las diferencias entre el navegador y el código JavaScript del lado del servidor, y hablaremos sobre los motores JS y algunas técnicas de desarrollo de Node.js.


¿Qué tipo de conocimiento JS necesito para el desarrollo de Node.js?


Suponga que acaba de comenzar a programar. ¿Qué tan profundo necesita aprender JavaScript para dominar con éxito Node.js? Es difícil para un principiante alcanzar tal nivel cuando gana suficiente confianza en sus habilidades profesionales. Además, al estudiar programación, puede sentir que no comprende exactamente dónde termina JavaScript del navegador y comienza el desarrollo de Node.js.

Si está al comienzo de la ruta de un programador de JavaScript, le aconsejaría, antes de escribir para Node.js, que domine bien los siguientes conceptos de lenguaje:

  • Construcciones léxicas.
  • Expresiones
  • Tipos
  • Variables
  • Las funciones
  • Esta palabra clave
  • Funciones de flecha
  • Ciclos
  • Alcances
  • Matrices
  • Cadenas de plantilla.
  • Aplica un punto y coma.
  • Trabaja en modo estricto.

De hecho, esta lista continúa, pero si lo domina todo, significa que sentará una buena base para el desarrollo productivo de clientes y servidores en JavaScript.
Los siguientes conceptos del lenguaje también son muy importantes para comprender las ideas de la programación asincrónica, que son una de las partes básicas de Node.js. En particular, estamos hablando de lo siguiente:

  • Programación asincrónica y funciones de devolución de llamada.
  • Temporizadores
  • Promesas
  • Asíncrono / espera construcción.
  • Cortocircuitos
  • Ciclo de eventos.

Hay muchos materiales de JavaScript que permiten a los principiantes aprender el idioma. Por ejemplo, aquí hay un curso de capacitación para el autor de esta guía, aquí hay una sección muy útil de MDN, aquí hay un tutorial para javascript.ru. Puede aprender mecanismos básicos de JavaScript en freecodecamp.com .

Arriba, hablamos sobre cómo los principiantes pueden estar preocupados por la cuestión de dónde se encuentra el límite entre el desarrollo de JavaScript del servidor y el cliente. Hablemos de eso.

Diferencias entre la plataforma Node.js y el navegador


¿En qué se diferencia el desarrollo de JS para Node.js de la programación del navegador? La similitud entre estos entornos es que se usa el mismo lenguaje tanto allí como allí. Pero desarrollar aplicaciones diseñadas para ejecutarse en un navegador es muy diferente de desarrollar aplicaciones de servidor. A pesar de usar el mismo lenguaje, existen algunas diferencias clave que convierten estos dos tipos de desarrollo en actividades completamente diferentes.

Cabe señalar que si alguien que solía aprender front-end para iniciar Node.js, tiene una oportunidad muy seria de dominar rápidamente todo lo que es necesario debido al hecho de que escribirá en un idioma que ya conoce. Si se agrega la necesidad de aprender un nuevo entorno y la necesidad de aprender un nuevo idioma, la tarea es mucho más complicada.
Entonces, la principal diferencia entre el cliente y el servidor es el entorno para el que tiene que programar, en los ecosistemas de estos entornos.

En el navegador, la mayor parte del trabajo recae en varias operaciones con documentos web a través del DOM, así como en el uso de otras API de plataforma web, como, por ejemplo, mecanismos para trabajar con cookies. Node.js, por supuesto, tiene todo esto. No hay ningún objeto de document , ningún objeto de window , así como otros objetos proporcionados por el navegador.

El navegador, a su vez, no tiene esos mecanismos de software que están disponibles en el entorno Node.js y existen en forma de módulos que se pueden conectar a la aplicación. Por ejemplo, esta es una API para acceder al sistema de archivos.

Otra diferencia entre el desarrollo de cliente y servidor en JS es que cuando se trabaja en un entorno Node.js, el desarrollador tiene control total sobre el entorno. A menos que esté desarrollando una aplicación de código abierto que se pueda ejecutar en cualquier lugar, sabe exactamente, por ejemplo, en qué versión de Node.js funcionará su proyecto. Esto es muy conveniente en comparación con el entorno del cliente donde su código tiene que funcionar en el navegador del usuario. Además, esto significa que puede, sin temor a problemas, usar las últimas funciones del lenguaje.

Dado que JavaScript se está desarrollando extremadamente rápido, los navegadores simplemente no tienen tiempo suficiente para implementar rápidamente todas sus innovaciones. Además, no todos los usuarios trabajan en las últimas versiones de los navegadores. Como resultado, los desarrolladores que desean usar algo nuevo en sus programas se ven obligados a tener esto en cuenta, cuidar la compatibilidad de sus aplicaciones con los navegadores que usan, lo que puede provocar la necesidad de abandonar las funciones modernas de JavaScript. Por supuesto, puede usar el transportador Babel para convertir el código a un formato compatible con el estándar EcmaScript 5, que es compatible con todos los navegadores, pero no lo necesitará cuando trabaje con Node.js.

Otra diferencia entre Node.js y los navegadores es que Node.js usa el sistema de módulos CommonJS , mientras que en los navegadores se puede ver el comienzo de la implementación del estándar ES Modules. En la práctica, esto significa que actualmente en Node.js, la construcción require() se utiliza para conectar el código externo e import en el código del navegador.

V8 y otros motores de JavaScript


V8 es el nombre del motor de JavaScript utilizado en el navegador Google Chrome. Es él quien es responsable de la ejecución del código JavaScript, que ingresa al navegador cuando se trabaja en Internet. V8 proporciona un tiempo de ejecución para JavaScript. El navegador proporciona DOM y otras API de plataforma web.

El motor JS es independiente del navegador en el que se ejecuta. Es este hecho el que hizo posible la aparición y el desarrollo de la plataforma Node.js. V8 fue elegido como motor para Node.js en 2009. Como resultado del crecimiento explosivo de la popularidad, Node.js V8 resultó ser un motor que ahora es responsable de ejecutar una gran cantidad de código JS del lado del servidor.

El ecosistema de Node.js es enorme. Gracias a esto, el V8 también se utiliza, a través de proyectos como Electron , para desarrollar aplicaciones de escritorio.

Cabe señalar que, además de V8, hay otros motores:


La lista de motores JS no se limita a esto.

Estos motores implementan la especificación ECMA-262, también llamada ECMAScript. Es esta especificación la que estandariza JavaScript. La última versión del estándar se puede encontrar aquí .

▍Desarrollo del motor JS y aspiración de rendimiento


El motor V8 está escrito en C ++, se mejora constantemente. Puede ejecutarse en muchos sistemas, particularmente Mac, Windows y Linux. Aquí no hablaremos sobre los detalles de la implementación de V8. Puede encontrar información sobre ellos en otras publicaciones, incluso en el sitio web oficial de V8 . Cambian con el tiempo, a veces muy en serio.

V8 está en constante evolución, lo mismo puede decirse de otros motores. Esto conduce, en particular, a un aumento en el rendimiento de los navegadores web y la plataforma Node.js. Los fabricantes de motores de navegador compiten constantemente, luchando por la velocidad de ejecución del código, esto ha estado sucediendo durante muchos años. Todo esto es beneficioso para los usuarios y programadores.

▍ Interpretación y compilación


JavaScript se considera un lenguaje interpretado, pero los motores modernos están lejos de interpretar solo el código JS. Ellos lo compilan. Esta tendencia se puede observar desde 2009, cuando se agregó el compilador de JavaScript en Firefox 3.5, después de lo cual otros fabricantes de motores y navegadores adoptaron esta idea.

V8 compila JavaScript para mejorar el rendimiento del código. Desde la llegada de Google Maps en 2004, JavaScript ha evolucionado, evolucionado de un lenguaje en el que, para implementar las funciones interactivas de las aplicaciones web, generalmente escribieron unas pocas decenas de líneas, en un lenguaje en el que se escriben aplicaciones de navegador compuestas de miles o incluso cientos. mil líneas de código. Dichas aplicaciones pueden ejecutarse durante horas en el navegador, que es muy diferente de los antiguos escenarios de uso de JS, cuyo código, por ejemplo, solo se podía usar para verificar la exactitud de los datos ingresados ​​en los formularios. En las condiciones modernas, compilar el código tiene mucho sentido, porque aunque la ejecución de este paso puede retrasar el momento en que se lanza el código, después de la compilación, el código es mucho más productivo que el que sería procesado exclusivamente por el intérprete y funcionaría más rápido, pero funcionaría más lentamente.

Ahora, habiendo discutido algunas disposiciones sobre motores JS, interpretación y compilación de código, pasemos a la práctica. A saber, hablemos sobre cómo cerrar las aplicaciones Node.js.

Saliendo de la aplicación Node.js


Hay varias formas de cerrar las aplicaciones de Node.js.

Entonces, al ejecutar un programa en la consola, puede finalizar su trabajo usando el atajo de teclado ctrl+c . Pero estamos más interesados ​​en los métodos de software para cerrar aplicaciones. Y comenzaremos, tal vez, con el comando más rudo para salir del programa, que, como comprenderá ahora, es mejor no usarlo.

El módulo de process kernel proporciona un método conveniente que le permite salir mediante programación de una aplicación Node.js. Se ve así:

 process.exit() 

Cuando Node.js encuentra dicho comando en el código, esto lleva al hecho de que su proceso finaliza instantáneamente. Esto significa que absolutamente todo lo que hizo el programa será bastante grosero e interrumpido incondicionalmente. Estamos hablando de devoluciones de llamada no invitadas, sobre solicitudes de red que se ejecutan en el momento del lanzamiento, sobre acciones con archivos, sobre operaciones de escritura en stdout o stderr .

Si esta situación le conviene, puede usar este método. Cuando lo llame, puede pasarle un número entero que el sistema operativo percibirá como el código de salida del programa.

 process.exit(1) 

Por defecto, este código se establece en 0, lo que significa que se completó con éxito. Otros códigos de salida tienen diferentes significados, que pueden ser útiles para usarlos en su propio sistema con el fin de establecer la interacción de algunos programas con otros.
Los detalles sobre los códigos de apagado del programa se pueden encontrar aquí .

También puede asignar un código de salida a la propiedad process.exitCode . Se ve así:

 process.exitCode = 1 

Después de que el programa finalice, Node.js devolverá este código al sistema.

Cabe señalar que el trabajo del programa terminará naturalmente por sí solo después de realizar todas las acciones especificadas en él. Sin embargo, en el caso de Node.js, a menudo hay programas que, en condiciones ideales, están diseñados para funcionar por una duración indefinida. Estamos hablando, por ejemplo, de servidores HTTP como este:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) 

Tal programa, si no sucede nada, en teoría, puede funcionar para siempre. En este caso, si llama a process.exit() , las operaciones realizadas por él al momento de llamar a este comando se interrumpirán. Y esto es malo.

Para completar el trabajo de dichos programas, debe usar la señal SIGTERM y realizar las acciones necesarias con el controlador adecuado.

Tenga en cuenta que para usar el objeto de process , no necesita conectar nada usando require , ya que este objeto está disponible para las aplicaciones de Node.js de manera predeterminada.

Considere el siguiente ejemplo:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) process.on('SIGTERM', () => { app.close(() => {   console.log('Process terminated') }) }) 

¿Qué son las señales? Las señales son un medio de interacción entre procesos en el estándar POSIX (interfaz de sistema operativo portátil). Son notificaciones enviadas al proceso para informarle de ciertos eventos.

Por ejemplo, una señal SIGKILL le dice a un proceso que necesita apagarse inmediatamente. Idealmente funciona igual que process.exit() .

La señal SIGTERM le dice al proceso que necesita realizar un procedimiento de apagado normal. Dichas señales se envían desde los gerentes de procesos, como los nuevos o supervisord , y desde muchos otros.

Puede enviar dicha señal desde el propio programa, utilizando el siguiente comando:

 process.kill(process.pid, 'SIGTERM') 

Para completar con éxito dicho comando, debe conocer el PID proceso que planea completar.

Variables de entorno de lectura de Node.js


El módulo del núcleo del process tiene la propiedad env , que da acceso a todas las variables de entorno que se establecieron en el momento en que se inició el proceso.

Aquí hay un ejemplo de trabajo con la variable de entorno NODE_ENV , que, de forma predeterminada, está configurada para development :

 process.env.NODE_ENV // "development" 

Si, antes de ejecutar el script, configúrelo en production , esto le indicará a Node.js que el programa se está ejecutando en un entorno de producción.

Del mismo modo, puede trabajar con otras variables de entorno, por ejemplo, las que usted mismo configuró.

Resumen


Hoy tocamos la programación basada en navegador y del lado del servidor en JavaScript, hablamos sobre los motores JS, cómo cerrar las aplicaciones del servidor y cómo leer las variables de entorno de los programas Node.js. La próxima vez hablaremos sobre el alojamiento para aplicaciones Node.js, cómo usar Node.js en modo REPL, cómo trabajar con argumentos que se pueden pasar a los scripts cuando se los llama, cómo interactuar con la consola y cómo diseñar el código como módulos

Estimados lectores! ¿Qué tutoriales de JavaScript recomendarías para principiantes?

Source: https://habr.com/ru/post/es423153/


All Articles