4 ms·
I'll read this when I get the chance. Perhaps I'll give Relay another chance. I also found Relay a nightmare to understand. Everything is overcomplicated and
by tiglionabbit 10y ago
I'll read this when I get the chance. Perhaps I'll give Relay another chance.
I also found Relay a nightmare to understand. Everything is overcomplicated and messy, which is probably why they're talking about Relay 2.0 already. I was a bit frustrated when I found that this blog post was the most helpful piece of information I could find on Relay, and it tells you to just use FIELDS_CHANGE everywhere and ignore the rest of the mutation config features: http://blog.pathgather.com/blog/a-beginners-guide-to-relay-mutations http://blog.pathgather.com/blog/a-beginners-guide-to-relay-m... .
Some things that make Relay frustrating:
* Pointless restrictions on what you're allowed to do at the "root" require you to do everything under a "viewer" subnode instead.
* Relay "Routers" are completely pointless and should be removed.
* Mutation configs are totally confusing, and they're tightly coupled to the server-side implementation of the mutation. We have a compile step where the client inspects the schema that was generated by the server. Why can't we generate the mutation configs as well? I know there's probably not enough declarative information readily available, but there should be.
* Relay mutations are only allowed to have one input field and one output field in the GraphQL definition. This is a pointless incompatibility between Relay and non-Relay GraphQL endpoints.
Falcor also exists, and is much simpler, though it has its upsides and downsides:
* You're not allowed to pass any arguments other than the standard from/to pagination arguments. Want to implement faceted search? Too bad. It's "Not a querying language", for some reason.
* It has something called "calls" which are basically the same thing as Relay's mutations but you have a little less control over how cache invalidation is handled than you do with mutation configs. There's no RANGE_ADD, for example. To add/remove items in a list you have to invalidate the entire list. Maybe that's OK though? But it sure is annoying if you're trying to move an item from one list to another on the client side and don't need to wait for the server to catch up.
* No built-in support for optimistic updates yet.
One thing I see in common between React and Falcor is they are both rather complex ways to collaborate with yourself while ignoring events from the outside world. In other words, it's a lot of work to not have pubsub. I guess this is because pubsub doesn't scale? But in the mean time, I'm tempted to play around with Horizon instead.
- djmashko2 10y agoHave you checked out Apollo Client? It's an alternative to Relay that works with all GraphQL servers and brings in a lot of the simplicity of Falcor: http://dev.apollodata.com/ http://dev.apollodata.com/ It includes features like optimistic UI, easy ways to invalidate cache after mutations, arbitrary pagination models, and more. (Disclaimer: I work on Apollo)
- tiglionabbit 10y agoI haven't. Maybe I will some time. My conclusion after struggling with Relay, though, was that there's a lot of complexity in GraphQL that I don't understand as well. Fortunately, this guide links to a tutorial on that too: https://learngraphql.com/basics/introduction https://learngraphql.com/basics/introduction
- djmashko2 10y agoYeah I don't think there is a clear story about how to put together a GraphQL server yet. It's not inherently complex but the content isn't there yet. It's something we want to target soon.
- morgante 10y agoI'm 100% with you on Relay being overcomplicated. My first project with it involved a lot of set up and the other frontend developer completely gave up on learning Relay entirely. In contrast, for a newer project I used Apollo and was up and running in no time at all. It's very easy to reason about, but also gives you great React integrations.
- deleted 10y ago[deleted]
- mamp 10y agoReally good summary of some of the problems. There is a deeper issue which is that unless your developers understand React best practices really, really well Relay provides opportunities to screw up in a pretty big way. It goes against the 'developer experience' priorities that React was designed around. It's hard to understand and promotes some bad practices for complex applications e.g. binding domain concerns to each component rather than encouraging presentation components. Relay's constraints mean it's hard to control the way the application updates and responds to users. I'm not saying it can't be done but it requires way too much detailed knowledge of the quirks. From an agile perspective it also couples the front end and back end development too tightly. We have since moved to Redux and are going to back out Relay from the application we used it in. With all of Redux's issues (ceremony, boilerplate, etc) it provides a standard model for us to reason about, and a decoupling of data retrieval from presentation.