🔥

Тред (@xanf_ua-2)


Итак urql. Если вдруг это буквосочетание прошло мимо-вас - это мощная и эффективная альтернатива apollo client в качестве graphql клиента

Когда я первый раз узрел formidable.com/open-source/ur… то-ли на Hacker News, то ли на Dev.to мой скепсис был столь же велик, как технический долг @vue/test-utils Однако из этого выросла мощная библиотека с уникальными фичами

Более того, если бы в абстрактном GitLab я бы сейчас принимал решение - я бы взял именно urql и в этом треде попробую пояснить почему

Я конечнео мог бы просто кинуть ссылку на formidable.com/open-source/ur… но все вот эти разговоры про "быстрее, выше, сильнее" - в пользу бедных :) Как известно, в программирование есть две проблемы, и обе из них есть в работе с graphql в Apollo

И если с именованием переменных мы ничего не можем сделать, то пуговицу... в смысле инвалидацию кеша частично же мы решить можем? На данный момент в Apollo есть два с половиной подхода как обновить состояние системы после мутации

Вернуть данные в мутации. Хорошо работает с изменением данных (аве, нормализация), но плохо - когда в результате меняются какие-либо списки Указать что после мутации вот такие-то query надо рефетчить - по имени 2.5 Руками обновить нужные квери в кеше после апдейта

Проблема с этими подходами очевидна - они ужасно масштабируются с ростом системы. при добавлении новой query по сути надо пройтись и указать после каких мутаций ее надо перегружать (да, здесь я немного утрирую и не рассматриваю сценарии когда нам плевать на десинхронизацию)

Добавьте туда страннейшее решение Apollo делать это в слое отображения (да, если вы вызываете мутацию несколько раз - ответственность за консистетность ваших рефетчей на вас, правда неприятно?) - и вы получите мощнейшую головную боль, а главное - потерю управляемости

Почему так и можно ли лучше? Ответ - потому что GraphQL-схема почти не несёт семантики связей между мутациями и запросами, вот никакой магии и не происходит

Почему "почти"? Потому что со значительной вероятностью если мы изменяем объект типа Х - запросы, у которых тип Х[] и подобные ему есть среди возвращаемого значения будут затронуты

Собственно это и есть киллер-фича urql которая работает на удивление хорошо - он может быть schema-aware и сделать это магически!

Божечки-кошечки! А в urql принесли таки local resolvers! formidable.com/open-source/ur… С таким подходом могу заявить, что мне неизвестно ни одного киллер-преимущества Apollo перед urql

При этом у urql сверхмощный механизм интеграции в любую часть работы urql - от кеширования до собственно отправки запросов (exchange), в разы мощнее link'ов apollo, которые весьма ограничены в своих возможностях

Другими словами, если у вас "на той стороне" не Apollo-server со специфичными для аполло экстеншнами, если вы не собираетесь в ближайшее время использовать @stream и @defer - посмотрите на urql. Мой инженерный опыт с ним в разы позитивнее чем с Apollo