I was a huge proponent of GraphQL and used it for many clients. For me, it solved a specific need - I can write an API backend that is scalable across clients (Web, iOS, Android). However, having said that, I have made the mistake of using GraphQL for projects that only have web interfaces with somewhat complex querying (but with vague ideas of expanding to apps later). It wasted so much of my time that I ditched the project halfway and re-wrote everything using normal CRUD interfaces. I use Phoenix + LiveView now, and it's truly a god send to write code without having to touch any Javascript. Not only are my interfaces way lighter, but they also feel very natural and I get server rendered error messages out of the box without having to parse them on my frontend.<p>GraphQL is a rabbit hole. Don't use it unless absolutely necessary or you have a small to mid-sized team for large scale projects. Atleast on Phoenix/Elixir side of things, it's just not worth the effort - you need to write resolvers apart from your schema/models, handle changeset errors in the frontend (which there is no way to deal with directly as of this comment) and if you're working with VueJS, then good luck. My package.json is so bloated that I am starting to feel it's all just a pack of cards. I can't stress enough how much valuable developer time I wasted getting all these bits and pieces working together. Usually, you can't use one because the other one is outdated, or has some weird Github issue you now need to address. And then that causes another probelm..and another one..[the rabbit hole goes deep]<p><pre><code> "@babel/core": "^7.0.0",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/preset-env": "^7.0.0",
"apollo-absinthe-upload-link": "^1.5.0",
"apollo-cache-inmemory": "^1.6.1",
"apollo-client": "^2.6.1",
"apollo-link": "^1.2.11",
"apollo-link-context": "^1.0.17",
"babel-loader": "^8.0.0",
"babel-preset-env": "^1.7.0",
"coffee-loader": "^0.9.0",
"copy-webpack-plugin": "^4.5.0",
"css-loader": "^2.1.1",
"file-loader": "^3.0.1",
"graphql": "^14.3.1",
"graphql-tag": "^2.10.1",
"mini-css-extract-plugin": "^0.4.0",
"node-sass": "^4.12.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"resolve-url-loader": "^3.1.0",
"sass-loader": "^7.1.0",
"script-loader": "^0.7.2",
"style-loader": "^0.23.1",
"uglifyjs-webpack-plugin": "^1.2.4",
"vue-apollo": "^3.0.0-beta.30",
"vue-loader": "^15.7.0",
"vue-template-compiler": "^2.6.10",
</code></pre>
When DHH ranted about these, I never believed him and I always thought he was not upto par with JS frameworks. But turns out, everything he said was true. Turns out, you don't need GraphQL at all for most use cases when you can simply get away with something like Tubrolinks or LiveView.