Recientemente hice una charla en React Summit hace unos meses hablando sobre esta idea de relay y fragmentos, lo cual fue mi viaje para comprender un enfoque fragmentado basado en relay, y realmente me sorprendió. Si estás interesado en este tema, vale la pena verlo. Sean y Gabriel han creado una excelente serie de publicaciones en el blog y una introducción a relay, que también vale la pena leer y comprender estas ideas que hacen que relay, y especialmente algunas de las herramientas basadas en fragmentos, sean increíbles.
Además, las bibliotecas Vulkan y SW también valen la pena revisar y comprender.
El siguiente problema del que me gustaría hablar es tener clientes nativos de GraphQL más allá de los frameworks de UI. Este es, nuevamente, un enfoque ligeramente más centrado en la plataforma del que estoy hablando, donde tienes esta API y no necesariamente la vas a utilizar en una UI, puedes utilizarla en una UI, puedes utilizarla en una aplicación de escritorio, puedes utilizarla en un servicio. Creo que eso es algo genial de REST, que no había un estándar muy específico que todos siguieran cuando las personas construían puntos finales de REST. Hay un estándar muy específico, pero las personas son bastante flexibles con él, y es muy flexible y las personas hacen muchas cosas. Y eso facilitó la integración de REST. Hay muchas opciones para integrar la API REST con lo que estabas construyendo, ya sea una UI o un servicio o cualquier otra cosa, ¿verdad? GraphQL hoy en día está extremadamente optimizado para la UI, pero hacer que una API de GraphQL sea utilizable en frameworks que no sean de UI también tiene una gran ventaja porque reduce el riesgo para las personas que están construyendo estos servicios, ¿verdad? Alguien como un desarrollador que construye un servicio. Si tengo que construir un servicio de GraphQL y un servicio de REST, no es divertido, ¿verdad? Y eso es uno de esos grandes riesgos, que si construyo una API completa de GraphQL y mañana otros clientes necesitan una API REST, ¿verdad? Otros desarrolladores u otros equipos u otras aplicaciones, ¿entonces mantenemos ambas APIs? Y eso es mucho trabajo, ¿verdad? Porque parece que en la conversación de GraphQL versus REST, va a ser más de GraphQL y REST en lugar de GraphQL versus REST, ¿verdad? Y por lo tanto, una de las cosas críticas que se requieren para que eso suceda es un poco más de trabajo en las herramientas del cliente de GraphQL, ¿verdad? Y creo que uno de los desafíos aquí es que las APIs de GraphQL no son necesariamente fáciles de consumir e integrar porque son demasiado flexibles. Esto no es algo malo desde el punto de vista de un desarrollador, pero tal vez desde el punto de vista de la integración y la pila tecnológica, es un poco desafiante.
Un lugar donde esto se hace evidente es cuando intentas generar tipos de código, ¿verdad? Si tienes una consulta diferente que obtiene diferentes fragmentos del mismo tipo base, podrías tener un nuevo tipo para cada consulta, ¿verdad? Y luego tienes una explosión de tipos en la aplicación, lo cual no es necesariamente un problema, pero podría resultar en algunos problemas. Rob Zoo habló sobre, ya sabes, una especie de magia avanzada del cliente de GraphQL que tuvieron que hacer en la aplicación de Java Android para no activar una recolección de basura excesiva, ¿verdad? Y así, cuando pensamos en traer estas ideas de un mejor cliente de GraphQL, que tiene menos y menos explosión de tipos para cada tipo de consulta que haces, o una experiencia de consumo más optimizada, creo que eso será fundamental para ayudar a que la adopción de GraphQL sea más fluida para los desarrolladores, sin importar lo que estén construyendo.
Dos de los enfoques que me emocionan aquí son, por supuesto, el gran trabajo que están haciendo las personas del generador de código de GraphQL en la comunidad, pero también enfoques como Juke en el mundo de SQL que proporcionan una abstracción nativa a SQL en lugar de una abstracción basada en objetos para entidades de datos. Y creo que GQLs de Sam Denty es otra idea y enfoque muy interesante que creo que Sam comenzó este año, que permite una experiencia de consumo más nativa para GraphQL. Por supuesto, la mayoría de esto está sucediendo en la comunidad de TypeScript y JavaScript, sería interesante ver este movimiento más allá de la comunidad de TypeScript y JavaScript.
Bien, el siguiente desafío es superar la brecha entre las herramientas de GraphQL y REST. Lo interesante de las APIs REST y todo el ecosistema de APIs REST es la inmensa cantidad de herramientas, herramientas de infraestructura, herramientas de proveedores en las que se ha invertido para ayudar a las personas a operar y lidiar con la introducción de APIs REST, ¿verdad? Específicamente, el monitoreo de la calidad del servicio y los controles de salud, ¿verdad? Por lo que puedes utilizar una herramienta de proveedor sin tocar tu pila tecnológica. Simplemente puedes integrar, agregar una herramienta de proveedor que comenzará a brindarte una página de estado o una página de salud que te indique cuál es la calidad de tu API, ¿verdad? Qué está fallando con códigos de estado 5xx, 4xx, cosas así, ¿verdad? Puedes configurar alertas y monitoreo bastante fácilmente, nuevamente sin hacer demasiado trabajo. Al utilizar esta herramienta de proveedor o una herramienta de infraestructura sin afectar demasiado tu trabajo, tu lógica de aplicación o tu servidor de aplicaciones, ¿verdad?
Aquí el problema con GraphQL y una de esas cosas para las que aún no creo que tengamos una buena solución es que GraphQL devuelve errores dentro del cuerpo de la respuesta, no en los códigos de estado, ¿verdad? De hecho, pueden ser errores parciales, ¿verdad? Y no hay noción de errores parciales en un código de estado. Esto significa que la herramienta que estamos utilizando para monitorear la calidad del servicio, informar errores o enviar alertas debe buscar dentro del cuerpo de la respuesta para comprender si hay un error o no. Esto es un desafío porque el cuerpo de la respuesta es información muy crítica y privada. No quieres tomar esos datos y enviarlos a una herramienta de terceros para su análisis, ¿verdad? Porque eso es esencialmente como datos de API privados muy sensibles, ¿verdad? Y por lo tanto, hay desafíos aquí para poder superar eso. Por supuesto, el almacenamiento en caché en el lado del servidor es un problema del que hemos estado hablando desde los inicios de GraphQL en cuanto a poder aprovechar los diversos puntos de red que existen entre un servidor y un cliente, ¿verdad? Todo, desde una CDN hasta los balanceadores de carga hasta los servidores en el medio que se asegurarán de que podamos realizar algún tipo de almacenamiento en caché en el lado del servidor, ¿verdad? E indicar a estos diversos puntos de red en el medio qué política de almacenamiento en caché queremos. Una idea interesante podría ser tener algún tipo de mapeo automatizado legible por humanos de GraphQL a REST, ¿verdad? Debe ser automatizado para que, como desarrolladores que construimos o utilizamos la API de GraphQL, casi no nos preocupemos por eso, ¿verdad? Debe haber suficiente, es casi similar a una idea de consultas persistidas, pero llevada un poco más lejos. Y tal vez se vea algo así, ¿verdad? Donde dices que tienes una consulta, parametrizas las variables y luego la conviertes en un punto final REST idiomático. Para que en producción, en realidad solo estés utilizando estos puntos finales REST idiomáticos y todo sobre tus herramientas funcione, pero durante el desarrollo, puedes aprovechar todas las ventajas de GraphQL, ¿verdad? Algo similar a esta idea también es utilizar GraphQL como una representación intermedia y no como una API final. Y esto realmente tiene un atractivo centrado en la plataforma, que dice que a las personas realmente les gusta explorar las APIs de GraphQL y GraphQL, ¿verdad? Si se trata de utilizar esas APIs de GraphQL en sus aplicaciones, debido a todos los desafíos de los que hablamos, ¿verdad? O si es un servicio, no lo están consumiendo dentro de una aplicación o una UI. Encogimiento de hombros emoji, ¿verdad? Básicamente, a las personas no les emociona cambiar la forma en que piensan acerca de sus clientes de API en lo que están construyendo para usar GraphQL.
Comments