No entiendo completamente de qué se trata Node.js. Tal vez sea porque soy principalmente un desarrollador de aplicaciones de negocios basado en la web. ¿Qué es y para qué sirve?
Mi comprensión hasta ahora es que:
- El modelo de programación es dirigido por eventos, especialmente por la forma en que maneja E / S .
- Utiliza JavaScript y el analizador es V8 .
- Se puede usar fácilmente para crear aplicaciones de servidor concurrentes.
¿Son correctos mis entendimientos? En caso afirmativo, ¿cuáles son los beneficios de la E / S desarrollada? ¿Es solo algo más para las cosas de concurrencia? Además, ¿es la dirección de Node.js convertirse en un modelo de programación basado en JavaScript (basado en V8)?
fuente
Yo uso Node.js en el trabajo, y encuentro que es muy poderoso. Obligado a elegir una palabra para describir Node.js, diría "interesante" (que no es un adjetivo puramente positivo). La comunidad es vibrante y en crecimiento. JavaScript, a pesar de sus rarezas, puede ser un gran lenguaje para codificar. Y diariamente repensará su propia comprensión de la "mejor práctica" y los patrones de código bien estructurado. En este momento hay una enorme energía de ideas que fluye hacia Node.js, y trabajar en él te expone a todo este pensamiento: un gran levantamiento de pesas mental.
Node.js en producción es definitivamente posible, pero lejos de la implementación "llave en mano" aparentemente prometida por la documentación. Con Node.js v0.6.x, "cluster" se ha integrado en la plataforma, proporcionando uno de los bloques de construcción esenciales, pero mi script "production.js" sigue siendo ~ 150 líneas de lógica para manejar cosas como crear el registro directorio, reciclaje de trabajadores muertos, etc. Para un servicio de producción "serio", también debe estar preparado para limitar las conexiones entrantes y hacer todo lo que hace Apache para PHP . Para ser justos, Ruby on Rails tiene este problema exacto . Se resuelve mediante dos mecanismos complementarios: 1) Poner Ruby on Rails / Node.Apache / Lighttd ). El servidor web puede servir eficientemente contenido estático, acceder al registro, reescribir URL, terminar SSL , aplicar reglas de acceso y administrar múltiples sub-servicios. Para las solicitudes que llegan al servicio de nodo real, el servidor web envía la solicitud a través de proxy. 2) Utilizando un marco como Unicorn que gestionará los procesos de los trabajadores, los reciclará periódicamente, etc. Todavía no he encontrado un marco de servicio Node.js que parezca completamente horneado; puede existir, pero aún no lo he encontrado y todavía uso ~ 150 líneas en mi "production.js" enrollado a mano.
Leer marcos como Express hace que parezca que la práctica estándar es simplemente servir todo a través de un servicio Node.js de Jack-of-all-trades ... "app.use (express.static (__ dirname + '/ public'))" . Para servicios y desarrollo de menor carga, probablemente esté bien. Pero tan pronto como intente poner una gran carga en su servicio y hacer que funcione las 24 horas, los 7 días de la semana, descubrirá rápidamente las motivaciones que impulsan a los sitios grandes a tener un código C bien horneado y endurecido como Nginx al frente de su sitio y manejando todo de las solicitudes de contenido estático (... hasta que configure un CDN , como Amazon CloudFront )). Para una versión algo humorística y descaradamente negativa de esto, vea a este chico .
Node.js también está encontrando más y más usos que no son de servicio. Incluso si está usando algo más para servir contenido web, aún puede usar Node.js como herramienta de compilación, usar módulos npm para organizar su código, Browserify para unirlo en un solo activo y uglify-js para minimizarlo para la implementación . Para tratar con la web, JavaScript es una combinación perfecta de impedancia y, con frecuencia, es la ruta de ataque más fácil. Por ejemplo, si desea avanzar a través de un montón de cargas útiles de respuesta JSON , debe usar mi módulo subrayado-CLI , el cinturón de utilidades de datos estructurados.
Pros contras:
Frente a un modelo simple de un proceso por solicitud ( LAMP ):
Versus escribir un servicio "real" en Java / C # / C (C? ¿Realmente?)
Para obtener otra perspectiva sobre JavaScript y Node.js, consulte De Java a Node.js , una publicación de blog sobre las impresiones y experiencias de un desarrollador de Java al aprender Node.js.
Módulos Al considerar el nodo, tenga en cuenta que su elección de bibliotecas JavaScript DEFINIRÁ su experiencia. La mayoría de las personas usan al menos dos, un asistente de patrón asíncrono (Step, Futures, Async) y un módulo de azúcar JavaScript ( Underscore.js ).
Ayudante / JavaScript Sugar:
Módulos de patrones asincrónicos:
O para leer todo sobre las bibliotecas asíncronas, vea esta entrevista de panel con los autores.
Marco web:
Pruebas:
Además, consulte la lista oficial de módulos Node.js recomendados. Sin embargo, el Wiki de módulos de nodo de GitHub es mucho más completo y un buen recurso.
Para comprender Nodo, es útil considerar algunas de las opciones de diseño clave:
Node.js está BASADO EN EVENTOS y ASINCRÓNICO / SIN BLOQUEO. Los eventos, como una conexión HTTP entrante, activarán una función de JavaScript que hace un poco de trabajo y desencadena otras tareas asincrónicas como conectarse a una base de datos o extraer contenido de otro servidor. Una vez que se han iniciado estas tareas, la función de evento finaliza y Node.js vuelve a dormir. Tan pronto como sucede algo más, como la conexión de la base de datos establecida o el servidor externo respondiendo con contenido, las funciones de devolución de llamada se activan y se ejecuta más código JavaScript, lo que puede iniciar aún más tareas asincrónicas (como una consulta de base de datos). De esta manera, Node.js felizmente intercalará actividades para múltiples flujos de trabajo paralelos, ejecutando cualquier actividad que esté desbloqueada en cualquier momento. Es por eso que Node.js hace un gran trabajo al administrar miles de conexiones simultáneas.
¿Por qué no usar solo un proceso / hilo por conexión como todos los demás?En Node.js, una nueva conexión es solo una asignación de montón muy pequeña. Acelerar un nuevo proceso requiere mucha más memoria, un megabyte en algunas plataformas. Pero el costo real es la sobrecarga asociada con el cambio de contexto. Cuando tiene 10 ^ 6 hilos de kernel, el kernel tiene que hacer mucho trabajo para averiguar quién debe ejecutar a continuación. Se ha trabajado mucho en la construcción de un planificador O (1) para Linux, pero al final, es mucho más eficiente tener un solo proceso impulsado por eventos que 10 ^ 6 procesos que compiten por el tiempo de CPU. Además, en condiciones de sobrecarga, el modelo multiproceso se comporta muy mal, privando de servicios de administración y administración críticos, especialmente SSHD (lo que significa que ni siquiera puede iniciar sesión en la caja para descubrir qué tan mal está realmente).
Node.js es de UN SOLO ROSCADO y SIN BLOQUEO . Node.js, como una elección de diseño muy deliberada, solo tiene un solo hilo por proceso. Debido a esto, es fundamentalmente imposible que múltiples hilos accedan a los datos simultáneamente. Por lo tanto, no se necesitan cerraduras. Los hilos son duros. Muy, muy duro. Si no lo crees, no has hecho suficiente programación de hilos Obtener el bloqueo correcto es difícil y genera errores que son realmente difíciles de rastrear. La eliminación de bloqueos y subprocesos múltiples hace que una de las clases de errores más desagradables desaparezca. Esta podría ser la mayor ventaja del nodo.
Pero, ¿cómo aprovecho mi caja de 16 núcleos?
Dos caminos:
Node.js te permite hacer cosas realmente poderosas sin sudar. Suponga que tiene un programa Node.js que realiza una variedad de tareas, escucha en unpuerto TCP los comandos, codifica algunas imágenes, lo que sea. Con cinco líneas de código, puede agregar un portal de administración web basado en HTTP que muestre el estado actual de las tareas activas. Esto es fácil de hacer:
Ahora puede presionar una URL y verificar el estado de su proceso en ejecución. Agregue algunos botones y tendrá un "portal de administración". Si tiene un script Perl / Python / Ruby en ejecución, simplemente "lanzar un portal de administración" no es exactamente simple.
¿Pero no es JavaScript lento / malo / malvado / engendro del diablo? JavaScript tiene algunas rarezas extrañas, pero con "las partes buenas" hay un lenguaje muy poderoso allí, y en cualquier caso, JavaScript es EL lenguaje en el cliente (navegador). JavaScript está aquí para quedarse; otros idiomas lo están apuntando como un IL, y el talento de clase mundial está compitiendo para producir los motores JavaScript más avanzados. Debido al papel de JavaScript en el navegador, se está haciendo un enorme esfuerzo de ingeniería para hacer que JavaScript sea increíblemente rápido. V8es el último y mejor motor de JavaScript, al menos para este mes. Deslumbra a los otros lenguajes de secuencias de comandos tanto en eficiencia como en estabilidad (observándote, Ruby). Y solo va a mejorar con grandes equipos trabajando en el problema en Microsoft, Google y Mozilla, compitiendo para construir el mejor motor de JavaScript (ya no es un "intérprete" de JavaScript, ya que todos los motores modernos hacen toneladas de JITcompilando bajo el capó con interpretación solo como una alternativa para el código de ejecución única). Sí, todos deseamos poder solucionar algunas de las opciones de lenguaje JavaScript más extrañas, pero en realidad no es tan malo. Y el lenguaje es tan flexible que realmente no está codificando JavaScript, está codificando Step o jQuery, más que cualquier otro lenguaje, en JavaScript, las bibliotecas definen la experiencia. Para crear aplicaciones web, de todas formas debes saber JavaScript, por lo que codificarlo en el servidor tiene una especie de sinergia de habilidades. Me ha hecho no tener miedo de escribir el código del cliente.
Además, si REALMENTE odias JavaScript, puedes usar azúcar sintáctico como CoffeeScript . O cualquier otra cosa que cree código JavaScript, como Google Web Toolkit (GWT).
Hablando de JavaScript, ¿qué es un "cierre"? - Prácticamente una forma elegante de decir que retiene variables con ámbito léxico en las cadenas de llamadas. ;) Me gusta esto:
¿Ves cómo puedes usar "myData" sin hacer nada incómodo como guardarlo en un objeto? Y a diferencia de Java, la variable "myData" no tiene que ser de solo lectura. Esta poderosa característica del lenguaje hace que la programación asincrónica sea mucho menos detallada y menos dolorosa.
Escribir código asincrónico siempre será más complejo que escribir un script simple de un solo subproceso, pero con Node.js, no es mucho más difícil y obtienes muchos beneficios además de la eficiencia y la escalabilidad de miles de conexiones simultáneas. ..
fuente
V8 es una implementación de JavaScript. Le permite ejecutar aplicaciones JavaScript independientes (entre otras cosas).
Node.js es simplemente una biblioteca escrita para V8 que hace efecto I / O. Este concepto es un poco más complicado de explicar, y estoy seguro de que alguien responderá con una mejor explicación que yo ... La esencia es que, en lugar de hacer alguna entrada o salida y esperar que suceda, simplemente no esperes para que termine Entonces, por ejemplo, solicite la última hora editada de un archivo:
Eso puede tomar un par de milisegundos, o puede tomar segundos. Con E / S igualadas , simplemente activa la solicitud y, en lugar de esperar, adjunta una devolución de llamada que se ejecuta cuando finaliza la solicitud:
Esto se parece mucho al código JavaScript en el navegador (por ejemplo, con la funcionalidad de estilo Ajax ).
Para obtener más información, debe consultar el artículo Node.js es realmente emocionante, que fue mi introducción a la biblioteca / plataforma ... Lo encontré bastante bueno.
fuente
Node.js es una herramienta de línea de comandos de código abierto creada para el código JavaScript del lado del servidor. Puede descargar un tarball , compilar e instalar la fuente. Te permite ejecutar programas de JavaScript.
El JavaScript es ejecutado por el V8 , un motor de JavaScript desarrollado por Google que se utiliza en el navegador Chrome . Utiliza una API de JavaScript para acceder a la red y al sistema de archivos.
Es popular por su rendimiento y la capacidad de realizar operaciones paralelas.
Los siguientes son algunos buenos artículos sobre el tema.
fuente
Los cierres son una forma de ejecutar código en el contexto en el que se creó.
Lo que esto significa para la concordancia es que puede definir variables, luego iniciar una función de E / S sin bloqueo y enviarle una función anónima para su devolución de llamada.
Cuando se completa la tarea, la función de devolución de llamada se ejecutará en el contexto con las variables, este es el cierre.
La razón por la cual los cierres son tan buenos para escribir aplicaciones con E / S sin bloqueo es que es muy fácil administrar el contexto de las funciones que se ejecutan de forma asincrónica.
fuente
Dos buenos ejemplos son sobre cómo administrar plantillas y usar mejoras progresivas con ellas. Solo necesita algunas piezas ligeras de código JavaScript para que funcione perfectamente.
Le recomiendo que mire y lea estos artículos:
Elija cualquier idioma e intente recordar cómo manejaría sus plantillas de archivo HTML y qué tenía que hacer para actualizar un solo nombre de clase CSS en su estructura DOM (por ejemplo, un usuario hizo clic en un elemento del menú y desea que se marque como "seleccionado" y actualizar el contenido de la página).
Con Node.js es tan simple como hacerlo en código JavaScript del lado del cliente. Obtenga su nodo DOM y aplique su clase CSS a eso. Obtenga su nodo DOM y innerHTML su contenido (necesitará un código JavaScript adicional para hacerlo. Lea el artículo para obtener más información).
Otro buen ejemplo es que puede hacer que su página web sea compatible tanto con JavaScript activado como desactivado con el mismo código. Imagine que tiene una selección de fecha hecha en JavaScript que permitiría a sus usuarios elegir cualquier fecha usando un calendario. Puede escribir (o usar) el mismo código de JavaScript para que funcione con su JavaScript activado o desactivado.
fuente
Existe una muy buena analogía de lugares de comida rápida que explica mejor el modelo de Node.js basado en eventos, vea el artículo completo, Node.js, Consultorios médicos y restaurantes de comida rápida: comprensión de la programación basada en eventos
Aquí hay un resumen:
Node.js está basado en eventos, pero la mayoría de los servidores web están basados en hilos. York explica cómo funciona Node.js:
Utiliza su navegador web para realizar una solicitud de "/about.html" en un servidor web Node.js.
El servidor Node.js acepta su solicitud y llama a una función para recuperar ese archivo del disco.
Mientras el servidor Node.js está esperando que se recupere el archivo, atiende la siguiente solicitud web.
Cuando se recupera el archivo, hay una función de devolución de llamada que se inserta en la cola de servidores Node.js.
El servidor Node.js ejecuta esa función que en este caso representaría la página "/about.html" y la devolvería a su navegador web ".
fuente
Bueno, entiendo que
Para mí eso significa que estabas en lo correcto en los tres supuestos. ¡La biblioteca parece prometedora!
fuente
Además, no olvide mencionar que el V8 de Google es MUY rápido. En realidad, convierte el código JavaScript en código máquina con el rendimiento coincidente del binario compilado. Entonces, junto con todas las otras grandes cosas, es increíblemente rápido.
fuente
Q: El modelo de programación está dirigida por eventos, especialmente por la forma en que maneja E / S .
Correcto. Utiliza devoluciones de llamada, por lo que cualquier solicitud de acceso al sistema de archivos provocaría que se enviara una solicitud al sistema de archivos y luego Node.js comenzaría a procesar su próxima solicitud. Solo se preocuparía por la solicitud de E / S una vez que reciba una respuesta del sistema de archivos, momento en el que ejecutará el código de devolución de llamada. Sin embargo, es posible realizar solicitudes de E / S sincrónicas (es decir, solicitudes de bloqueo). Depende del desarrollador elegir entre asíncrono (devoluciones de llamada) o sincrónico (en espera).
P: Utiliza JavaScript y el analizador es V8.
si
P: Se puede usar fácilmente para crear aplicaciones de servidor concurrentes.
Sí, aunque necesitaría codificar a mano una gran cantidad de JavaScript. Sería mejor mirar un marco, como http://www.easynodejs.com/ , que viene con documentación completa en línea y una aplicación de muestra.
fuente