Итак 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