GraphQL is a query language and runtime for APIs. It enables clients to specify queries and allows servers to validate data against a strongly typed schema.
Unlike REST APIs, GraphQL uses a single endpoint for all operations. GraphQL-based servers can only communicate via GraphQL queries. For simple projects, it’s feasible to use a REST client, like Axios or fetch()
, to send GraphQL queries. However, for larger, more complex projects that have advanced requirements, a GraphQL client is needed.
GraphQL clients make communication easier by abstracting away small details and implementing additional features, some of which include caching, query batching and deduplication, and static typing of GraphQL query results.
In this guide, we’ll compare the following five GraphQL clients and evaluate each in terms of functionality, community support, and size.
Let’s get started!
graphql-request
graphql-request
is a very minimal GraphQL client. The library is isomorphic, meaning it supports both Node.js and browsers. It comes with first-class TypeScript support, so typings never become outdated. The library weighs just 5.2kB.
The graphql-request
GitHub repository activity is healthy, with 3.7K stars at the time of writing. On npm, graphql-request
is downloaded more than 1.3 million times weekly at the time of writing, so you shouldn’t have any trouble finding help online!
graphql-request
is simple to use, and there’s almost no learning curve:
import { GraphQLClient, gql } from 'graphql-request' const query = gql`{ hero { name } }` const client = new GraphQLClient('<graphql-endpoint>') const data = await client.request(query)
Apollo Client is an advanced GraphQL client only for frontends. It includes features for caching, query batching, query deduplication, and pagination. It can also be used to manage local state in place of a Redux store. The base library weighs about 33.9kB.
Apollo Client is written in TypeScript, so TypeScript support is excellent. It has integrations for popular frameworks and libraries like React, Next.js, Angular, and Vue.js. Apollo Client also has a Chrome extension for inspecting and making queries.
Apollo Client is updated at least once a month. It is downloaded more than 1 million times weekly on npm and has over 16K stars and 2K forks on GitHub at the time of writing.
In addition to activity on npm and GitHub, Apollo Client enjoys online support in the form of a dedicated community forum. It also has commercial backing from Apollo GraphQL Inc.
urql aims to be both easy to use and extensible through built-in caching mechanisms with sensible defaults. urql has clients for Preact, React, and Svelte, in addition to a core library for use with Node.js on the server side.
urql’s bundle size is very small, weighing only 7.1kB. It is one of few GraphQL libraries with built-in offline support.
At the time of writing, the urql library is downloaded 95K times a week on npm, and on GitHub, urql has received over 6K stars.
urql is robust, but it is still easy to use for basic functionality:
const QUERY = ` query Test($id: ID!) { getUser(id: $id) { id name } } `; const result = client.readQuery(QUERY, { id: 'test' });
Relay is a highly performant and scalable GraphQL client developed by Facebook.
As you might guess, Relay was built with React in mind. As such, it takes a component-based approach to data fetching. Relay is highly opinionated and is strictly for use with React frontends. Relay has a bundle size of 47.1 kB.
At the time of writing, Relay is downloaded at least 94K times a week on npm and has received over 15K stars and over 1.5K forks on GitHub.
By enforcing a rigid convention, Relay offers less room for mistakes, which can be both positive and negative.
graphql-hooks
graphql-hooks
is a very small GraphQL client for React. Despite its tiny size, graphql-hooks
features first-class support for caching, pagination, authentication, file uploads, and server-side rendering. Its bundle size weighs only 3.6kB.
The client provides the useQuery
, useMutation
, and useSubscription
React Hooks for handling queries, mutations, and subscriptions, respectively. The official documentation includes a guide to migrate from Apollo Client.
graphql-hooks
is downloaded 6K times monthly on npm to go along with 1.5K stars on GitHub.
The table below summarizes the information discussed above.
Community support |
Learning curve |
Size | TypeScript typings | Pagination, query caching, batching, and deduplication |
Isomorphic support | Integrations with UI libraries and frameworks | |
---|---|---|---|---|---|---|---|
graphql-request |
Great | Low | 5.2 kB | Yes | No | Yes | No |
Apollo Client | Great | Medium | 33.9 kB | Yes | Yes | Client only | React, Next.js, Angular, Svelte, Ember, web components, and Vue |
urql | Fair | Low | 7.1 kB | Yes | Batching not supported | Yes | React, Svelte, and Vue |
Relay | Fair | High | 47.1 kB | No | Yes | Client only | React only |
graphql-hooks |
Low | Low | 3.6 kB | Yes | Batching and deduplication not supported | Client only | React only |
Choosing the best client for your project will depend heavily on your individual goals and needs. You can, however, use the guidelines listed below as a starting point:
graphql-request
: server-side or frontend project with simple requirementsgraphql-hooks
: project is React-based and doesn’t require advanced featuresGraphQL clients make interfacing with GraphQL APIs much easier than calling them directly.
Every GraphQL client has its pros and cons. Choosing a client that offers the best features for your use case is paramount to a smooth development experience. Selecting the optimal client will depend on your unique project, and there might not always be an obvious answer. Hopefully, the information in this article will help you to get started!
LogRocket is like a DVR for web and mobile apps, recording literally everything that happens on your site. Instead of guessing why problems happen, you can aggregate and report on problematic GraphQL requests to quickly understand the root cause. In addition, you can track Apollo client state and inspect GraphQL queries' key-value pairs.
LogRocket instruments your app to record baseline performance timings such as page load time, time to first byte, slow network requests, and also logs Redux, NgRx, and Vuex actions/state. Start monitoring for free.Would you be interested in joining LogRocket's developer community?
Join LogRocket’s Content Advisory Board. You’ll help inform the type of content we create and get access to exclusive meetups, social accreditation, and swag.
Sign up nowLearn how to implement one-way and two-way data binding in Vue.js, using v-model and advanced techniques like defineModel for better apps.
Compare Prisma and Drizzle ORMs to learn their differences, strengths, and weaknesses for data access and migrations.
It’s easy for devs to default to JavaScript to fix every problem. Let’s use the RoLP to find simpler alternatives with HTML and CSS.
Learn how to manage memory leaks in Rust, avoid unsafe behavior, and use tools like weak references to ensure efficient programs.
3 Replies to "5 GraphQL clients for JavaScript and Node.js"
`graphql-request` has 3.7k GitHub stars instead of millions. Typo aside, great article!
Thanks for the catch 😅
I wanted to put a plug in for gqless! I haven’t used in production yet, but am itching to.