Node.js se ha beneficiado de sus características asincrónicas y basadas en eventos, y ha sido muy pronto. Sin embargo, no es posible ser rápido en las redes modernas. Si planea usar Node.js para desarrollar su próxima aplicación web, entonces debe hacer todo para que su aplicación sea más rápida y excepcionalmente rápida. Este artículo presentará 10 elementos, y después de las pruebas, puede mejorar enormemente las habilidades de la aplicación de nodo. Sin más preámbulos, echemos un vistazo uno por uno.
1. Paralelo
Al crear una aplicación web, es posible que deba llamar a la API interna varias veces para obtener varios datos. Por ejemplo, supongamos que en la página del tablero, debe ejecutar las siguientes llamadas:
Información del usuario: getUserProfile ().
Actividad actual: getRecentActivity ().
Suscríbase al contenido - getSubScriptions ().
Contenido de notificación - getNotifications ().
Para obtener esta información, debe crear un middleware separado para cada método y luego vincularla a la ruta del tablero. Pero el problema es que la ejecución de estos métodos es lineal, y el siguiente no comenzará hasta que el anterior esté terminado. Una solución factible es llamarlos en paralelo.
Como saben, Node.js es muy bueno para llamar múltiples métodos en paralelo debido a la asincrónica. No podemos desperdiciar recursos naturales. Los métodos que mencioné anteriormente no tienen dependencias, por lo que podemos ejecutarlos en paralelo. De esta manera, podemos reducir la cantidad de middleware y aumentar en gran medida la velocidad.
Podemos usar async.js para manejar el paralelismo, que es un módulo de nodo especialmente utilizado para entrenar a JavaScript asíncronamente. El siguiente código demuestra cómo usar async.js para llamar a múltiples métodos en paralelo:
La copia del código es la siguiente:
function runinParallel () {
async.parallel ([[
getUserProfile,
getRecentActivity,
getSubscriptions,
getNotifications
], function (err, resultados) {
// Esta devolución de llamada se ejecuta cuando todas las funciones se completan
});
}
Si desea tener una mirada más profunda a Async.js, muévase en su página de GitHub.
2. Asíncrono
Por diseño node.js es un solo roscado. Según esto, el código síncrono bloqueará toda la aplicación. Por ejemplo, la mayoría de las API del sistema de archivos tienen sus versiones sincronizadas. El siguiente código demuestra dos operaciones: lectura de archivos sincrónicos y asíncronos:
La copia del código es la siguiente:
// asíncrono
fs.ReadFile ('file.txt', function (err, buffer) {
VAR content = buffer.ToString ();
});
// sincrónico
var content = fs.ReadFilesync ('file.txt'). toString ();
Sin embargo, si realiza operaciones de bloqueo a largo plazo, el hilo principal se bloqueará hasta que se completen estas operaciones. Esto reduce en gran medida el rendimiento de su aplicación. Por lo tanto, es mejor asegurarse de que su código use la versión asincrónica de la API, al menos debe ser asíncrono en el nodo de rendimiento. Además, debe tener mucho cuidado al elegir módulos de terceros. Porque cuando intenta eliminar las operaciones de sincronización de su código, una llamada sincrónica de una biblioteca externa desperdiciará todos sus esfuerzos y reducirá el rendimiento de su aplicación.
3. Caché
Si usa algunos datos que no cambian con frecuencia, debe almacenarlos en caché para mejorar el rendimiento. Por ejemplo, el siguiente código es un ejemplo de obtener la última publicación y mostrarla:
La copia del código es la siguiente:
var enrutador = express.router ();
router.route ('/ortatposts'). get (function (req, res) {
Post.getLatest (function (err, publicaciones) {
if (err) {
tirar err;
}
res.render ('publicaciones', {publicaciones: publicaciones});
});
});
Si no publica con frecuencia, puede almacenar en caché la lista de publicaciones y limpiarlas después de un tiempo. Por ejemplo, podemos usar el módulo Redis para lograr este objetivo. Por supuesto, debe instalar Redis en su servidor. Luego puede guardar pares de clave/valor con un cliente llamado Node_redis. El siguiente ejemplo muestra cómo almacenamos en caché las publicaciones:
La copia del código es la siguiente:
var redis = requirir ('redis'),
cliente = redis.createClient (nulo, null, {detect_buffers: true}),
enrutador = express.router ();
router.route ('/ortatposts'). get (function (req, res) {
client.get ('publicar', function (err, publicaciones) {
if (posts) {
return res.render ('publicaciones', {publicaciones: json.parse (publicaciones)});
}
Post.getLatest (function (err, publicaciones) {
if (err) {
tirar err;
}
client.set ('publicaciones', json.stringify (publicaciones));
res.render ('publicaciones', {publicaciones: publicaciones});
});
});
});
Vea, verifiquemos primero el caché de Redis para ver si hay publicaciones. Si es así, tomamos estas listas de publicaciones del caché. De lo contrario, recuperaremos el contenido de la base de datos y almacenamos en caché los resultados. Además, después de un cierto período de tiempo, podemos limpiar el caché Redis para que el contenido pueda actualizarse.
4. Compresión GZIP
Encender la compresión GZIP tendrá un gran impacto en sus aplicaciones web. Cuando un navegador comprimido GZIP solicita ciertos recursos, el servidor se comprime antes de que la respuesta se devuelva al navegador. Si no usa GZIP para comprimir sus recursos estáticos, el navegador puede tardar más en obtenerlos.
En aplicaciones Express, podemos usar el middleware expreso Express.static () incorporado para manejar el contenido estático. Además, el contenido estático se puede comprimir y procesarse utilizando el middleware de compresión. Aquí están los ejemplos de uso:
La copia del código es la siguiente:
var compresión = requirir ('compresión');
app.use (compresión ()); // usa compresión
app.use (express.static (path.join (__ dirname, 'public')));
5. Si es posible, represente con el cliente
Ahora hay marcos MVC/MVVM de clientes súper versátiles y potentes, como Angularjs, Ember, Meteor, etc., y es muy fácil construir una aplicación de una sola página. Básicamente, solo necesita exponer una API y devolver una respuesta JSON al cliente, sin representar la página en el servidor. En el cliente, puede organizar Jsons con marcos y mostrarlos en la interfaz de usuario. Solo enviar respuestas JSON en el servidor puede guardar el ancho de banda y mejorar el rendimiento, porque no necesita devolver las marcas de diseño en cada respuesta, en lo cierto, solo necesita devolver JSON puro y luego representarlas en el cliente.
Echemos un vistazo a mi tutorial, que es sobre cómo exponer una API RESTful usando Express 4. También escribí otro tutorial que muestra cómo combinar estas API con Angularjs.
6. No almacene demasiados datos en las sesiones
Para aplicaciones de página expresas típicas, los datos de la sesión se guarda en la memoria de forma predeterminada. Cuando guarda demasiados datos en la sesión, aumentará significativamente la sobrecarga del servidor. Por lo tanto, cambia a otro método de almacenamiento para guardar los datos de la sesión o intente minimizar la cantidad de datos almacenados en la sesión.
Por ejemplo, cuando los usuarios inician sesión en su aplicación, puede guardar sus ID solo en la sesión en lugar de todo el objeto de datos del usuario. Además, para esas consultas que puede obtener objetos de ID, desea usar MongoDB o Redis para almacenar datos de sesión.
7. Optimizar la consulta
Supongamos que tiene un blog y desea mostrar las últimas publicaciones en su página de inicio. Puede obtener datos a través de Mongoose como este:
La copia del código es la siguiente:
Post.find (). Limit (10) .exec (function (err, posts) {
// Enviar publicaciones al cliente
});
Sin embargo, el problema es que el método Find () de Mongoose consultará todos los campos del objeto, y no se requieren muchos campos en la página de inicio. Por ejemplo, los comentarios guarda respuestas a publicaciones específicas. No necesitamos mostrar las respuestas de los artículos, por lo que podemos eliminarlo al consultar. Esto sin duda aumentará la velocidad. La consulta anterior se puede optimizar así:
La copia del código es la siguiente:
Post.find (). Limit (10) .exclude ('comentarios'). Exec (function (err, publicaciones) {
// Enviar publicaciones al cliente
});
8. Use el método V8 estándar
Algunas operaciones en una colección, como Map, Red y ForEach, no necesariamente admiten todos los navegadores. Podemos resolver algunos problemas de compatibilidad del navegador a través de la biblioteca de primer plano. Pero para Node.js, debe saber exactamente qué operaciones es compatible con el motor JavaScript V8 de Google. De esta manera, puede usar directamente estos métodos incorporados para operar la colección en el lado del servidor.
9. Use Nginx frente al nodo
Nginx es un servidor web pequeño y liviano que puede reducir la carga en su servidor nodo.js. Puede configurar recursos estáticos en Nginx en lugar de en el nodo. Puede comprimir las respuestas con GZIP en Nginx para que todas las respuestas sean más pequeñas. Por lo tanto, si tiene un producto que está funcionando, creo que debe usar NGINX para mejorar la velocidad de ejecución.
10. Embalaje JavaScript
Finalmente, también puede mejorar en gran medida la velocidad de la aplicación de la página empacando múltiples archivos JS. Cuando el navegador encuentre el elemento <script> en la representación de la página, se bloqueará y no continuará ejecutándose hasta que se obtenga el script (a menos que se establezca la propiedad asíncrona). Por ejemplo, si su página tiene cinco archivos JavaScript, el navegador emitirá cinco solicitudes HTTP separadas para obtenerlos. Si estos cinco archivos están comprimidos y empaquetados en uno, el rendimiento general mejorará enormemente. Lo mismo ocurre con los archivos CSS. Puede usar una herramienta de compilación como Grunt/Gulp para empaquetar sus archivos de recursos.
en conclusión
Los 10 consejos anteriores definitivamente pueden mejorar la velocidad de sus aplicaciones web. Sin embargo, sé que hay margen de mejora y optimización. Si tiene algún consejo para mejorar el rendimiento, avíseme en la respuesta.
¡Gracias por leer!