Node.js es un lenguaje de backend emergente diseñado para ayudar a los programadores a construir rápidamente aplicaciones escalables. Node.js tiene muchas características atractivas, y hay innumerables informes al respecto. Este artículo analizará y discutirá las características de EventEmister, Streams, estilo de codificación, pelusas, estilo de codificación y otros para ayudar a los usuarios a tener una comprensión más profunda de Node.js.
Como plataforma construida en el tiempo de ejecución de Chrome JavaScript, nuestra comprensión relevante de JavaScript parece ser aplicable a las aplicaciones de nodos; Sin extensiones o modificaciones de lenguaje adicionales, podemos aplicar la experiencia de la programación frontal a la programación de back-end.
EventEmitter (remitente de eventos)
En primer lugar, debe comprender el modelo EventEmitter. Puede enviar un evento, así como un evento que interesará al consumidor. Podemos pensar en ello como una extensión del patrón de pase de devolución de llamada a una función asincrónica. En particular, EventEmitter tendrá una mayor ventaja cuando se requieren múltiples devoluciones de llamada.
Por ejemplo, una persona que llama envía una solicitud de "archivo de lista" al servidor remoto. Es posible que desee agrupar los resultados devueltos y realizar una devolución de llamada para cada grupo. El modelo EventEmitter le permite enviar devoluciones de llamada "Archivo" en cada grupo y realizar el procesamiento de "Fin" cuando se completen todas las operaciones.
Al usar EventEmitter, simplemente establezca los eventos y parámetros relevantes.
La copia del código es la siguiente:
var eventEmitter = request ('events'). EventEmitter;
var util = require ('util');
función myClass () {
if (! (esta instancia de myclass)) devuelve nuevo myclass ();
EventEmitter.call (esto);
var self = this;
setTimeOut (function timeOutCb () {
self.emit ('myevent', 'hola mundo', 42);
}, 1000);
}
Util.inherits (MyClass, EventEmitter);
El constructor MyClass crea un disparador de tiempo con un retraso de activación de 1s y un evento de activación de Myevent. Para usar eventos relacionados, debe ejecutar el método ON ():
La copia del código es la siguiente:
var myobj = new myClass ();
var start = date.now ();
myobj.on ('myevent', function myEventCb (str, num) {
console.log ('myevent activado', str, num, date.now () - inicio);
});
Cabe señalar aquí que, aunque el evento EventEmister suscrito es un evento asincrónico, cuando se desencadena el tiempo, las acciones del oyente se sincronizarán. Por lo tanto, si el evento MyEvent anterior tiene 10 oyentes, todos los oyentes serán llamados a orden sin esperar el bucle del evento.
Si una subclase de EventEmister genera un evento emit ('Error'), pero ningún oyente se suscribe a él, la clase de base EventEmitter lanza una excepción, lo que hace que se active un evento de Excepción no captura cuando se ejecuta el objeto de proceso.
verror
Verror es una extensión del error de clase base, que nos permite definir mensajes de salida utilizando el formato de caracteres Printf.
Corrientes
Si hay un archivo muy grande que necesita ser procesado, el método ideal debe ser leer parte y escribir parte. No importa cuán grande sea el archivo, siempre se procesará mientras el tiempo lo permita. Esto requiere el concepto de transmisión. Streams es otro modelo ampliamente utilizado en el nodo, en nodo, una implementación de EventEmitter. Proporciona interfaces legibles, escritas o dúplex completas. Es una interfaz abstracta, y los eventos de operación regulares proporcionados incluyen: legible, por escrito, drenaje, datos, final y cierre. Si podemos usar tuberías para integrar de manera efectiva estos eventos, se lograrán interacciones más poderosas.
Al usar .Pipe (), Note puede comunicarse con Back-Pressure a través de la tubería. Según la presión de retroceso: solo aquellos que se pueden escribir, o solo aquellos que se pueden leer.
Por ejemplo, ahora enviamos datos de Stdin a un archivo local y un servidor remoto:
La copia del código es la siguiente:
var fs = require ('fs');
var net = require ('net');
var localfile = fs.CreatewriteReam ('localfile.tmp');
net.connect ('255.255.255.255', 12345, función (cliente) {
process.stdin.pipe (cliente);
process.stdin.pipe (localfile);
});
Y si queremos enviar datos a un archivo local y queremos usar Gunzip para comprimir esta transmisión, podemos hacer esto:
La copia del código es la siguiente:
var fs = require ('fs');
var zLib = require ('zlib');
process.stdin.pipe (zlib.createguunzip ()). tubería (fs.CreatewriteStream ('localfile.tar'));
Si desea saber más sobre Stream, haga clic aquí.
Flujo de control (control de proceso)
Dado que JS tiene conceptos funcionales como objetos de primera clase, cierres, etc., es posible definir fácilmente los permisos de devolución de llamada. Esto es muy conveniente cuando se crea prototipos, y puede integrar permisos lógicos a pedido. Pero es fácil usar funciones incorporadas torpes.
Por ejemplo, queremos leer una serie de archivos en orden y luego realizar una tarea:
La copia del código es la siguiente:
fs.ReadFile ('FirstFile', 'UTF8', Function FirstCb (err, FirstFile) {
Dosomething (FirstFile);
fs.ReadFile ('SecondFile', 'UTF8', function Secondcb (err, SecondFile) {
Dosomething (SecondFile);
fs.ReadFile ('ThirdFile', 'UTF8', Function ThirdCb (ERR, ThirdFile) {
Dosomething (tercer archivo);
});
});
});
Los problemas con este patrón son:
1. La lógica de estos códigos está muy dispersa y desordenada, y los procesos operativos relacionados son difíciles de entender.
2. No se manejan errores ni excepciones.
3. Las filtraciones de memoria de cierre en JS son muy comunes y difíciles de diagnosticar y detectar.
Si queremos realizar una serie de operaciones asincrónicas en un conjunto de entrada, usar una biblioteca de control de procesos es una opción más inteligente. Vasync se usa aquí.
Vasync es una biblioteca de control de procesos cuyas ideas provienen de operaciones asíncronas. Lo que lo hace especial es que permite a los consumidores ver y observar un cierto proceso de tarea. Esta información es muy útil para estudiar el proceso de un cierto error.
Estilo de codificación (estilo de programación)
El estilo de programación es el tema más controvertido porque a menudo es informal. Todos tienen sus propias preferencias. Es importante encontrar un estilo que se adapte a individuos y equipos. Algún patrimonio tradicional puede hacer del viaje de desarrollo de nodos un lugar mejor.
1. Nombra la función
2. Intenta nombrar todas las funciones.
3. Evite los cierres
4. No defina otras funciones en una determinada función. Esto reduce muchos accidentes inesperados de fuga de memoria de cierre.
5. Funciones cada vez más pequeñas
Aunque V8 JIT es un motor potente, las funciones más pequeñas y más delgadas se combinarán mejor con V8. Además, si nuestras funciones son todas pequeñas y exquisitas (aproximadamente 100 líneas), también nos agradeceremos a nosotros mismos al leerlas y mantenerlas nosotros mismos.
Verifique el estilo mediante programación: mantenga la consistencia del estilo y use una herramienta de verificación para mejorarlo. Estamos usando jsstyle.
Linting (comprobación de código)
La herramienta de pelusa puede realizar un análisis estático del código sin ejecutar, verificando posibles errores y riesgos, como las declaraciones de descanso faltantes en CassedWitch. La pelusa no es simplemente equivalente a la verificación del estilo, está más dirigida al análisis de riesgos objetivos que en opciones de estilo subjetivo. Usamos JavaScriptlint, que tiene elementos de verificación ricos.
Registro (registro)
Cuando estamos programando y codificando, necesitamos tener una visión a largo plazo. En particular, considere qué herramientas usar para la depuración. El excelente primer paso es hacer un registro efectivo. Necesitamos identificar la información y ver a qué se presta especial atención durante la depuración y lo que se usa para el análisis e investigación en tiempo de ejecución. Se recomienda usar Bunyan, una biblioteca de registro de nodo.js directas, y el formato de salida de datos es JSON. Para obtener más información, haga clic aquí.
Servidor de clientes
Si una aplicación tiene capacidades de procesamiento distribuidas, será más atractiva en el mercado. Se pueden describir interfaces similares utilizando la API RESTful HTTP o el TCP JSON original. Esto permite a los desarrolladores combinar la experiencia en el nodo con entornos de red asincrónicos, así como el uso de transmisiones con sistemas distribuidos y escalables.
Herramientas comunes:
1. Restificar
En pocas palabras, esta es una herramienta para construir servicios de descanso. Proporciona un buen soporte de visualización y depuración, al tiempo que apoya a Bunyan y Dtrace.
2. Rápido
Fast es una herramienta liviana que utiliza TCP para procesar los mensajes JSON. Se proporciona soporte DTRACE, que nos permite identificar rápidamente las características de rendimiento de los clientes del servidor.
3. Flujo de trabajo
El flujo de trabajo se basa en Restify y puede definir procesos comerciales para una serie de servicios y API remotas. Por ejemplo: estado de error, tiempo de espera, reconexión, procesamiento de congestión, etc.