conf-talks

Что такое Node Interface?

Интерфейс Node был еще в 2015-16 годах завезен в Relay Classic и это чисто релеевская приблуда.

Мотивация Фейсбука: обновлять локальный кэш на автомате. Зная только этот ID можно дернуть ентити через поле Query.node: query { node(id: BASE64_ID) { …on EntityType{ field1, field2, field3 } }}.

Реализация: графкуэльный ID исторически это base64(entityName + ‘:’ entityId). Такой формат позволяет десереализировать ID в резолвере Query.node на сервере. И там ты уже знаешь что за ентити и с каким айди нужны пользователю чтоб вытянуть из базы (хотя никто не мешал им вытягивать имя типа в фрагменте из 4го аргумента info в методе resolve. Но видимо тогда не доперли. Вот вам и base64 как костыль)

Проблемы интерфейса Node: клиентское двигло должно при билде нагенереть себе запросов с фрагментами `query { node(id: BASE64_ID) { …on EntityType{ field1, field2, field3 } }}. Сразу знать название ентити и набор полей. чтоб правильно составить эти фрагменты. А это практически нереально сделать. Поэтому обычно такие запросы герятся в рантайме, а это проблемы

Текущее положение: “Node interface + base64ID” в практике не показал своей пользы. В самом коде RelayModern я чет не припомню чтоб его где-то использовали. В Аполло обходятся __typename (имя типа) и id (реальный айдишник ентити из базы) – и это сейчас наиболее удобный вариант.

———

Резюме:

Итог: в 98% приложений вам интерфейс Node и base64ID не нужны.