Y esta pequeña capa en realidad forma parte del núcleo de Yoga. Quiero agradecer aquí a Ada, quien hizo todo esto posible y tuvo la idea inicial. Así que, al construir el motor de GraphQL y el servidor HTTP en torno a estos parámetros, obtuvimos algo que realmente funciona en todas partes.
Otra parte importante para nosotros al encajar en un stack existente es que la construcción del esquema debería ser posible de cualquier manera. Yoga no debería tener una opinión sobre cómo construir el esquema. De hecho, incluimos una utilidad para construir un esquema basado en SDL, pero no es obligatorio. Si no quieres usarlo, no estará en tu código. Por ejemplo, si implementas Yoga en Cloudflare Workers, empaquetarás tu código. Y nos aseguramos de que Yoga admita el tree shaking. Si no usas las utilidades, no formarán parte del paquete. Puedes elegir tu preferencia, ya sea usar SDL primero, usar las herramientas de GraphQL o los módulos de GraphQL si estás en el sector empresarial, o si quieres hacer código primero con GraphQL.js, no recomendado, POTUS o GQTX. Es tu elección. Tu esquema, Yoga acepta cualquier esquema de GraphQL.
Luego, el siguiente paso para nosotros fue asegurarnos de que Yoga sea completamente extensible. Con Yoga versión 2, ya nos aseguramos de que el análisis, la validación, la ejecución y la suscripción sean completamente extensibles, gracias al motor de envoltura. Pero para Yoga versión 3, queríamos ir un paso más allá. En lugar de solo permitir la extensión de las cosas específicas de GraphQL, también queríamos permitir tener el control total del flujo HTTP. Eso significa, intervenir en el enrutamiento, intervenir en el análisis de la solicitud, intervenir en la construcción de la respuesta , además de los hooks existentes para el análisis, la validación y la ejecución. Y a partir de eso, pudimos construir plugins muy potentes, uno de los cuales voy a mostrar ahora, del cual estamos muy orgullosos, es la caché de respuestas. Básicamente, es una caché para operaciones de GraphQL, por lo que si ejecutas una operación de consulta con las mismas variables una y otra vez, puedes almacenarla en caché ya sea de forma global o por sesión de usuario. Y luego, cuando se ejecuta la operación de GraphQL por segunda o tercera vez, los resultados se sirven desde la caché en lugar de tener que volver a ejecutar la operación completa de GraphQL. Eso puede reducir drásticamente la carga del servidor y puedes almacenar los resultados de ejecución de GraphQL en memoria. O si tienes múltiples réplicas del servidor, puedes usar Redis o Upstash como una caché alternativa para compartir entre múltiples instancias.
Otra cosa son las Consultas Persistentes Automáticas. Eso fue popularizado por Apollo, y básicamente es un protocolo para registrar operaciones de GraphQL recurrentes en un servidor para reducir el tráfico entre el cliente y el servidor. Entonces, un cliente puede enviar una operación, registrarla y luego, si necesita volver a ejecutar la operación de GraphQL, solo puede enviar un hash en el segundo intento, y el servidor ya conoce la operación a partir de ese hash, por lo que el tráfico entre el cliente y el servidor es muy bajo, porque lo que vimos es que generalmente, a medida que las operaciones de GraphQL se vuelven muy grandes, el cuello de botella más grande en todo el escenario de cliente a servidor es en realidad el cliente que sube el documento de GraphQL al servidor, y como antes, solo tienes que conectar tu plugin y eso es todo.
Otra cosa es la operación persistente, que es un poco similar a las consultas persistentes automáticas, pero también agrega otra capa de seguridad, porque donde las consultas persistentes automáticas permiten registrar consultas ad hoc y ahorrar ancho de banda, las operaciones persistentes solo permiten ejecutar operaciones específicas con antelación. Entonces, cualquier otra operación de GraphQL, excepto aquellas que están en el almacenamiento de operaciones persistentes y que intenta ejecutarse, será rechazada. Y este es un patrón que generalmente usamos en implementaciones de producción de GraphQL, porque generalmente queremos evitar cualquier consulta arbitraria de clientes que no conocemos. Otra cosa que encontramos muy interesante es, ¿qué pasa si tomamos una API o esquema de GraphQL y la convertimos en una API REST? Hoy en día, tenemos muchos debates sobre, oh, GraphQL versus REST, ¿cuál es mejor? Creemos que ambos tienen sus casos de uso.
Comments