Blog

Comment intégrer React avec Drupal

30.05.2024
logo-react

L'intégration de frameworks frontend comme React avec des systèmes de gestion de contenu (CMS) est une tendance croissante dans le développement web. Cet article vise à guider les développeurs à travers le processus d'intégration de React avec Drupal, en tirant parti des avantages de ces deux technologies.

Introduction à Drupal et React

drupal-react

Drupal est un CMS open-source largement utilisé pour la gestion de contenu complexe. Ses fonctionnalités incluent une extensibilité via des modules, une gestion avancée des utilisateurs, et une forte capacité de personnalisation. Il est particulièrement apprécié pour sa robustesse et sa sécurité.

React, développé par Facebook, est une bibliothèque JavaScript utilisée pour construire des interfaces utilisateur réactives et dynamiques. Il repose sur le concept de composants réutilisables, permettant une gestion efficace des états et des mises à jour de l'interface.

Pourquoi utiliser React et Drupal ensemble ?

  • Composants réutilisables de React : comme Drupal, React propose des composants réutilisables similaires à des pièces de Lego. Vous pouvez créer différentes petites parties de votre site web comme des boutons, des boîtes, des menus déroulants, etc., puis les assembler pour former des composants dynamiques. React bénéficie d'un vaste écosystème de bibliothèques et d'outils qui peuvent accélérer le développement, tels que Redux pour la gestion de l'état et des outils comme Create React App pour configurer rapidement un environnement de développement.
  • Expérience utilisateur : React permet de créer des interfaces utilisateur (UI) très interactives et dynamiques, offrant une expérience utilisateur plus fluide et réactive.
  • Performance : React utilise un DOM virtuel pour minimiser les mises à jour de l'interface utilisateur, ce qui améliore les performances et la réactivité des applications web.
  • Utilisation des services Web : Drupal dispose de modules API RESTful et GraphQL robustes, permettant à React de consommer facilement les données exposées par Drupal. Cela permet de créer des applications frontales découplées (headless) tout en utilisant Drupal comme back-end. Les développeurs peuvent facilement manipuler et afficher les données provenant de Drupal de manière flexible, en adaptant l'interface utilisateur selon les besoins.
  • Indépendance du Frontend : En utilisant Drupal comme backend et React comme frontend, vous pouvez découpler complètement les deux couches. Cela permet de développer et de déployer indépendamment le frontend et le backend, ce qui améliore l’agilité du développement. Une architecture découplée permet de réutiliser le même backend pour alimenter différents frontends (web, mobile, PWA, etc.), augmentant ainsi la portée de l'application.

Comment intégrer React à son projet Drupal ?

React peut être intégré de deux manières différentes au sein de Drupal. Tout va bien sûr dépendre de votre typologie de projet.

drupal-achitecture

 

Architecture découplée (Drupal Headless)

Dans cette architecture, Drupal est uniquement utilisé pour le backend et React pour l'application frontend. Ainsi, React sera la seule chose visible pour les utilisateurs de votre site web.

Les deux systèmes sont indépendants et séparés, mais ils communiquent via des protocoles HTTP comme REST ou GraphQL.

Envisagez cette option si vous souhaitez créer :

  • une Progressive Web App (PWA) pour les utilisateurs de dispositifs mobiles 
  • une application onepage qui stocke toutes les données dans Drupal 
  • un point d'accès à votre système basé sur Drupal 
  • un site d'actualité ou d'e-commerce où l'information sera consommée par plusieurs supports

Dans ce cas de figure, vous devez créer une application React indépendante qui se connecte au backend Drupal via des services Web. Drupal possède nativement une API REST qui permet d'exposer l'ensemble des données. La documentation de cette API est disponible sur la page API REST de Drupal. Le module REST UI de Drupal vous permet de créer des nouveaux endpoints en fonction de vos besoins.

Vous pouvez également utiliser GraphQL et nous vous recommandons notre article sur le sujet : Introduction à GraphQL avec le CMS Drupal
 

Architecture partiellement découplée 

Cette méthode intégrera votre application React dans un bloc Drupal. Vous avez aussi la possibilité de placer le composant React dans le thème. Cette approche vous offrira la possibilité d'inclure des packages tiers de npm, d'adapter votre application à divers fichiers et composants, d'activer l'édition en direct en mode développement, et d'optimiser les performances et la compatibilité.

Nous allons nous attarder sur ce cas précis dans la suite de cet article.

 

Tutoriel pour intégrer React sur un site Drupal 10 via un module custom

Nous sommes donc dans le cas où nous souhaitons intégrer React via un module custom dans le cadre d'une architecture partiellement découplée. Ce tutoriel vous guidera à travers les étapes nécessaires pour intégrer React sur un site Drupal 10. 

Prérequis : 

  • Un site Drupal 10 en cours d'exécution
  • Des connaissances de base en Drupal et en développement JavaScript/React.
  • Accès à la ligne de commande (CLI) pour installer des modules et des packages

Étape 1 : Créer la structure du module custom

Créer le répertoire du module

Allez dans le répertoire des modules personnalisés de Drupal (par défaut web/modules/custom) et créez un nouveau répertoire pour votre module, par exemple react_integration.

cd web/modules/custom
mkdir react_integration
cd react_integration

Créer le fichier react_integration.info.yml

Ce fichier décrit votre module à Drupal.

name: 'React Integration'
type: module
description: 'A custom module to integrate React with Drupal 10.'
package: Custom
core_version_requirement: ^10
dependencies:
 - node:node

Créer le fichier react_integration.module

C'est le fichier principal de votre module. Vous pouvez le laisser vide pour l'instant.

<?php
/**
* Implements hook_help().
*/
function react_integration_help($route_name, $route_match) {
 switch ($route_name) {
   case 'help.page.react_integration':
     return '<p>' . t('This module integrates React with Drupal 10.') . '</p>';
 }
}

Étape 2: Ajouter les dépendances de React

Initialiser un projet Node.js

Dans le répertoire de votre module, initialisez un projet Node.js.

npm init -y

Installer React et Webpack

Installez React, ReactDOM, Webpack et les autres dépendances nécessaires.

npm install react react-dom webpack webpack-cli babel-loader @babel/core @babel/preset-env @babel/preset-react --save-dev

Configurer Babel

Créez un fichier .babelrc à la racine de votre module pour configurer Babel.

{
 "presets": ["@babel/preset-env", "@babel/preset-react"]
}

Configurer Webpack

Créez un fichier webpack.config.js à la racine de votre module pour configurer Webpack.

const path = require('path');
module.exports = {
 entry: './src/index.js',
 output: {
   path: path.resolve(__dirname, 'dist'),
   filename: 'bundle.js',
 },
 module: {
   rules: [
     {
       test: /\.(js|jsx)$/,
       exclude: /node_modules/,
       use: {
         loader: 'babel-loader',
       },
     },
   ],
 },
 resolve: {
   extensions: ['.js', '.jsx'],
 },
};

Étape 3: Créer votre application React

Créer le répertoire src et le fichier index.js

Créez un répertoire src dans votre module et ajoutez un fichier index.js.

import React from 'react';
import ReactDOM from 'react-dom';
const App = () => {
 return <div>Hello, React in Drupal!</div>;
};
ReactDOM.render(<App />, document.getElementById('react-root'));

Compiler votre application React

Exécutez Webpack pour compiler votre application React.

npx webpack --mode production

Cela générera un fichier bundle.js dans le répertoire dist.

Étape 4: Intégrer React dans Drupal

Ajouter un hook_page_attachments dans react_integration.module

Ajoutez le JavaScript compilé par Webpack à votre page Drupal.

<?php
use Drupal\Core\Routing\RouteMatchInterface;
/**
* Implements hook_page_attachments().
*/
function react_integration_page_attachments(array &$attachments) {
 $attachments['#attached']['library'][] = 'react_integration/react';
}

Définir une bibliothèque dans react_integration.libraries.yml

Définissez une bibliothèque Drupal pour inclure votre fichier JavaScript.

react:
 version: 1.x
 js:
   dist/bundle.js: {}
 dependencies:
   - core/drupal
   - core/drupalSettings

Ajouter un élément de rendu dans une page avec le controller src/Controller/ReactIntegrationController.php

Vous pouvez utiliser un contrôleur pour ajouter un div avec un id spécifique où React peut rendre son contenu.

<?php
namespace Drupal\react_integration\Controller;
use Drupal\Core\Controller\ControllerBase;
class ReactIntegrationController extends ControllerBase {
 public function content() {
   return [
     '#markup' => '<div id="react-root"></div>',
   ];
 }
} 

Définir une route pour votre contrôleur dans react_integration.routing.yml

Créez une route pour afficher votre page React.

react_integration.content:
 path: '/react-integration'
 defaults:
   _controller: '\Drupal\react_integration\Controller\ReactIntegrationController::content'
   _title: 'React Integration'
 requirements:
   _permission: 'access content'

Étape 5: Tester votre intégration

Activez votre module dans l'interface d'administration de Drupal ou via Drush.

drush en react_integration

Allez à l'URL /react-integration sur votre site Drupal pour voir votre application React en action : 

drupal-react-exemple

Félicitations ! Vous avez maintenant intégré React dans Drupal 10 via un module custom. Vous pouvez étendre cette configuration pour intégrer plus de fonctionnalités et construire des applications plus complexes.

Un projet ? Parlons-en

Nous sommes à votre écoute pour étudier vos besoins
et vous proposer les meilleures solutions.

Autres articles

Ce mercredi 7 juin 2023, l'équipe de sécurité de Drupal a annoncé officiellement un nouveau délais supplémentaire en prolongeant le support de Drupal 7 jusqu'au  5 janvier 2025, tout en précisant qu'il s'agit de la dernière prolongation, et que le niveau de support fourni serait ajusté

 

GraphQL est conçu pour une interaction client-serveur plus puissante et conviviale. C'est une langue de requête et un moteur d'exécution complexes, se développant rapidement et disponible comme service web dans Drupal 8, 9 et 10. Il se distingue par sa robustesse, offrant un niveau d'introspection et de personnalisation facilement accessible​​.