Headless Drupal 10: Creating a Decoupled Architecture for Your Web Application
Introduction
In today’s fast-paced digital landscape, many developers are opting for headless CMS solutions, which decouple the backend from the frontend. Drupal 10, with its powerful API capabilities, is an ideal choice for building a decoupled or headless architecture. By separating content management from the presentation layer, you gain the flexibility to deliver content across multiple platforms and devices, using modern JavaScript frameworks like React, Vue, or Angular for the front end.In this guide, we’ll walk through how to create a headless Drupal 10 setup and integrate it with a frontend framework to build dynamic, decoupled web applications.
Why Choose Headless Drupal?
A headless CMS allows developers to separate the backend (where content is managed) from the frontend (where content is displayed). There are several advantages to this architecture:
Flexibility: You can use any frontend technology (React, Vue, Angular) to build custom user interfaces.
Performance: Modern JavaScript frameworks optimize page rendering, improving user experience.
Multi-Platform Delivery: A headless CMS can serve content to web, mobile apps, IoT devices, and more through APIs.
Scalability: Decoupling the frontend allows each part of the application to scale independently.
Step 1: Setting Up Drupal 10 as a Headless CMS
To begin, ensure that Drupal 10 is installed and set up. If not, follow the official installation guide.Once installed, you’ll need to enable a few modules to expose the Drupal content via APIs.Enable the JSON:API ModuleDrupal 10 comes with the JSON:API module included in core, which is perfect for building headless applications. This module automatically exposes your content as a JSON API, enabling you to query and filter data easily.To enable the JSON:API module:
drush en jsonapi -y
Configure API Permissions
You’ll need to configure permissions to ensure that authenticated or anonymous users can access your API.
Go to People > Permissions (/admin/people/permissions).
Under the JSON:API section, grant the desired permissions to access content via JSON:API for specific roles.
Step 2: Exposing Content with JSON:API
With the JSON:API module enabled, all of your content types are automatically available as endpoints.For example, if you have a content type called “Article,” the API endpoint to access it will be:http://your-drupal-site/jsonapi/node/articleYou can filter, sort, and paginate content using JSON:API’s robust querying capabilities. For example:
To filter articles by title:
http://your-drupal-site/jsonapi/node/article?filter[title]=Your-Article-Title
To retrieve specific fields:
http://your-drupal-site/jsonapi/node/article?fields[node--article]=title,body
Step 3: Setting Up the Frontend Framework
Now that your Drupal backend is ready to serve content via JSON:API, it’s time to set up the frontend. Let’s take an example of integrating React, but you can apply similar steps to Vue or Angular.Install ReactCreate a new React application using
create-react-app:
npx create-react-app headless-drupal-app
cd headless-drupal-app
In your React project, use the
fetch
Open src/App.js and replace the content with:
import React, { useEffect, useState } from 'react';
function App() {
const [articles, setArticles] = useState([]);
useEffect(() => {
fetch('http://your-drupal-site/jsonapi/node/article')
.then((response) => response.json())
.then((data) => {
setArticles(data.data);
});
}, []);
return (
<div className="App">
<h1>Headless Drupal 10 Articles</h1>
<ul>
{articles.map((article) => (
<li key={article.id}>
<h2>{article.attributes.title}</h2>
<p>{article.attributes.body.value}</p>
</li>
))}
</ul>
</div>
);
}
export default App;
Replace the API endpoint with your Drupal URL.
Run the React app:
npm start
Now you should see articles fetched from your Drupal backend displayed in the React app.
Step 4: Managing Authentication and Security
To secure your decoupled Drupal setup, consider implementing authentication mechanisms such as OAuth2 or JWT tokens, especially if your frontend needs to handle authenticated user data or sensitive content.Set Up OAuth2Drupal provides an OAuth2 module that allows you to authenticate API requests. You can install and configure it by following the instructions in the OAuth2 Server documentation.
Step 5: Going Beyond the Basics
Once your headless Drupal and frontend framework are connected, you can build more complex features, such as:
Content Previews: Set up previews for editors before content is published.
Real-Time Updates: Use WebSockets or services like Firebase to fetch content updates in real-time.
Multi-Language Support: Serve content in different languages by leveraging Drupal’s built-in multilingual capabilities.
Conclusion
Headless Drupal 10 offers a powerful, flexible way to build modern web applications. By decoupling the frontend and backend, you can use the latest JavaScript frameworks to create dynamic, high-performance user experiences, while leveraging Drupal’s robust content management features.With this guide, you now have the foundation to start building a decoupled architecture with Drupal 10 and a frontend of your choice. The possibilities are endless — whether you’re building a single-page app, a mobile app, or a progressive web app, headless Drupal is up to the task.
Kiran Chaulagain
kkchaulagain@gmail.com
I am a Full Stack Software Engineer and DevOps expert with over 6 years of experience. Specializing in creating innovative, scalable solutions using technologies like PHP, Node.js, Vue, React, Docker, and Kubernetes, I have a strong foundation in both development and infrastructure with a BSc in Computer Science and Information Technology (CSIT) from Tribhuvan University. I’m passionate about staying ahead of industry trends and delivering projects on time and within budget, all while bridging the gap between development and production. Currently, I’m exploring new opportunities to bring my skills and expertise to exciting new challenges.