Drupal Headless cu Next.js: arhitectură decoupled pentru performanță maximă 2026
Drupal headless cu Next.js este arhitectura care combină cel mai puternic CMS enterprise din lume (Drupal — content modeling, permisiuni, multilingual) cu cel mai performant framework frontend (Next.js — SSG, ISR, Edge, React Server Components). Rezultatul: un site cu Core Web Vitals excelente, editorial experience matur și scalabilitate nelimitată.
Această arhitectură decoupled separă backend-ul (Drupal servește conținut prin API) de frontend (Next.js consumă API-ul și generează pagini statice sau server-rendered). Spre deosebire de un Drupal monolitic care generează HTML pe server PHP, frontend-ul Next.js poate fi servit de pe CDN edge cu TTFB sub 100ms — o diferență masivă de performanță.
Context 2026: Peste 40% din proiectele enterprise Drupal folosesc o formă de arhitectură headless/decoupled. Pachetul
next-drupal(v2.0.1, menținut de Chapter Three) oferă integrare out-of-the-box: client JSON:API, inline preview, autentificare și suport complet pentru Next.js 15 App Router.
Ce înseamnă Drupal headless și de ce contează?
Într-o arhitectură headless (sau decoupled), Drupal nu mai generează HTML-ul paginii. În schimb, expune conținutul prin API (JSON:API sau GraphQL), iar un frontend separat (Next.js) consumă acel API și construiește interfața.
| Aspect | Drupal monolitic (tradițional) | Drupal headless + Next.js |
|---|---|---|
| Generare HTML | PHP server (Drupal Twig) | Next.js (SSG/SSR/ISR) |
| Performanță frontend | Dependentă de server PHP | CDN edge, sub 100ms TTFB |
| Editorial UX | Complet în Drupal admin | Drupal admin + live preview |
| Scalabilitate frontend | Vertical (mai mult PHP/RAM) | Horizontal (CDN, edge, serverless) |
| Core Web Vitals | Bune (cu BigPipe/caching) | Excelente (static + React) |
| Flexibilitate frontend | Limitată la Twig | React complet, orice UI |
| Complexitate arhitectură | Simplă (un server) | Medie (2 sisteme) |
Când merită headless: Proiecte unde performanța frontend, experiența utilizator custom și scalabilitatea sunt critice — eCommerce cu trafic mare, portale media, aplicații web complexe, multisite cu frontend-uri diferite pe același backend Drupal.
Când NU merită: Site-uri simple corporate cu 10-20 pagini — overhead-ul arhitectural nu se justifică. În acest caz, un Drupal monolitic sau WordPress este suficient.
Ce este JSON:API în Drupal și cum expune conținut?
JSON:API este modulul core Drupal (inclus din Drupal 8.7) care expune automat toate entitățile Drupal ca endpoints REST conformă cu specificația {json:api}. Zero configurare necesară — activezi modulul și tot conținutul devine accesibil.
Pasul 1: Activează și configurează JSON:API pe Drupal
- Activează modulul:
drush en jsonapi(inclus în core, doar activare) - Endpoint default:
https://drupal.site/jsonapi— listează toate resursele disponibile - Exemplu request:
GET /jsonapi/node/article→ returnează toate articolele cu câmpuri, relații, traduceri - Filtrare:
?filter[status]=1— doar conținut publicat - Include relații:
?include=field_image,field_tags— include entități referențiate într-un singur request - Sparse fieldsets:
?fields[node--article]=title,body,field_image— returnează doar câmpurile necesare
Alternativa GraphQL: Modulul contribuit GraphQL (v4.x) oferă queries custom, mai flexibile pentru frontend-uri complexe. Avantaj: un singur request pentru date imbriate. Dezavantaj: configurare manuală, curba de învățare mai mare.
| API | Configurare | Flexibilitate | Performance | Best for |
|---|---|---|---|---|
| JSON:API (core) | Zero config | Bună (filtru/include) | Bună (cacheable) | 75%+ din proiecte |
| GraphQL (contrib) | Manuală | Excelentă (custom queries) | Variabilă (N+1 risk) | Frontend-uri complexe |
Recomandare: Începe cu JSON:API — zero overhead, spec-compliant, cacheable. Treci la GraphQL doar dacă ai nevoie de queries complexe care ar necesita multiple JSON:API requests.
Cum funcționează next-drupal și ce oferă?
next-drupal este pachetul npm (menținut de Chapter Three) care conectează Next.js cu Drupal prin JSON:API. Versiunea curentă (2.0.1, decembrie 2025) suportă Next.js 15 App Router cu React Server Components.
Pasul 2: Instalează și configurează next-drupal pe frontend
Instalare:
npx create-next-app drupal-frontend
cd drupal-frontend
npm install next-drupal
Configurare client:
// lib/drupal.ts
import { DrupalClient } from "next-drupal"
export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: {
clientId: process.env.DRUPAL_CLIENT_ID,
clientSecret: process.env.DRUPAL_CLIENT_SECRET,
},
}
)
Fetch conținut:
// app/blog/page.tsx
import { drupal } from "@/lib/drupal"
export default async function BlogPage() {
const articles = await drupal.getResourceCollection("node--article", {
params: {
"filter[status]": 1,
"fields[node--article]": "title,body,path,created",
include: "field_image",
sort: "-created",
},
})
return <ArticleList articles={articles} />
}
Ce oferă next-drupal:
- JSON:API client — type-safe, cu filtrare, include, sort, paginare
- Inline preview — editorii Drupal văd live preview-ul paginii Next.js direct în admin
- Draft mode — afișează conținut nepublicat prin Next.js preview API routes
- Webform integration — formulare Drupal Webform redate ca React components
- Authentication — OAuth 2.0 via Simple OAuth module
- Incremental Static Regeneration — revalidare automată la publicare/editare conținut
Ce modele de arhitectură decoupled există?
| Model | Descriere | Complexitate | Best for |
|---|---|---|---|
| Fully decoupled | Drupal = API only, Next.js = tot frontend-ul | Medie-mare | Site-uri noi, SPA, PWA |
| Progressively decoupled | Drupal renders page shell, React components embedded | Mică-medie | Migrare graduală, admin UX intact |
| Static site generation | Next.js build-time fetch din Drupal API → HTML static | Mică | Blog, docs, site-uri cu update rar |
| Hybrid (ISR) | Static + revalidare incrementală la publicare | Medie | Content sites cu update frecvent |
Recomandare 2026: Hybrid ISR este modelul optim pentru majoritatea proiectelor — paginile sunt pre-generate static (performanță CDN), dar se revalidează automat când editorii publică conținut nou. Zero rebuild complet, zero downtime.
Pasul 3: Configurează rendering strategy per tip de conținut
Exemplu arhitectură hybrid:
| Content type | Rendering strategy | Revalidare | Motivație |
|---|---|---|---|
| Pagini statice (About, Contact) | SSG (build time) | Manual/webhook | Schimbări rare |
| Articole blog | ISR (revalidare 60s) | La publicare | Content frecvent |
| Pagini produs | ISR (revalidare 30s) | La update preț/stock | Freshness critică |
| Dashboard user | SSR (server-side) | Real-time | Date personalizate |
| Search results | SSR + streaming | Real-time | Query-dependent |
// app/blog/[slug]/page.tsx
export const revalidate = 60 // ISR: revalidare la 60 secunde
export async function generateStaticParams() {
const articles = await drupal.getResourceCollection("node--article")
return articles.map((article) => ({ slug: article.path.alias }))
}
Cum funcționează preview-ul pentru editori?
Una dintre cele mai mari provocări ale arhitecturii headless este editorial preview — editorii trebuie să vadă cum arată conținutul înainte de publicare. next-drupal rezolvă asta elegant:
Pasul 4: Configurează inline preview în Drupal admin
Pe Drupal:
- Instalează modulul Next.js (
drupal/next):composer require drupal/next - Configurează site entity: Admin → Configuration → Next.js Sites → Add site
- Setează: Base URL =
https://frontend.vercel.app, Preview URL, Preview secret - Instalează Simple OAuth pentru autentificare preview requests
Pe Next.js:
- Creează API route pentru draft mode:
// app/api/draft/route.ts
import { enableDraftMode } from "next-drupal/draft"
export async function GET(request: Request) {
return enableDraftMode(request, drupal)
}
- Paginile detectează automat draft mode și afișează conținut nepublicat
Experiența editorului: Deschide un articol în Drupal admin → click Preview → vede pagina Next.js cu conținutul draft direct în iframe Drupal. Editează → salvează → preview-ul se actualizează instant.
Avantaj major: Editorii nu trebuie să învețe un tool nou — lucrează în Drupal admin ca întotdeauna, dar văd rezultatul final pe frontend-ul Next.js.
Cum gestionezi autentificarea între Drupal și Next.js?
Autentificarea este necesară pentru: preview conținut nepublicat, acces la endpoints protejate, formulare autentificate.
| Metodă | Modul Drupal | Use case | Complexitate |
|---|---|---|---|
| OAuth 2.0 | Simple OAuth | Standard, recomandat | Medie |
| JWT | JWT Authentication | API-to-API, microservices | Medie |
| API Key | Key Auth | Simple, internal | Mică |
| Cookie-based | Core | Progressively decoupled | Mică |
Setup OAuth 2.0 (recomandat):
composer require drupal/simple_oauth- Generează chei RSA:
openssl genrsa -out private.key 2048 && openssl rsa -in private.key -pubkey -out public.key - Configurează: Admin → Configuration → Simple OAuth → set key paths
- Creează Consumer: Admin → Configuration → Simple OAuth → Consumers → Add
- Setează grant type:
client_credentials(pentru next-drupal) +authorization_code(pentru user login) - Adaugă client ID și secret în
.env.localNext.js
Role-based access este enforced pe Drupal server-side — indiferent ce frontend request trimite, Drupal verifică permisiunile per entitate/câmp. Aceasta înseamnă că securitatea nu depinde de frontend.
Cum se face hosting-ul pentru arhitectura decoupled?
Arhitectura decoupled necesită 2 instanțe separate de hosting:
| Component | Opțiuni hosting | Cost lunar | Best for |
|---|---|---|---|
| Drupal backend | Acquia, Pantheon, Platform.sh, LAMP VPS | €30-500+ | PHP traditional |
| Next.js frontend | Vercel, Netlify, AWS Amplify, Node VPS | €0-100+ (Vercel free tier) | Edge/serverless |
| Database | Managed MySQL/MariaDB/PostgreSQL | Inclus sau €10-50 | Reliability |
| Media storage | AWS S3, Cloudflare R2 | €5-50 | Scalabilitate |
Arhitectura de hosting recomandată:
[Utilizator] → [Vercel CDN Edge] → [Next.js Serverless]
↓ (API calls)
[Drupal PHP Server]
↓
[MySQL Database]
[S3 Media Storage]
Avantaj: Frontend-ul Next.js pe Vercel servește pagini static de pe edge (200+ locații globale), cu TTFB sub 50ms. Drupal-ul backend poate sta pe un server PHP modest — nu mai servește trafic direct, doar API calls de la Next.js la build time sau revalidare.
Cost comparison: Drupal monolitic pe server capabil de 10K vizitatori/zi: €100-200/lună. Drupal headless (backend PHP mic + Vercel Pro): €50-70/lună total, cu performanță 5-10x mai bună. Scalarea se face pe Vercel (automat), nu pe PHP.
Ce performanță câștigi cu Drupal headless + Next.js?
| Metric | Drupal monolitic | Drupal headless + Next.js | Diferență |
|---|---|---|---|
| TTFB | 200-800ms (PHP render) | 30-80ms (CDN edge) | 5-10x mai rapid |
| LCP | 1.5-3.5s | 0.8-1.5s | 2x mai rapid |
| CLS | 0.05-0.15 | 0.01-0.05 | 3x mai stabil |
| INP | 100-300ms | 50-150ms | 2x mai rapid |
| Lighthouse score | 60-85 | 90-100 | Consistent green |
| Concurrent users | 500-2K (depinde de PHP) | 100K+ (CDN/serverless) | 50-100x |
De ce diferența e atât de mare:
- Next.js pre-generează HTML-ul la build time sau ISR → servit de pe CDN, zero server processing
- React Server Components (Next.js 15) reduc JavaScript-ul client-side cu 40-60%
- Vercel Edge Runtime procesează requests în < 10ms vs PHP-ul care trebuie să booteze Drupal (50-200ms)
- Image optimization Next.js (next/image) servește automat WebP/AVIF la dimensiunea corectă
Aceste îmbunătățiri de performanță au impact direct pe Core Web Vitals și implicit pe ranking-ul SEO — Google folosește CWV ca factor de ranking din 2021.
Care sunt provocările arhitecturii headless?
Headless nu este gratuit — vine cu trade-off-uri:
- Complexitate deployment — 2 sisteme de menținut, CI/CD separat pentru fiecare
- Preview setup — necesită configurare next-drupal + Simple OAuth + API routes
- Search — Drupal Search nu funcționează pe frontend; necesită Solr/Elasticsearch/Algolia separat
- Formulare — Drupal Webform necesită integrare custom sau next-drupal Webform support
- Breadcrumbs și meniuri — trebuie fetch-uite din Drupal API, nu sunt automate
- Multilingual routing — necesită configurare manuală pe Next.js (i18n routing + fetch per limbă)
- Cache invalidation — la publicare conținut, Next.js trebuie notificat să revalideze (webhook sau on-demand ISR)
Pasul 5: Configurează revalidare automată la publicare
Webhook Drupal → Next.js:
- Instalează Webhooks module pe Drupal:
composer require drupal/webhooks - Configurează webhook: la eveniment
entity:node:update→ POSThttps://frontend.vercel.app/api/revalidate - Pe Next.js, creează API route:
// app/api/revalidate/route.ts
import { revalidatePath } from "next/cache"
export async function POST(request: Request) {
const { secret, path } = await request.json()
if (secret !== process.env.REVALIDATION_SECRET) {
return new Response("Unauthorized", { status: 401 })
}
revalidatePath(path)
return new Response("Revalidated")
}
- Editorul publică conținut → Drupal trimite webhook → Next.js revalidează pagina → CDN servește versiunea nouă
Rezultat: Conținut actualizat pe frontend în 1-5 secunde de la publicare în Drupal, fără rebuild complet.
Ce greșeli frecvente se fac în proiecte Drupal headless?
- Alegi headless pentru un site simplu — overhead-ul nu se justifică pentru 10-20 pagini
- Nu configurezi preview — editorii nu pot vedea cum arată conținutul, experiență slabă
- Fetch excesiv din API — prea multe requests la Drupal la build time, build-uri de 30+ minute
- Nu implementezi ISR — rebuild complet la fiecare schimbare = inacceptabil pentru content frecvent
- Ignori cache invalidation — conținut publicat în Drupal nu apare pe frontend ore/zile
- Nu setezi auth corect — endpoint-uri expuse fără autentificare, risc securitate
- Frontend overengineered — React state management complex când SSG simplu era suficient
- Nu optimizezi imagini — fetch imagini raw din Drupal în loc de next/image optimization
- Nu plănuiești SEO tehnic — sitemap, meta tags, structured data trebuie generate pe Next.js
- Nu testezi performanța real — presupun că „headless = rapid" fără a măsura Core Web Vitals
Cum se compară Drupal headless cu alte opțiuni CMS?
| CMS Backend | API Type | Content Modeling | Multilingual | Self-hosted | Best for |
|---|---|---|---|---|---|
| Drupal | JSON:API (core) + GraphQL | Excelent — entități/câmpuri | Nativ (4 module core) | Da | Enterprise, gov, complex |
| WordPress | REST API (core) | Bun — CPTs + ACF | Plugin (WPML) | Da | Blog, corporate simplu |
| Strapi | REST + GraphQL | Bun — content types | Plugin (i18n) | Da | Startup, prototip rapid |
| Sanity | GROQ | Excelent — schema custom | Built-in | Nu (SaaS) | Media, editorial |
| Contentful | REST + GraphQL | Bun — content models | Built-in | Nu (SaaS) | Enterprise SaaS |
De ce Drupal câștigă pentru enterprise headless: Content modeling cel mai matur, permisiuni granulare, multilingual nativ, self-hosted (data sovereignty), ecosistem de 20+ ani. Alternativele SaaS (Sanity, Contentful) au costuri care cresc exponențial cu volumul de conținut.
Dacă ești la început cu Next.js și vrei să înțelegi avantajele față de alte framework-uri, citește comparația Next.js vs WordPress — multe din argumentele de acolo se aplică și pentru frontend-ul unui Drupal headless.
Cum planifici un proiect Drupal headless + Next.js?
Checklist de start:
- Definește content types și relații în Drupal (content modeling document)
- Alege rendering strategy per content type (SSG, ISR, SSR)
- Configurează JSON:API cu filtre și include-uri optimizate
- Instalează next-drupal și configurează client
- Setează OAuth 2.0 (Simple OAuth) pentru preview și draft mode
- Configurează hosting: Drupal pe PHP server, Next.js pe Vercel
- Implementează webhook revalidare la publicare
- Configurează SEO on-page: meta tags, sitemap, structured data pe Next.js
- Testează Core Web Vitals pre-launch
- Configurează GA4 și conversion tracking pe frontend Next.js
Pentru migrarea de la Drupal 7 monolitic la Drupal 10/11 headless, consultă ghidul dedicat de migrare Drupal — acoperă tot procesul tehnic inclusiv SEO preservation.
Glosar termeni Drupal headless
- Decoupled — arhitectură unde backend (CMS) și frontend (UI) sunt sisteme separate
- JSON:API — specificație REST pentru API-uri, modul core Drupal
- ISR (Incremental Static Regeneration) — revalidare individuală pagini fără rebuild complet
- next-drupal — pachet npm de Chapter Three pentru integrare Next.js + Drupal
- Simple OAuth — modul Drupal pentru server OAuth 2.0
- Draft Mode — funcționalitate Next.js pentru preview conținut nepublicat
- Webhook — HTTP callback trimis automat la un eveniment (ex: publicare nod)
- React Server Components — componente React renderizate pe server, zero client JS
- Edge Runtime — execuție cod pe CDN edge nodes (Vercel Edge, CloudFlare Workers)
- Content Modeling — procesul de definire a structurii de date (entități, câmpuri, relații)
Vrei un proiect Drupal headless cu Next.js? Echipa Digital Rocket dezvoltă arhitecturi decoupled — Drupal backend cu content modeling complex, Next.js frontend pe Vercel cu Core Web Vitals excelente. De la arhitectură și dezvoltare web, până la deploy și optimizare. Contactează-ne pentru o consultanță tehnică gratuită.
Ai nevoie de ajutor cu campaniile PPC?
Echipa Digital Rocket te poate ajuta să obții rezultate mai bune din publicitatea online.
Cere o consultație gratuită