Top Related Projects
Peace of mind from prototype to production
A toolkit for data mapping and language integrated query.
An Elixir implementation of gRPC
Compose web applications with functions
Elixir is a dynamic, functional language for building scalable and maintainable applications
Quick Overview
Absinthe is a GraphQL toolkit for Elixir, providing a robust and flexible implementation of the GraphQL specification. It allows developers to build scalable and efficient GraphQL APIs in Elixir, with support for real-time subscriptions, custom schema definitions, and integration with popular Elixir web frameworks.
Pros
- Seamless integration with Elixir and Phoenix ecosystem
- Excellent performance and scalability due to Elixir's concurrency model
- Comprehensive feature set, including subscriptions and custom directives
- Active community and regular updates
Cons
- Steeper learning curve for developers new to Elixir or functional programming
- Limited resources and tutorials compared to more mainstream GraphQL implementations
- Some advanced features may require additional plugins or extensions
Code Examples
- Defining a simple GraphQL schema:
defmodule MyAppWeb.Schema do
use Absinthe.Schema
query do
field :hello, :string do
resolve fn _, _, _ -> {:ok, "Hello, world!"} end
end
end
end
- Creating a resolver for a more complex type:
defmodule MyAppWeb.Resolvers.User do
def list_users(_parent, _args, _resolution) do
{:ok, MyApp.Accounts.list_users()}
end
def get_user(_parent, %{id: user_id}, _resolution) do
case MyApp.Accounts.get_user(user_id) do
nil -> {:error, "User not found"}
user -> {:ok, user}
end
end
end
- Setting up a subscription:
defmodule MyAppWeb.Schema do
use Absinthe.Schema
# ... other schema definitions
subscription do
field :user_created, :user do
config fn _, _ ->
{:ok, topic: "users"}
end
end
end
end
Getting Started
To start using Absinthe in your Elixir project:
- Add Absinthe to your
mix.exs
dependencies:
def deps do
[
{:absinthe, "~> 1.7"},
{:absinthe_plug, "~> 1.5"}
]
end
-
Run
mix deps.get
to install the dependencies. -
Create a schema file (e.g.,
lib/my_app_web/schema.ex
) and define your GraphQL schema:
defmodule MyAppWeb.Schema do
use Absinthe.Schema
query do
# Define your queries here
end
mutation do
# Define your mutations here
end
end
- Configure Absinthe in your Phoenix router (
lib/my_app_web/router.ex
):
defmodule MyAppWeb.Router do
use MyAppWeb, :router
forward "/api", Absinthe.Plug,
schema: MyAppWeb.Schema
forward "/graphiql", Absinthe.Plug.GraphiQL,
schema: MyAppWeb.Schema
end
Now you can start building your GraphQL API with Absinthe!
Competitor Comparisons
Peace of mind from prototype to production
Pros of Phoenix
- Full-featured web framework with built-in ORM, routing, and templating
- Excellent performance and scalability for real-time applications
- Large and active community with extensive documentation and resources
Cons of Phoenix
- Steeper learning curve for developers new to Elixir or functional programming
- May be overkill for simple API-only applications or microservices
- Less flexible for non-standard architectures or custom data layers
Code Comparison
Phoenix (Router):
defmodule MyAppWeb.Router do
use MyAppWeb, :router
scope "/api", MyAppWeb do
pipe_through :api
resources "/users", UserController, only: [:index, :show]
end
end
Absinthe (Schema):
defmodule MyAppWeb.Schema do
use Absinthe.Schema
query do
field :users, list_of(:user) do
resolve &MyApp.Resolvers.User.list_users/3
end
end
end
While Phoenix is a comprehensive web framework, Absinthe is specifically designed for building GraphQL APIs in Elixir. Phoenix provides a traditional REST-style routing system, whereas Absinthe uses a schema-based approach for defining GraphQL types and resolvers. Both are powerful tools, but they serve different purposes within the Elixir ecosystem.
A toolkit for data mapping and language integrated query.
Pros of Ecto
- More comprehensive database toolkit, offering query building, migrations, and schema definitions
- Supports multiple databases, including PostgreSQL, MySQL, and SQLite
- Provides powerful associations and preloading capabilities for complex data relationships
Cons of Ecto
- Steeper learning curve due to its broader scope and feature set
- May be overkill for simple applications or those not requiring a full ORM
- Less focused on GraphQL-specific functionality
Code Comparison
Ecto query example:
query = from u in User,
where: u.age > 18,
select: u.name
Repo.all(query)
Absinthe resolver example:
resolve fn _, _, _ ->
users = Repo.all(from u in User, where: u.age > 18, select: u.name)
{:ok, users}
end
While Ecto is a powerful database toolkit for Elixir applications, Absinthe focuses specifically on GraphQL implementation. Ecto excels in database interactions and complex queries, whereas Absinthe shines in creating GraphQL APIs. The choice between them depends on the project's requirements, with Ecto being more suitable for general database operations and Absinthe for GraphQL-centric applications.
An Elixir implementation of gRPC
Pros of grpc
- Better performance for high-volume, low-latency communication
- Strong typing and contract-first approach
- Built-in support for streaming data
Cons of grpc
- Steeper learning curve compared to GraphQL
- Less flexibility in querying data
- More complex setup and configuration
Code Comparison
Absinthe (GraphQL) schema definition:
object :user do
field :id, :id
field :name, :string
field :email, :string
end
grpc protocol definition:
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
While Absinthe uses Elixir-native syntax for schema definition, grpc relies on Protocol Buffers for service and message definitions. Absinthe offers a more declarative approach to defining types and relationships, while grpc focuses on strict message structures and RPC-style communication.
Absinthe excels in flexibility and ease of use for web APIs, making it ideal for client-driven data fetching. grpc, on the other hand, shines in scenarios requiring high-performance, bi-directional streaming, and strong typing, particularly in microservices architectures.
Choose Absinthe for GraphQL-based APIs with flexible querying, or opt for grpc when dealing with high-throughput, low-latency communication between services.
Compose web applications with functions
Pros of Plug
- More general-purpose and flexible for building web applications
- Simpler and easier to learn for beginners
- Lightweight and fast, with minimal overhead
Cons of Plug
- Lacks built-in GraphQL support
- Requires more manual setup for complex API scenarios
- Less specialized tooling for API development
Code Comparison
Plug example:
defmodule MyApp.Router do
use Plug.Router
plug :match
plug :dispatch
get "/hello" do
send_resp(conn, 200, "Hello, World!")
end
end
Absinthe example:
defmodule MyApp.Schema do
use Absinthe.Schema
query do
field :hello, :string do
resolve fn _, _, _ -> {:ok, "Hello, World!"} end
end
end
end
Plug is a general-purpose web application framework for Elixir, while Absinthe is specifically designed for building GraphQL APIs. Plug offers more flexibility and simplicity for various web applications, making it easier for beginners to get started. However, Absinthe provides specialized tools and abstractions for GraphQL, making it more suitable for complex API development scenarios. The code examples demonstrate the difference in approach, with Plug using a routing-based system and Absinthe utilizing a schema-based structure for defining GraphQL queries.
Elixir is a dynamic, functional language for building scalable and maintainable applications
Pros of Elixir
- General-purpose programming language with a broader scope and application range
- Built-in concurrency support through the Erlang VM (BEAM)
- Extensive standard library and ecosystem for various development needs
Cons of Elixir
- Steeper learning curve for developers new to functional programming
- Smaller community compared to mainstream languages like Python or JavaScript
- Limited tooling and IDE support compared to more established languages
Code Comparison
Elixir (basic HTTP request):
defmodule HttpClient do
def get(url) do
HTTPoison.get!(url).body
end
end
Absinthe (GraphQL schema definition):
defmodule MyAppWeb.Schema do
use Absinthe.Schema
query do
field :hello, :string do
resolve fn _, _, _ -> {:ok, "Hello, world!"} end
end
end
end
While Elixir is a general-purpose programming language, Absinthe is a specialized GraphQL toolkit for Elixir. Elixir provides the foundation for building various applications, including web services, while Absinthe focuses on implementing GraphQL APIs within Elixir projects. Elixir offers more flexibility and broader use cases, whereas Absinthe excels in GraphQL-specific functionality and integration with Elixir-based web frameworks like Phoenix.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Absinthe
GraphQL implementation for Elixir.
Goals:
- Complete implementation of the GraphQL Working Draft.
- An idiomatic, readable, and comfortable API for Elixir developers
- Extensibility based on small parts that do one thing well.
- Detailed error messages and documentation.
- A focus on robustness and production-level performance.
Please see the website at https://absinthe-graphql.org.
Why Use Absinthe?
Absinthe goes far beyond GraphQL specification basics.
Easy-to-Read, Fast-to-Run Schemas
Absinthe schemas are defined using easy-to-read macros that build and verify their structure at compile-time, preventing runtime errors and increasing performance.
Pluggability
The entire query processing pipeline is configurable. Add, swap out, or remove the parser, individual validations, or resolution logic at will, even on a per-document basis.
Advanced Resolution
Absinthe includes a number of advanced resolution features, to include:
- Asynchronous field resolution
- Batched field resolution (addressing N+1 query problems)
- A resolution plugin system supporting further extensibility
Safety
- Complexity analysis and configurable limiting
- Support for precompiled documents/preventing custom documents
Idiomatic Documents, Idiomatic Code
Write your schemas in idiomatic Elixir snake_case
notation. Absinthe can
transparently translate to camelCase
notation for your API clients.
Or, define your own translation schema by writing a simple adapter.
Frontend Support
We care about support for third-party frameworks, both on the back and front end.
So far, we include specialized support for Phoenix and Plug on the backend, and Relay on the frontend.
Of course we work out of the box with other frontend frameworks and GraphQL clients, too.
Installation
Install from Hex.pm:
def deps do
[{:absinthe, "~> 1.7.0"}]
end
Note: Absinthe requires Elixir 1.10 or higher.
Upgrading
See CHANGELOG for upgrade steps between versions.
Documentation
- Absinthe hexdocs.
- For the tutorial, guides, and general information about Absinthe-related projects, see https://absinthe-graphql.org.
Mix Tasks
Absinthe includes a number of useful Mix tasks for extracting schema metadata.
Run mix help
in your project and look for tasks starting with absinthe
.
Related Projects
See the GitHub organization.
Community
The project is under constant improvement by a growing list of
contributors, and your feedback is important. Please join us in Slack
(#absinthe-graphql
under the Elixir Slack account) or the Elixir Forum
(tagged absinthe
).
Please remember that all interactions in our official spaces follow our Code of Conduct.
Contribution
Please follow contribution guide.
License
See LICENSE.md.
Top Related Projects
Peace of mind from prototype to production
A toolkit for data mapping and language integrated query.
An Elixir implementation of gRPC
Compose web applications with functions
Elixir is a dynamic, functional language for building scalable and maintainable applications
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot