javascript node.js v8 evented-io

javascript - ¿Qué es Node.js?



v8 evented-io (10)

Además, no olvide mencionar que el V8 de Google es MUY rápido. En realidad, convierte el código JavaScript en código de máquina con el rendimiento combinado de un binario compilado. Así que junto con todas las otras grandes cosas, es increíblemente rápido.

No entiendo completamente de qué se trata Node.js Tal vez sea porque soy principalmente un desarrollador de aplicaciones de negocios basado en web. ¿Qué es y para qué sirve?

Mi entendimiento hasta ahora es que:

  1. El modelo de programación está dirigido por eventos, especialmente por la forma en que maneja la I/O
  2. Utiliza JavaScript y el analizador es V8 .
  3. Se puede usar fácilmente para crear aplicaciones de servidor concurrentes.

¿Mis entendimientos son correctos? Si es así, ¿cuáles son los beneficios de la E / S de eventos? ¿Es solo algo más para las cosas de concurrencia? Además, ¿es la dirección de Node.js para convertirse en un modelo de programación basado en JavaScript (basado en V8)?


Bueno entiendo eso

  • El objetivo de Node es proporcionar una manera fácil de crear programas de red escalables.
  • Node es similar en diseño e influenciado por sistemas como Ruby''s Event Machine o Python''s Twisted.
  • E / S Evented para V8 javascript.

Para mí eso significa que usted fue correcto en las tres suposiciones. ¡La biblioteca seguro que parece prometedora!


Creo que las ventajas son:

  1. Desarrollo web en un lenguaje dinámico (JavaScript) en una máquina virtual que es increíblemente rápido (V8). Es mucho más rápido que Ruby, Python o Perl.

  2. Capacidad para manejar miles de conexiones simultáneas con una sobrecarga mínima en un solo proceso.

  3. JavaScript es perfecto para bucles de eventos con objetos de función de primera clase y cierres. Las personas ya saben cómo usarlo de esta manera, habiéndolo usado en el navegador para responder a los eventos iniciados por el usuario.

  4. Mucha gente ya conoce JavaScript, incluso personas que no dicen ser programadores. Podría decirse que es el lenguaje de programación más popular.

  5. El uso de JavaScript en un servidor web, así como el navegador, reduce la discrepancia de impedancia entre los dos entornos de programación que pueden comunicar estructuras de datos a través de JSON que funcionan de la misma manera en ambos lados de la ecuación. El código de validación de formulario duplicado se puede compartir entre el servidor y el cliente, etc.


Dos buenos ejemplos son sobre cómo administrar plantillas y utilizar mejoras progresivas con ellas. Solo necesitas unas pocas piezas ligeras de código JavaScript para que funcione perfectamente.

Te recomiendo que veas y leas estos artículos:

Elija cualquier idioma e intente recordar cómo administraría sus plantillas de archivos HTML y lo que tuvo 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 el código JavaScript del lado del cliente. Obtenga su nodo DOM y aplique su clase CSS a eso. Obtenga su nodo DOM e innerHTML su contenido (necesitará algo de código JavaScript adicional para hacer esto. Lea el artículo para saber más).

Otro buen ejemplo es que puede hacer que su página web sea compatible con JavaScript activado o desactivado con el mismo código. Imagina que tienes una selección de fecha hecha en JavaScript que permitiría a tus usuarios recoger cualquier fecha usando un calendario. Puede escribir (o usar) la misma pieza de código JavaScript para que funcione con su JavaScript activado o desactivado.


Hay una muy buena analogía de lugares de comida rápida que explica mejor el modelo de Node.js dirigido a eventos, consulte el artículo completo, Node.js, Consultorios médicos y restaurantes de comida rápida: comprender la programación dirigida por eventos

Aquí hay un resumen:

Si la junta de comida rápida siguiera un modelo tradicional basado en hilos, pediría su comida y esperaría en la fila hasta que la recibiera. La persona detrás de usted no podría ordenar hasta que su orden haya sido realizada. En un modelo basado en eventos, usted ordena su comida y luego se sale de la fila para esperar. Todos los demás son libres de ordenar.

Node.js está controlado por eventos, pero la mayoría de los servidores web están basados ​​en subprocesos. York explica cómo funciona Node.js:

  • Utiliza el 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 a que se recupere el archivo, atiende la próxima 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, mostraría la página "/about.html" y la enviaría de vuelta a su navegador web ".


Los cierres son una forma de ejecutar código en el contexto en el que se creó.

Lo que esto significa para la concurrencia es que puede definir variables, luego iniciar una función de I/O bloqueo y enviarle una función anónima para su devolución de llamada.

Cuando la tarea está completa, 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 que 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 asíncrona.


P: El modelo de programación está controlado por eventos, especialmente por la forma en que maneja la I/O

Correcto. Utiliza devoluciones de llamada, por lo que cualquier solicitud para acceder al sistema de archivos causaría que se envíe 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 síncronas (es decir, solicitudes de bloqueo). Es responsabilidad del desarrollador elegir entre asíncrono (devoluciones de llamada) o síncrono (en espera).

P: Utiliza JavaScript y el analizador es V8.

P: Se puede usar fácilmente para crear aplicaciones de servidor concurrentes.

Sí, aunque deberías codificar a mano bastante JavaScript. Podría ser mejor mirar un marco, como http://www.easynodejs.com/ , que viene con documentación en línea completa y una aplicación de muestra.


Uso Node.js en el trabajo y lo encuentro muy poderoso. Forzado a elegir una palabra para describir Node.js, diría "interesante" (que no es un adjetivo puramente positivo). La comunidad es vibrante y creciente. JavaScript, a pesar de sus rarezas, puede ser un gran lenguaje para codificar. Y a diario repensarás tu propia comprensión de las "mejores prácticas" y los patrones de código bien estructurado. Hay una enorme energía de ideas que fluyen hacia Node.js en este momento, y trabajar en ellas 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" todavía tiene ~ 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 acelerar las conexiones entrantes y hacer todo lo que Apache hace para PHP . Para ser justos, Ruby on Rails tiene este problema exacto . Se resuelve a través de dos mecanismos complementarios: 1) Poner Ruby on Rails / Node.js detrás de un servidor web dedicado (escrito en C y probado al infierno y de vuelta) como Nginx (o Apache / Lighttd ). El servidor web puede servir de manera eficiente el contenido estático, acceder al registro, volver a escribir las URL, terminar el SSL , hacer cumplir las reglas de acceso y administrar múltiples sub-servicios. Para las solicitudes que llegan al servicio de nodo real, el servidor web envía un proxy a través de la solicitud. 2) Usar un marco como Unicorn que gestionará los procesos de trabajo, 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 "producción.js" manual.

Los marcos de lectura como Express hacen que parezca que la práctica estándar es simplemente servir todo a través de un servicio Node.js de Jack-of-all-of-all ... "app.use (express.static (__ dirname + ''/ public''))" . Para servicios y desarrollo de menor carga, eso probablemente está bien. Pero tan pronto como intente poner una gran carga de tiempo en su servicio y ejecutarlo las 24 horas del día, 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 endurecido como Nginx frente de su sitio y manejando todo de las solicitudes de contenido estático (... hasta que configure un CDN , como Amazon CloudFront )). Para una toma algo humorística y descaradamente negativa de esto, vea a este tipo .

Node.js también está encontrando más y más usos que no son de servicio. Incluso si está utilizando otra cosa para servir contenido web, puede seguir utilizando Node.js como una herramienta de compilación, utilizando módulos npm para organizar su código, Browserify para Browserify en un solo activo y uglify-js para minimizarlo para su implementación . Para tratar con la web, JavaScript es una combinación de impedancia perfecta y, con frecuencia, es la ruta de ataque más fácil. Por ejemplo, si desea arrastrarse a través de un montón de cargas útiles de respuesta JSON , debe usar mi módulo de underscore-CLI , el cinturón de utilidad de los datos estructurados.

Pros contras:

  • Pro: para un tipo de servidor, escribir JavaScript en el backend ha sido una "droga de entrada" para aprender los patrones modernos de UI. Ya no temo escribir código de cliente.
  • Pro: tiende a alentar la correcta comprobación de errores (casi todas las devoluciones de llamada devuelven errores, lo que molesta al programador para que lo maneje; además, async.js y otras bibliotecas manejan el paradigma "fallar si alguna de estas subtareas falla" mucho mejor que el código síncrono típico )
  • Pro: algunas tareas interesantes y normalmente difíciles se vuelven triviales, como obtener el estado de las tareas en vuelo, comunicarse entre trabajadores o compartir el estado de caché
  • Pro: enorme comunidad y toneladas de excelentes bibliotecas basadas en un sólido administrador de paquetes (npm)
  • Con: JavaScript no tiene una biblioteca estándar. Se acostumbra tanto a importar funcionalidades que se siente raro cuando usa JSON.parse o algún otro método de compilación que no requiera agregar un módulo npm. Esto significa que hay cinco versiones de todo. Incluso los módulos incluidos en el "núcleo" de Node.js tienen cinco variantes más si no está satisfecho con la implementación predeterminada. Esto conduce a una rápida evolución, pero también a un cierto nivel de confusión.

Contra un modelo simple de un proceso por solicitud ( LAMP ):

  • Pro: Escalable a miles de conexiones activas. Muy rápido y muy eficiente. Para una flota web, esto podría significar una reducción de 10 veces en el número de cajas requeridas en comparación con PHP o Ruby
  • Pro: Escribir patrones paralelos es fácil. Imagina que necesitas obtener tres (o N) manchas de Memcached . Haga esto en PHP ... ¿acaba de escribir código para obtener el primer blob, luego el segundo, luego el tercero? Wow, eso es lento. Existe un módulo PECL especial para solucionar ese problema específico de Memcached, pero ¿qué sucede si desea obtener algunos datos de Memcached en paralelo con su consulta de base de datos? En Node.js, debido a que el paradigma es asíncrono, tener una solicitud web para hacer varias cosas en paralelo es muy natural.
  • Contras: el código asíncrono es fundamentalmente más complejo que el código síncrono, y la curva de aprendizaje inicial puede ser difícil para los desarrolladores sin una comprensión sólida de lo que realmente significa la ejecución concurrente. Aún así, es mucho menos difícil que escribir cualquier tipo de código multiproceso con bloqueo.
  • Con: Si se ejecuta una solicitud de uso intensivo de cómputo para, por ejemplo, 100 ms, se detendrá el procesamiento de otras solicitudes que se manejan en el mismo proceso Node.js ... AKA, cooperative-multitasking . Esto se puede mitigar con el patrón de los Trabajadores Web (escindir un subproceso para hacer frente a la tarea costosa). Alternativamente, podría usar un gran número de trabajadores de Node.js y solo permitir que cada uno maneje una sola solicitud al mismo tiempo (aún bastante eficiente porque no hay proceso de reciclaje).
  • Contras: la ejecución de un sistema de producción es MUCHO más complicada que un modelo CGI como Apache + PHP, Perl , Ruby , etc. Las excepciones no controladas reducirán todo el proceso, lo que requerirá lógica para reiniciar a los trabajadores fallidos (ver cluster ). Los módulos con código nativo con errores pueden bloquear el proceso. Cada vez que muere un trabajador, se eliminan las solicitudes que estaba manejando, por lo que una API defectuosa puede degradar fácilmente el servicio para otras API compartidas.

Versus escribiendo un servicio "real" en Java / C # / C (¿En serio?)

  • Pro: hacerlo de forma asíncrona en Node.js es más fácil que hacerlo con la seguridad de subprocesos en cualquier otro lugar y posiblemente ofrece un mayor beneficio. Node.js es, con mucho, el paradigma asíncrono menos doloroso en el que he trabajado. Con buenas bibliotecas, es solo un poco más difícil que escribir código síncrono.
  • Pro: No hay errores de subprocesamiento / bloqueo. Es cierto que invierte por adelantado en escribir un código más detallado que exprese un flujo de trabajo asíncrono adecuado sin operaciones de bloqueo. Y necesita escribir algunas pruebas y hacer que la cosa funcione (es un lenguaje de scripting y los nombres de las variables de digitación grueso solo se detectan en el momento de la prueba de la unidad). PERO, una vez que lo hace funcionar, el área de la superficie para los heisenbugs (problemas extraños que solo se manifiestan una vez en un millón), esa área de superficie es mucho más baja. Los impuestos que escriben el código Node.js están fuertemente cargados en la fase de codificación. Entonces tiendes a terminar con un código estable.
  • Pro: JavaScript es mucho más ligero para expresar funcionalidad. Es difícil demostrarlo con palabras, pero JSON , tipificación dinámica, notación lambda, herencia prototípica, módulos ligeros, lo que sea ... solo tiende a necesitar menos código para expresar las mismas ideas.
  • Contras: ¿Tal vez realmente te gusten los servicios de codificación en Java?

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 la elección de las bibliotecas de JavaScript DEFINIRÁ su experiencia. La mayoría de las personas utiliza al menos dos, un asistente de patrón asíncrono (Step, Futures, Async) y un módulo de azúcar de JavaScript ( Underscore.js ).

Ayudante / JavaScript Sugar:

  • Underscore.js - utiliza esto. Simplemente hazlo. Hace que su código sea agradable y legible con cosas como _.isString () y _.isArray (). No estoy realmente seguro de cómo podría escribir código seguro de lo contrario. También, para la línea de comandos mejorada-fu, revisa mi propio underscore-CLI .

Módulos de patrones asíncronos:

  • Step - una forma muy elegante de expresar combinaciones de acciones seriales y paralelas. Mi recomendación personal. Ver mi publicación sobre cómo se ve el código Step.
  • Futures : mucho más flexible (¿es eso realmente algo bueno?) Manera de expresar el pedido a través de los requisitos. Puede expresar cosas como "iniciar a, b, c en paralelo. Cuando A y B terminen, inicie AB. Cuando A y C terminen, inicie AC". Dicha flexibilidad requiere más cuidado para evitar errores en su flujo de trabajo (como nunca llamar a la devolución de llamada o llamarla varias veces). Vea la publicación de Raynos sobre el uso de futuros (esta es la publicación que me hizo "obtener" futuros).
  • Async - biblioteca más tradicional con un método para cada patrón. Comencé con esto antes de mi conversión religiosa a paso y la realización posterior de que todos los patrones en Async podrían expresarse en Paso con un paradigma más legible.
  • TameJS : escrito por OKCupid, es un precompilador que agrega una nueva primitiva de lenguaje "a la espera" para escribir de forma elegante flujos de trabajo paralelos y en serie. El patrón se ve increíble, pero requiere precompilación. Todavía estoy pensando en esto.
  • StreamlineJS - competidor de TameJS. Me estoy inclinando hacia Tame, pero puedes tomar una decisión.

O para leer todo sobre las bibliotecas asíncronas, vea esta entrevista de panel con los autores.

Web Framework:

  • Express Great Ruby on Rails-esk framework para organizar sitios web. Utiliza JADE como un motor de plantillas XML / HTML, lo que hace que la creación de HTML sea mucho menos dolorosa, incluso más elegante.
  • jQuery Aunque técnicamente no es un módulo de nodo, jQuery se está convirtiendo rápidamente en un estándar de facto para la interfaz de usuario del lado del cliente. jQuery proporciona selectores de tipo CSS para "consultar" los conjuntos de elementos DOM que luego se pueden operar (establecer manejadores, propiedades, estilos, etc.). En la misma línea, el marco Bootstrap CSS de Twitter, Backbone.js para un patrón MVC y Browserify para unir todos sus archivos JavaScript en un solo archivo. Todos estos módulos se están convirtiendo en estándares de facto, por lo que al menos debería revisarlos si no ha oído hablar de ellos.

Pruebas:

  • JSHint - Debe usar; No utilicé esto al principio, que ahora parece incomprensible. JSLint vuelve a agregar algunas de las verificaciones básicas que obtiene con un lenguaje compilado como Java. Paréntesis no coincidentes, variables no declaradas, tipos de muchas formas y tamaños. También puedes activar varias formas de lo que yo llamo "modo anal" donde verificas el estilo del espacio en blanco y todo eso, lo cual está bien si es tu taza de té, pero el valor real proviene de obtener información instantánea sobre el número de línea exacto donde olvidó un cierre ")" ... sin tener que ejecutar su código y golpear la línea ofensiva. "JSHint" es una variante más configurable de JSLint de Douglas Crockford .
  • Mocha competidor a los votos que estoy empezando a preferir. Ambos marcos manejan los conceptos básicos lo suficientemente bien, pero los patrones complejos tienden a ser más fáciles de expresar en moca.
  • Vows votos son muy elegantes. E imprime un hermoso informe (--spec) que muestra qué casos de prueba se aprobaron o no. Dedique 30 minutos a aprenderlo y podrá crear pruebas básicas para sus módulos con el mínimo esfuerzo.
  • Zombie : pruebas sin cabeza para HTML y JavaScript utilizando JSDom como un "navegador" virtual. Cosas muy poderosas. Combínelo con Replay para obtener pruebas deterministas rápidas y rápidas del código del navegador.
  • Un comentario sobre cómo "pensar en" las pruebas:
    • La prueba no es opcional. Con un lenguaje dinámico como JavaScript, hay muy pocas comprobaciones estáticas. Por ejemplo, pasar dos parámetros a un método que espera 4 no se romperá hasta que se ejecute el código. Bastante bajo barra para crear errores en JavaScript. Las pruebas básicas son esenciales para compensar la brecha de verificación con los idiomas compilados.
    • Olvida la validación, solo haz que tu código se ejecute. Para cada método, mi primer caso de validación es "nada se rompe", y ese es el caso que se dispara con mayor frecuencia. Demostrando que su código se ejecuta sin tener que atrapar el 80% de los errores y hará mucho para mejorar su confianza en el código que se encontrará retrocediendo y agregando los casos de validación matizados que omitió.
    • Empieza poco a poco y rompe la barrera inercial. Todos somos flojos y presionados por el tiempo, y es fácil ver las pruebas como "trabajo extra". Así que empieza pequeño. Escriba el caso de prueba 0 - cargue su módulo e informe el éxito. Si se obliga a hacer solo esto, entonces se rompe la barrera de inercia a la prueba. Eso es <30 minutos para hacerlo la primera vez, incluida la lectura de la documentación. Ahora escriba el caso de prueba 1: llame a uno de sus métodos y verifique que "nada se rompe", es decir, que no reciba un error. El caso de prueba 1 debería llevarte menos de un minuto. Con la inercia desaparecida, es fácil ampliar de forma incremental la cobertura de su prueba.
    • Ahora evoluciona tus pruebas con tu código. No se deje intimidar por cómo se vería la prueba "correcta" de extremo a extremo con servidores simulados y todo eso. El código comienza simple y evoluciona para manejar nuevos casos; las pruebas también deberían A medida que agregue nuevos casos y nueva complejidad a su código, agregue casos de prueba para ejercer el nuevo código. A medida que encuentre errores, agregue verificaciones y / o nuevos casos para cubrir el código defectuoso. Cuando esté depurando y pierda la confianza en un fragmento de código, regrese y agregue pruebas para demostrar que está haciendo lo que cree que es. Capture cadenas de datos de ejemplo (de otros servicios a los que llama, sitios web que raspa, lo que sea) y aliméntelos a su código de análisis. Algunos casos aquí, la validación mejorada allí, y terminará con un código altamente confiable.

Además, consulte la lista oficial de módulos Node.js recomendados. Sin embargo, GitHub''s módulo Wiki GitHub''s Nodos GitHub''s es mucho más completo y un buen recurso.

Para entender a Node, es útil considerar algunas de las opciones de diseño clave:

Node.js se basa en EVENTOS y es ASYNCHRONOUS / NON-BLOCKING . Los eventos, como una conexión HTTP entrante, activarán una función de JavaScript que hace un poco de trabajo e inicia otras tareas asíncronas, como conectarse a una base de datos o extraer contenido de otro servidor. Una vez que se inician 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 a la base de datos que se está estableciendo o el servidor externo que responde con el contenido, las funciones de devolución de llamada se activan y se ejecuta más código JavaScript, lo que potencialmente genera más tareas asíncronas (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 se desbloquee en cualquier momento. Esta es la razón por la que Node.js hace un gran trabajo administrando miles de conexiones simultáneas.

¿Por qué no usar solo un proceso / subproceso por conexión como todos los demás? En Node.js, una nueva conexión es solo una asignación de pila muy pequeña. La renovación de un nuevo proceso requiere una cantidad significativamente mayor de memoria, un megabyte en algunas plataformas. Pero el costo real es la sobrecarga asociada con el cambio de contexto. Cuando tienes 10 ^ 6 hilos de kernel, el kernel tiene que hacer un montón de 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 controlado por eventos que 10 ^ 6 procesos que compiten por el tiempo de CPU. Además, bajo condiciones de sobrecarga, el modelo de multiproceso se comporta muy mal, privando a los servicios críticos de administración y administración, especialmente SSHD (lo que significa que ni siquiera puede iniciar sesión en la caja para descubrir qué tan complicado está).

Node.js es SOLO ROSCADO y BLOQUEADO . 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 bloqueos. Los hilos son duros. Realmente muy duro. Si no crees eso, no has hecho suficiente programación en subprocesos. Lograr el bloqueo correcto es difícil y da como resultado 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 simplemente desaparezca. Esta podría ser la mayor ventaja del nodo.

Pero, ¿cómo aprovecho mi caja de 16 núcleos?

Dos caminos:

  1. Para tareas pesadas de gran envergadura como la codificación de imágenes, Node.js puede iniciar procesos secundarios o enviar mensajes a procesos de trabajo adicionales. En este diseño, tendría un subproceso que gestiona el flujo de eventos y N procesos que realizan tareas de cómputo pesadas y mastican las otras 15 CPU.
  2. Para escalar el rendimiento en un servicio web, debe ejecutar varios servidores Node.js en una caja, uno por núcleo, usando cluster (con Node.js v0.6.x, el módulo oficial de "clúster" vinculado aquí reemplaza la versión learnboost que tiene una API diferente). Estos servidores Node.js locales pueden competir en un socket para aceptar nuevas conexiones, equilibrando la carga entre ellas. Una vez que se acepta una conexión, queda estrechamente vinculada a uno de estos procesos compartidos. En teoría, esto suena mal, pero en la práctica funciona bastante bien y le permite evitar el dolor de cabeza de escribir código seguro para subprocesos. Además, esto significa que Node.js obtiene una excelente afinidad de caché de la CPU, de manera más efectiva al usar el ancho de banda de la memoria.

Node.js te permite hacer cosas realmente poderosas sin romper el sudor. Supongamos que tiene un programa Node.js que realiza una variedad de tareas, escucha los comandos en un puerto TCP , 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:

var http = require(''http''); http.createServer(function (req, res) { res.writeHead(200, {''Content-Type'': ''text/plain''}); res.end(myJavascriptObject.getSomeStatusInfo()); }).listen(1337, "127.0.0.1");

Ahora puede golpear una URL y verificar el estado de su proceso de ejecución. Agregue algunos botones y tendrá un "portal de administración". Si tiene una secuencia de comandos Perl / Python / Ruby en ejecución, simplemente "lanzar en 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 idioma en el cliente (navegador). JavaScript está aquí para quedarse; otros idiomas lo apuntan como un IL, y el talento de clase mundial está compitiendo para producir los motores de JavaScript más avanzados. Debido a la función de JavaScript en el navegador, se está realizando una enorme cantidad de esfuerzo de ingeniería para hacer que JavaScript sea más rápido. V8 es el último y mejor motor javascript, al menos para este mes. Sopla los otros lenguajes de script tanto en eficiencia Y estabilidad (mirándote a ti, Ruby). Y solo va a mejorar con los grandes equipos que trabajan 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 JIT compilando bajo el campana con interpretación solo como alternativa para el código de ejecución una vez). Sí, todos deseamos poder corregir algunas de las opciones de lenguaje de JavaScript más extrañas, pero realmente 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 idioma, en JavaScript, las bibliotecas definen la experiencia. Para crear aplicaciones web, prácticamente debes conocer JavaScript, así que codificar con él en el servidor tiene una especie de sinergia de conjunto de habilidades. Me ha hecho no temer a escribir código de 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"? - Es una forma elegante de decir que retiene variables de ámbito léxico a través de las cadenas de llamadas. ;) Me gusta esto:

var myData = "foo"; database.connect( ''user:pass'', function myCallback( result ) { database.query("SELECT * from Foo where id = " + myData); } ); // Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback doSomethingElse();

¿Ves cómo puedes usar "myData" sin hacer nada incómodo como esconderlo en un objeto? Y a diferencia de Java, la variable "myData" no tiene que ser de solo lectura. Esta poderosa característica de lenguaje hace que la programación asíncrona sea menos verbosa y menos dolorosa.

Escribir código asíncrono siempre va a ser más complejo que escribir un simple script de un solo hilo, pero con Node.js, no es mucho más difícil y obtiene muchos beneficios además de la eficiencia y escalabilidad de miles de conexiones simultáneas. ..


V8 es una implementación de JavaScript. Te permite ejecutar aplicaciones de JavaScript independientes (entre otras cosas).

Node.js es simplemente una biblioteca escrita para V8 que realiza eventos de E / S. Este concepto es un poco más complicado de explicar, y estoy seguro de que alguien responderá con una mejor explicación que yo ... Lo esencial es que, en lugar de hacer alguna entrada o salida y esperar a que suceda, simplemente no espere. para que termine. Por ejemplo, pregunte por la última vez que se editó un archivo:

// Pseudo code stat( ''somefile'' )

Eso puede tomar un par de milisegundos, o puede tomar segundos. Con la I/O , simplemente desencadena la solicitud y, en lugar de esperar, adjunta una devolución de llamada que se ejecuta cuando finaliza la solicitud:

// Pseudo code stat( ''somefile'', function( result ) { // Use the result here } ); // ...more code here

Esto lo hace muy parecido 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.


Node.js es una herramienta de línea de comandos de código abierto creada para el código JavaScript del lado del servidor. Puedes 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 usa 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.

Comprender node.js es la mejor explicación de Node.js que he encontrado hasta ahora.

Los siguientes son algunos buenos artículos sobre el tema.