update tutorial node framework ejemplos actualizar javascript node.js nodes

javascript - tutorial - node js vs php



¿Cuál es la arquitectura correcta de Node.js? (1)

Estoy un poco confundido acerca de la arquitectura de Node.js

¿El primero es correcto o el segundo? Porque en el segundo diagrama, cada llamada pasa primero a través de V8 y luego a Node.js Bindings, pero en el primero es al revés. ¿Puedes por favor ayudar en la comprensión. Gracias por adelantado.


En primer lugar, ambos gráficos son correctos, aunque el primero está un poco desactualizado. La parte ascincrónica de Node.js solía consistir en libev, libeio y libuv. Sin embargo, a medida que libuv avanzaba en el transcurso de los últimos años, " [en] la versión node-v0.9.0 de libuv libev se eliminó ", dejando a libuv hacerse cargo de todos los procesos asíncronos de E / S de Node.js (por lo tanto, incluye eventos bucle de curso). Así que la versión moderna de la arquitectura Node.js reemplazaría "libeio" y "libev" con "libuv" (como se muestra en la segunda imagen).

La razón por la cual las dos gráficas difieren en su estructura es que están organizadas con respecto a diferentes perspectivas. El gráfico 1 representa la clasificación de diferentes piezas de tecnología Node.js desde nivel alto a nivel bajo (por lo tanto, no implica un flujo de trabajo); mientras que el gráfico 2 es el flujo de trabajo real de una operación Node.js.

Para poner esto en una analogía: digamos que intentas representar diferentes piezas de un auto usando gráficos. Puede hacer esto de muchas maneras: puede organizar las diferentes piezas por sus clasificaciones / funcionalidades (Escenario A), por lo tanto:

  • Sistema de potencia : motor, aceite, refrigeración, escape, etc.
  • Sistema de transmisión : caja de cambios, eje, conjunto de embrague, diferencial, etc.
  • Sistema de suspensión : brazo de control, amortiguador, componentes de dirección, etc.
  • ......

o también puede organizar las piezas por el flujo de trabajo (Escenario B):

  • aceite -> motor -> transmisión -> diferencial -> suspensión -> etc.

(No sé demasiado en detalle acerca de los autos. El nombre de las piezas y el flujo de trabajo real podrían ser incorrectos. Solo se enumeran para ayudar a comprender).

Ahora, debido a que los medios con los que organiza las piezas son diferentes, el orden en que aparecen también será diferente. El escenario A es similar al gráfico 1 y el escenario B es similar al gráfico 2.

No estoy seguro de cuánto entiende la forma en que funciona Node.js, por lo que le daré una breve descripción de las diferentes piezas que encajan en la arquitectura de Node.js antes de continuar explicando la forma en que interactúan entre sí:

  • V8 : el motor de JavaScript de código abierto de Google que reside en los navegadores Chrome / Chromium. En lugar de interpretar el código JavaScript sobre la marcha como lo hacen los navegadores web típicos, V8 traduce su código JS en código de máquina para que sea más rápido. V8 está escrito en C ++. Lea más sobre cómo funciona V8 here .

  • libuv - libuv se desarrolló originalmente para proporcionar E / S asíncronas que incluyen sockets TCP y UDP asíncronos, bucle de eventos (famosos), resolución de DNS asíncrono, lectura / escritura del sistema de archivos, etc. libuv está escrito en C. Aquí hay un buen video para ver más información sobre libuv.

  • Otros componentes de bajo nivel , como c-ares , http parser , OpenSSL , zlib y etc., escritos principalmente en C / C ++.

  • Aplicación : aquí está su código, módulos y los módulos integrados en Node.js, escritos en JavaScript (o compilados a JS a través de TypeScript, CoffeeScript, etc.)

  • Encuadernación : una encuadernación es básicamente una envoltura alrededor de una biblioteca escrita en un idioma y expone la biblioteca a códigos escritos en otra lengua para que los códigos escritos en diferentes idiomas puedan comunicarse.

Ahora el primer gráfico debe tener sentido: en la parte superior está su aplicación (, módulos y módulos incorporados de Node.js) escritos en JavaScript; en la parte inferior están los componentes internos de Node.js escritos en C / C ++. Para unirlos para que puedan comunicarse, necesita enlaces. Así que ahí es donde se encuentran los enlaces de Node.js: entre la aplicación de alto nivel y los componentes de Nodo de bajo nivel. Estos gráficos no representan necesariamente el flujo de trabajo; es solo una clasificación de diferentes piezas de Node.js de acuerdo a sus relaciones / funcionalidades entre sí.

El segundo gráfico representa el flujo de trabajo real de una aplicación Node.js. El código escrito en su aplicación es compilado por V8. El código se comunica con componentes Node.js de bajo nivel a través de enlaces. Todos los eventos escritos en su código están registrados con Node.js. Una vez que se activan los eventos, se ponen en cola en la cola de eventos de acuerdo con el orden en que se activan. Mientras haya eventos pendientes en la cola de eventos, el bucle de eventos continúa recogiéndolos, activando sus funciones de devolución de llamada y enviándolos a hilos de trabajo para su procesamiento. Una vez que se ejecuta una función de devolución de llamada, su devolución de llamada se envía nuevamente a la cola de eventos, a la espera de que el bucle de eventos vuelva a detectarla.

Parte de su confusión podría provenir de la elección de los términos técnicos utilizados en el segundo gráfico. Si observa detenidamente, debajo de "NODE.JS BINDINGS" dice "(NODE API)", que, desafortunadamente, son dos cosas diferentes. Node.js API es la interfaz de sus bibliotecas integradas, mientras que los bindings , desde la perspectiva de la programación de software, son puentes entre los códigos escritos en diferentes idiomas.

Espero que esto ayude.

Una representación más precisa de la estructura interna de Node.js es esta: (Descargué esta imagen de una fuente en Internet hace un tiempo y olvidé de dónde viene. Si la imagen te pertenece, por favor, comenta y agregaré crédito debajo. ¡Gracias!)

Edición: Recientemente he escrito un artículo más completo en el que se explica la arquitectura de Node.js con una analogía fácil de entender. ¡Ojalá pudiera ayudar!