paint-brush
Création d'applications en temps réel avec Next.js 13.4 Server Actions 1. Introduction](#...par@leandronnz
19,725 lectures
19,725 lectures

Création d'applications en temps réel avec Next.js 13.4 Server Actions 1. Introduction](#...

par Leandro Nuñez22m2023/08/10
Read on Terminal Reader

Trop long; Pour lire

L'article explore la création d'applications Web en temps réel à l'aide des actions de serveur de Next.js 13.4. Il explique les concepts d'application en temps réel, présente les actions de serveur de Next.js 13.4, couvre la configuration et la création d'actions de serveur, discute de la conception d'interfaces pour des expériences utilisateur transparentes, propose des stratégies de test, des techniques d'optimisation et des améliorations futures. L'article fournit des exemples de code, des instructions et des ressources pour créer des applications en temps réel efficaces.
featured image - Création d'applications en temps réel avec Next.js 13.4 Server Actions

 1. Introduction](#...
Leandro Nuñez HackerNoon profile picture
0-item


Bonjour!


Si vous êtes comme moi, vous vous êtes probablement émerveillé devant l'interactivité transparente des applications Web en temps réel d'aujourd'hui - ces chatbots qui répondent instantanément, les notifications en direct qui s'affichent sans rafraîchissement de la page et les outils collaboratifs qui se mettent à jour dans un clin d'oeil. La fonctionnalité en temps réel est devenue moins un luxe qu'une attente à l'ère numérique.


Maintenant, si vous avez suivi les développements dans le monde de Next.js, vous avez peut-être eu vent des fonctionnalités à la mode de la version 13.4, en particulier du changeur de jeu : les actions du serveur. Êtes-vous curieux de savoir comment cela peut redéfinir la façon dont nous créons des expériences en temps réel ?


Eh bien moi aussi !


Plongez avec moi dans cette étude de cas, où nous nous lancerons dans un voyage pour construire une application en temps réel, tirant parti de la puissance et de la finesse des actions du serveur Next.js. Que vous soyez un développeur chevronné ou que vous vous aventuriez simplement dans le domaine des applications en temps réel, une mine d'informations vous attend.


Allons lancer le bal, d'accord ?


Table des matières

  1. Contexte : comprendre les applications en temps réel
  2. Quoi de neuf dans Next.js 13.4 : un aperçu des actions du serveur
  3. Préparer le terrain : notre portée de projet en temps réel
  4. Mise en route : configuration initiale
  5. Construire le backend : tirer parti des actions du serveur
  6. Concevoir le frontend : une expérience utilisateur fluide
  7. Test des capacités en temps réel
  8. Améliorations et optimisations
  9. Conclusion et perspectives d'avenir
  10. Ressources et lectures complémentaires

1. Contexte : comprendre les applications en temps réel

Dans le paysage numérique en évolution rapide d'aujourd'hui, le terme « temps réel » apparaît souvent dans divers contextes, du jeu et de la finance à la communication et aux médias sociaux. Mais que signifie exactement « temps réel » dans le monde des applications Web ? L


ous démystifions cela.


Que sont les applications en temps réel ?

Les applications en temps réel sont des systèmes ou des programmes qui répondent immédiatement aux entrées de l'utilisateur ou aux événements externes, offrant une rétroaction instantanée sans retards perceptibles. En termes plus simples, considérez-les comme des plates-formes dynamiques en direct qui évoluent en "temps réel", reflétant le flux constant d'informations dans l'écosystème numérique moderne.

Exemples concrets

Pour le mettre en perspective, considérons quelques exemples omniprésents :


  • Applications de messagerie instantanée : Des plateformes comme WhatsApp et Telegram où les messages sont envoyés, reçus et vus sans délai.

  • Outils collaboratifs : pensez à Google Docs, où plusieurs utilisateurs peuvent modifier un document simultanément, en observant les modifications des autres en temps réel.

  • Live Stock Tickers : Plates-formes qui affichent les cours des actions qui se mettent à jour instantanément avec les fluctuations du marché.

  • Jeux multijoueurs en ligne : où les joueurs interagissent entre eux et avec l'environnement sans latence, garantissant une expérience de jeu fluide.


La pertinence des applications en temps réel

Alors, pourquoi la fonctionnalité en temps réel est-elle si recherchée ?


  • Attente de l'utilisateur : les utilisateurs modernes s'attendent à l'immédiateté. Qu'il s'agisse d'une application de chat ou d'une mise à jour météo, tout décalage notable peut entraîner une diminution de la satisfaction des utilisateurs.
  • Interactivité améliorée : les fonctionnalités en temps réel permettent une expérience utilisateur plus interactive et immersive, favorisant l'engagement de l'utilisateur.
  • Avantage concurrentiel : L'offre de fonctionnalités en temps réel peut différencier les plates-formes sur un marché encombré, offrant un argument de vente unique qui attire et retient les utilisateurs.


Les défis à venir

La création d'applications en temps réel n'est pas sans obstacles :


  • Problèmes d'évolutivité : les applications en temps réel doivent souvent gérer de nombreuses connexions simultanées, ce qui nécessite une infrastructure robuste.

  • Intégrité des données : S'assurer que les données en temps réel restent cohérentes sur les différentes interfaces utilisateur peut être un défi, en particulier avec plusieurs modifications ou interactions simultanées.

  • Latence : Une application en temps réel est seulement aussi bonne que son composant le plus lent. Garantir des retards minimaux nécessite une optimisation minutieuse et une utilisation efficace des ressources.


Maintenant que nous avons préparé le terrain avec une compréhension fondamentale des applications en temps réel, nous allons nous pencher sur la façon dont Next.js 13.4, avec ses actions de serveur, apparaît comme un outil essentiel pour les développeurs aspirant à créer de telles expériences immersives.



2. Quoi de neuf dans Next.js 13.4 : un aperçu des actions du serveur

Dans le paysage en constante évolution du développement Web, Next.js a toujours été à l'avant-garde, introduisant des fonctionnalités qui redéfinissent notre approche de la création d'applications. La version 13.4 ne fait pas exception, notamment en mettant l'accent sur les actions du serveur. Mais avant d'approfondir, clarifions quelques termes :

Une introduction aux actions

Les actions de l'écosystème React, bien qu'encore expérimentales, ont entraîné un changement de paradigme en permettant aux développeurs d'exécuter du code asynchrone en réponse aux interactions des utilisateurs.

Fait intéressant, bien qu'ils ne soient pas exclusifs à Next.js ou React Server Components, leur utilisation via Next.js signifie que vous êtes sur le canal expérimental React.


Pour ceux qui sont familiers avec les formulaires HTML, vous vous souviendrez peut-être de la transmission d'URL à la prop action . Désormais, avec Actions, vous pouvez passer directement une fonction, ce qui rend les interactions plus dynamiques et intégrées.


 <button action={() => { /* async function logic here */ }}>Click me!</button>


L'intégration de React avec Actions offre également des solutions intégrées pour des mises à jour optimistes. Cela souligne que même si les actions sont révolutionnaires, les modèles évoluent toujours et de nouvelles API pourraient être ajoutées pour les enrichir davantage.


Adopter les actions de formulaire

Les actions de formulaire représentent une fusion ingénieuse des actions de React avec l'API standard <form> . Ils résonnent avec l'attribut primitif formaction en HTML, permettant aux développeurs d'améliorer les états de chargement progressifs et d'autres fonctionnalités prêtes à l'emploi.


 <!-- Traditional HTML approach --> <form action="/submit-url"> <!-- form elements --> </form> <!-- With Next.js 13.4 Form Actions --> <form action={asyncFunctionForSubmission}> <!-- form elements --> </form>


Fonctions du serveur et actions du serveur

Les fonctions serveur sont essentiellement des fonctions qui fonctionnent côté serveur mais qui peuvent être appelées depuis le client. Celles-ci élèvent les capacités de rendu côté serveur de Next.js à un tout autre niveau.

Lors de la transition vers les actions de serveur , elles peuvent être comprises comme des fonctions de serveur, mais celles qui sont spécifiquement déclenchées en tant qu'action. Leur intégration avec des éléments de formulaire, en particulier via le prop action , garantit que le formulaire reste interactif même avant le chargement du JavaScript côté client. Cela se traduit par une expérience utilisateur plus fluide, l'hydratation React n'étant pas une condition préalable à la soumission du formulaire.


 // A simple Server Action in Next.js 13.4 <form action={serverActionFunction}> <!-- form elements --> </form>


Comprendre les mutations de serveur

Enfin, nous avons les mutations de serveur , qui sont un sous-ensemble des actions de serveur. Celles-ci sont particulièrement puissantes lorsque vous devez modifier des données sur le serveur, puis exécuter des réponses spécifiques, telles que redirect , revalidatePath ou revalidateTag .


 const serverMutationFunction = async () => { // Modify data logic here... // ... return { revalidatePath: '/updated-path' }; } <form action={serverMutationFunction}> <!-- form elements --> </form>


Remarques : En résumé, le framework Server Actions de Next.js 13.4, étayé par des actions, des actions de formulaire, des fonctions de serveur et des mutations de serveur, incarne une approche transformatrice des applications Web en temps réel.

Au fur et à mesure que nous avançons dans notre étude de cas, vous serez témoin de première main des prouesses que ces fonctionnalités apportent à la table.

Alors, préparons-nous pour le voyage passionnant qui nous attend !



3. Préparer le terrain : notre portée de projet en temps réel

Dans le cadre de la création d'une application en temps réel, les actions serveur de Next.js 13.4 jouent un rôle crucial. Ces fonctionnalités alpha facilitent la gestion des mutations de données côté serveur, réduisent le JavaScript côté client et améliorent progressivement les formulaires.


Activation des actions du serveur

Tout d'abord, vous devez activer les actions du serveur dans votre projet Next.js. Ajoutez simplement le code suivant à votre fichier next.config.js :


 module.exports = { experimental: { serverActions: true, }, }



Création et Invocation

Les actions serveur peuvent être définies soit dans le composant serveur qui l'utilise, soit dans un fichier séparé pour une réutilisation entre les composants client et serveur.

Voici comment vous pouvez créer et invoquer des actions de serveur :


  1. Dans les composants serveur : une action serveur peut être facilement définie dans un composant serveur, comme ceci :


     export default function ServerComponent() { async function myAction() { 'use server' // ... } }


  2. Avec les composants client : lors de l'utilisation d'une action serveur dans un composant client, créez l'action dans un fichier séparé, puis importez-la.


     // app/actions.js 'use server' export async function myAction() { // ... }



  3. Importation et utilisation dans le composant client :


     // app/client-component.js import { myAction } from './actions' export default function ClientComponent() { return ( <form action={myAction}> <button type="submit">Add to Cart</button> </form> ) }


  4. Invocation personnalisée : vous pouvez utiliser des méthodes personnalisées telles que startTransition pour invoquer des actions de serveur en dehors des formulaires, des boutons ou des entrées.


     // Example using startTransition 'use client' import { useTransition } from 'react' import { addItem } from '../actions' function ExampleClientComponent({ id }) { let [isPending, startTransition] = useTransition() return ( <button onClick={() => startTransition(() => addItem(id))}> Add To Cart </button> ) }



Amélioration progressive

Next.js 13.4 propose également une amélioration progressive, permettant à un <form> de fonctionner sans JavaScript. Les actions du serveur peuvent être transmises directement à un <form> , rendant le formulaire interactif même si JavaScript est désactivé.


 // app/components/example-client-component.js 'use client' import { handleSubmit } from './actions.js' export default function ExampleClientComponent({ myAction }) { return ( <form action={handleSubmit}> {/* ... */} </form> ) }



Limite de taille

Le corps de requête maximal envoyé à une action serveur est de 1 Mo par défaut. Si nécessaire, vous pouvez configurer cette limite à l'aide de l'option serverActionsBodySizeLimit :


 module.exports = { experimental: { serverActions: true, serverActionsBodySizeLimit: '2mb', }, }


4. Mise en route : configuration initiale

Créer un nouveau projet Next.js 13.4

Pour commencer à créer une application en temps réel à l'aide de Next.js 13.4, la première étape consiste à créer un nouveau projet. Vous pouvez utiliser la commande CLI standard Next.js pour initialiser votre projet :


 npx create-next-app@latest my-real-time-app


Remplacez my-real-time-app par le nom souhaité pour votre projet. Cette commande configure un nouveau projet Next.js avec les configurations par défaut.

Dépendances et packages requis pour la fonctionnalité en temps réel

Pour la fonctionnalité en temps réel, vous pouvez avoir besoin de certains packages et dépendances. Selon les spécificités de votre application, celles-ci peuvent aller des bibliothèques WebSockets aux abonnements GraphQL et plus encore.

Vérifiez que vous avez examiné les exigences du projet et ajouté les dépendances nécessaires.

Cependant, avec la prise en charge de Next.js 13.4 pour les actions du serveur, il existe déjà une configuration intégrée qui prend en charge le traitement côté serveur, ce qui peut aider à réaliser certaines des fonctionnalités en temps réel.


Un bref aperçu de la structure du projet et de la configuration du répertoire

Le routeur d'applications

Avec l'introduction de Next.js 13.4, le routeur d'applications est une fonctionnalité importante qui permet aux développeurs d'utiliser des mises en page partagées, un routage imbriqué, la gestion des erreurs, etc. Il est conçu pour fonctionner en conjonction avec le répertoire pages existant, mais il est hébergé dans un nouveau répertoire nommé app .


Pour démarrer avec le routeur d'applications :

  1. Créez un répertoire app à la racine de votre projet.

  2. Ajoutez vos routes ou composants dans ce répertoire.


Par défaut, les composants du répertoire app sont des composants serveur , offrant des performances optimales et permettant aux développeurs de les adopter facilement.

Voici un exemple de structure :


 my-real-time-app/ │ ├── app/ # Main directory for App Router components │ ├── _error.js # Custom error page │ ├── _layout.js # Shared layout for the app │ │ │ ├── dashboard/ # Nested route example │ │ ├── index.js # Dashboard main view │ │ └── settings.js # Dashboard settings view │ │ │ ├── index.js # Landing/Home page │ ├── profile.js # User profile page │ ├── login.js # Login page │ └── register.js # Registration page │ ├── public/ # Static assets go here (images, fonts, etc.) │ ├── images/ │ └── favicon.ico │ ├── styles/ # Global styles or variables │ └── global.css │ ├── package.json # Dependencies and scripts ├── next.config.js # Next.js configuration └── README.md # Project documentation


Composants serveur vs composants client

Réfléchir au rendu des composants est crucial. Dans les SPA traditionnels (applications à page unique), React restitue l'intégralité de l'application côté client. Avec les composants serveur, une grande partie de l'application s'affiche sur le serveur, ce qui améliore les performances. Voici une ligne directrice :


  • Composants serveur : Idéal pour les parties non interactives de votre application. Ces composants sont rendus sur le serveur et envoyés au client au format HTML. L'avantage ici est l'amélioration des performances, la réduction du JavaScript côté client et la possibilité de récupérer des données ou d'accéder directement aux ressources principales.

  • Composants client : utilisés pour les éléments d'interface utilisateur interactifs. Ils sont pré-rendus sur le serveur puis "hydratés" sur le client pour ajouter de l'interactivité.


Pour différencier ces composants, Next.js a introduit la directive "use client" . Cette directive indique qu'un composant doit être traité comme un composant client. Il doit être placé en haut d'un fichier de composant, avant toute importation.


Par exemple, si vous avez un compteur interactif, comme dans le code fourni, vous utiliserez la directive "use client" pour indiquer qu'il s'agit d'un composant côté client.


Recommandations

Lorsque vous structurez votre candidature, voici quelques lignes directrices :


  1. Utilisez les composants serveur par défaut (tels qu'ils se trouvent dans le répertoire app ).

  2. N'optez pour les composants client que lorsque vous avez des cas d'utilisation spécifiques tels que l'ajout d'interactivité, l'utilisation d'API de navigateur uniquement ou l'utilisation de hooks React qui dépendent de l'état ou des fonctionnalités du navigateur.


Remarques : en suivant cette structure et cette configuration, vous serez sur la bonne voie pour créer une application en temps réel performante avec les actions de serveur de Next.js 13.4.



5. Construire le backend : tirer parti des actions du serveur

La puissance de Next.js 13.4 brille lors de l'intégration de fonctionnalités backend en temps réel dans notre projet. Passons en revue les étapes avec des exemples de code pertinents pour notre my-real-time-app .

Introduction à la façon dont les actions du serveur seront utilisées dans ce projet

Pour notre my-real-time-app , les actions du serveur agissent comme notre principal pont entre le frontend et le backend , permettant des transactions de données efficaces sans avoir besoin d'API séparées.


 // my-real-time-app/app/actions/index.js export * from './auth-action'; export * from './chat-action';


Configuration des actions du serveur pour gérer l'authentification des utilisateurs

Dans my-real-time-app , nous tirons parti des actions du serveur pour rationaliser le processus d'authentification.


 // my-real-time-app/app/actions/auth-action.js export const login = async (credentials) => { // Logic for authenticating user with credentials // Return user details or error message }; export const logout = async (userId) => { // Logic for logging out the user // Return success or error message }; export const register = async (userInfo) => { // Logic for registering a new user // Store user in database and return success or error message };


Création d'actions de serveur pour l'envoi et la réception de messages en temps réel

Pour la fonctionnalité de chat :


 // my-real-time-app/app/actions/chat-action.js export const sendMessage = async (messageDetails) => { // Logic to send a new message // Store message in database and inform other users via WebSocket or similar }; export const receiveMessage = async () => { // Logic to receive a message in real-time // Return the message details }; export const getRecentMessages = async (userId) => { // Logic to fetch recent messages for the user // Retrieve messages from the database };


Intégration d'une base de données (par exemple, MongoDB) pour la persistance des messages

Utilisation de MongoDB comme magasin de données principal :


 // Initialize MongoDB connection const { MongoClient } = require('mongodb'); const client = new MongoClient(process.env.MONGODB_URI); await client.connect(); // Now, use this connection in server actions to interact with the database.


Dans nos actions de chat :


 // my-real-time-app/app/actions/chat-action.js export const sendMessage = async (messageDetails) => { const messagesCollection = client.db('chatDB').collection('messages'); await messagesCollection.insertOne(messageDetails); // Inform other users via WebSocket or similar };


Garantir une communication sécurisée et rapide grâce aux actions du serveur

Pour la sécurité:


 // Middleware for validating request data const validateRequest = (req) => { // Validation logic here return isValid; }; export const sendMessage = async (messageDetails) => { if (!validateRequest(messageDetails)) { throw new Error("Invalid request data"); } // Remaining logic... };


6. Concevoir le frontend : une expérience utilisateur transparente

Dans cette section, nous allons construire une interface de chat intuitive et réactive pour my-real-time-app . L'intégration des composants serveur de Next.js 13.4 permettra des mises à jour en temps réel pour une expérience utilisateur fluide.

Architecture de l'interface de chat principale

Tout d'abord, créons l'interface de chat principale :


 // my-real-time-app/app/chat-interface.js import { useEffect, useState } from 'react'; import { getRecentMessages } from './actions/chat-action'; export default function ChatInterface() { const [messages, setMessages] = useState([]); useEffect(() => { async function loadMessages() { const recentMessages = await getRecentMessages(); setMessages(recentMessages); } loadMessages(); }, []); return ( <div className="chatBox"> {messages.map(msg => ( <p key={msg.id}>{msg.content}</p> ))} </div> ); }


Ce composant récupère les messages récents au chargement et les affiche dans une boîte de discussion.


Connecter l'interface aux actions du serveur pour les mises à jour en temps réel

Maintenant, nous allons configurer les mises à jour en temps réel en utilisant un exemple basique de WebSockets :


 // my-real-time-app/app/chat-interface.js const [socket, setSocket] = useState(null); useEffect(() => { const ws = new WebSocket("ws://your-backend-url/ws"); ws.onmessage = (event) => { const newMessage = JSON.parse(event.data); setMessages(prevMessages => [...prevMessages, newMessage]); }; setSocket(ws); return () => { ws.close(); }; }, []);


Ce crochet établit une connexion WebSocket et met à jour la liste des messages lorsqu'un nouveau message est reçu.

Mise en œuvre des notifications pour les nouveaux messages

Pour une meilleure UX, informons les utilisateurs des nouveaux messages :


 // my-real-time-app/app/chat-interface.js useEffect(() => { if (messages.length && "Notification" in window && Notification.permission === "granted") { const lastMessage = messages[messages.length - 1]; new Notification(`New message from ${lastMessage.sender}: ${lastMessage.content}`); } }, [messages]);


Cet effet envoie une notification au navigateur chaque fois que la liste des messages est mise à jour avec un nouveau message.

Techniques pour garantir des interactions utilisateur fluides et sans décalage

Pour assurer une expérience fluide :


  1. Composants lourds à chargement différé :
 const HeavyComponent = React.lazy(() => import('./HeavyComponent')); function Chat() { return ( <React.Suspense fallback={<div>Loading...</div>}> <HeavyComponent /> </React.Suspense> ); }


  1. Utilisez React Server Components de Next.js pour diviser la logique :


Rappelez-vous de la documentation précédente, les composants serveur peuvent être utilisés pour les parties non interactives, tandis que les composants clients peuvent gérer les parties interactives, réduisant ainsi la quantité de JavaScript envoyé au client.

Par exemple, dans notre chat, l'historique des messages peut être un composant serveur, tandis que le champ de saisie et le bouton d'envoi, qui nécessitent une interactivité côté client, peuvent être des composants client.



7. Test des capacités en temps réel

Avec les composants de base de notre application en temps réel en place, il est essentiel de s'assurer qu'ils fonctionnent comme prévu et qu'ils sont performants, évolutifs et robustes. Cette section met en lumière diverses approches de test adaptées aux systèmes en temps réel comme notre my-real-time-app .

Outils et stratégies pour tester les fonctionnalités en temps réel

  1. Tests de bout en bout avec Cypress

Pour les applications en temps réel, les tests de bout en bout sont cruciaux. Configurons un exemple avec Cypress :


 // cypress/integration/chat.spec.js describe('Chat functionality', () => { it('should send and receive messages in real-time', () => { cy.visit('/chat'); cy.get('[data-cy=messageInput]').type('Hello, World!'); cy.get('[data-cy=sendButton]').click(); cy.contains('Hello, World!').should('exist'); }); });
  1. Test de charge avec l'artillerie

Cela aidera à comprendre comment le système se comporte avec un nombre important d'utilisateurs ou de messages :


 # artillery-config.yml config: target: 'http://my-real-time-app.com' phases: - duration: 300 arrivalRate: 20 scenarios: - flow: - emit: channel: 'chat' payload: message: 'Hello, World!'
 $ artillery run artillery-config.yml


Résoudre les goulots d'étranglement potentiels et les problèmes de performances

  1. Profilage des performances du serveur

Node.js fournit des outils intégrés pour le profilage, et l'indicateur --inspect peut être utilisé avec le serveur de développement Next.js pour activer l'inspecteur Node.js. En utilisant les DevTools de Chrome, on peut obtenir des informations sur les goulots d'étranglement des performances.


  1. Analyse des performances côté client

Pour le côté client, des outils tels que l'onglet Performance de Chrome DevTools peuvent aider à identifier les goulots d'étranglement du rendu. Surtout avec les mises à jour en temps réel, assurez-vous qu'aucun rendu inutile ne se produit.


Assurer l'évolutivité et la robustesse de l'application temps réel

  1. Gestion des états avec SWR ou React Query

Les applications en temps réel impliquent souvent de synchroniser l'état du client avec le serveur. Des bibliothèques comme SWR ou React Query aident à faciliter cela en offrant des fonctionnalités telles que la récupération automatique, la mise en cache et la synchronisation en temps réel.


Exemple avec SWR :

 // my-real-time-app/app/chat-interface.js import useSWR from 'swr'; function ChatInterface() { const { data: messages } = useSWR('/api/messages', fetcher); // ... rest of the component }


  1. Mise à l'échelle horizontale

Pour l'évolutivité du backend, en particulier avec WebSockets, envisagez d'utiliser une solution telle que Redis pour gérer l'état sur plusieurs instances de votre serveur. Ainsi, si une instance de serveur reçoit un message, elle peut le diffuser aux clients connectés à d'autres instances de serveur.


  1. Optimisation de la base de données

Assurez-vous que vos requêtes de base de données, en particulier celles qui s'exécutent fréquemment dans des applications en temps réel, sont optimisées. Indexez les colonnes essentielles et envisagez d'utiliser des solutions de mise en cache de base de données pour les données fréquemment consultées.


Remarques : Le test d'applications en temps réel nécessite une combinaison de techniques de test de logiciels standard et d'autres conçues spécifiquement pour les défis et les caractéristiques des systèmes en temps réel. En assurant un régime de test rigoureux pour my-real-time-app , nous pouvons garantir une expérience utilisateur fluide et réactive, quelle que soit l'ampleur du trafic utilisateur ou du flux de données.



10. Améliorations et optimisations

Avec l'architecture fondamentale de notre application en temps réel bien en place, notre attention se tourne maintenant vers le raffinement de ses fonctionnalités et de ses performances. Voici quelques stratégies pour améliorer l'expérience utilisateur et optimiser notre my-real-time-app :

Conseils pour améliorer l'expérience utilisateur

  1. Implémentation des confirmations de lecture

Fournissez un retour visuel aux utilisateurs lorsque leurs messages ont été lus par le destinataire. Cela améliore la nature interactive des discussions en temps réel.


 // my-real-time-app/app/components/Message.js function Message({ content, status }) { return ( <div> <p>{content}</p> {status === 'read' && <span>✓ Read</span>} </div> ); }


  1. Affichage de l'état en ligne

Afficher un indicateur à côté du nom ou de l'avatar d'un utilisateur lorsqu'il est en ligne.


 // my-real-time-app/app/components/UserStatus.js function UserStatus({ isOnline }) { return ( <div> {isOnline ? <span className="online-indicator"></span> : <span className="offline-indicator"></span>} </div> ); }

Optimisation des actions du serveur pour une latence réduite

  1. Traitement par lots côté serveur

Mises à jour côté serveur par lots lorsque cela est possible pour réduire le nombre de messages envoyés au client.


  1. Compresser les messages WebSocket

Pour les applications avec des mises à jour à haute fréquence, envisagez de compresser les messages WebSocket pour réduire les données transférées et augmenter la vitesse.


 // Example: Setting up compression with a WebSocket server const WebSocket = require('ws'); const wss = new WebSocket.Server({ perMessageDeflate: { zlibDeflateOptions: { // Add compression options here } } });


  1. Anti-rebond des mises à jour fréquentes

Si vous remarquez des mises à jour consécutives rapides de clients, envisagez de les supprimer pour les consolider en mises à jour moins nombreuses et plus significatives.

Garantir l'intégrité des données et la tolérance aux pannes

  1. Recherche d'événements

Pour les sections critiques de votre application où l'intégrité des données est primordiale, envisagez d'adopter un modèle d'approvisionnement en événements. Cela garantit que chaque modification de l'état de l'application est capturée en tant qu'événement, ce qui permet une récupération et une relecture fiables des événements.


  1. Mettre en œuvre la logique de nouvelle tentative

Assurez-vous qu'en cas d'échec d'envoi d'un message ou d'échec d'une mise à jour en raison de problèmes de réseau, un mécanisme de nouvelle tentative est en place.


 // Example: Simple retry logic with fetch let retries = 3; function fetchData(url) { fetch(url) .then(response => response.json()) .catch(error => { if (retries > 0) { retries--; fetchData(url); } else { console.error('Failed to fetch data after 3 retries'); } }); }


  1. Plans de sauvegarde et de récupération

Sauvegardez régulièrement les données et assurez-vous d'avoir un plan et des processus clairs pour récupérer les données en cas de panne. Utilisez la réplication de base de données ou des bases de données distribuées comme Cassandra pour la tolérance aux pannes.


Remarques : Le succès continu de my-real-time-app repose non seulement sur ses fonctionnalités de base, mais également sur les améliorations subtiles et les optimisations constantes qui garantissent une expérience utilisateur sans friction. En incorporant les stratégies énumérées ci-dessus, nous sommes sur le point d'offrir à nos utilisateurs une expérience de chat supérieure, fiable et agréable.



11. Conclusion et perspectives d'avenir

Récapitulatif du parcours de construction de l'application en temps réel

Notre parcours avec my-real-time-app nous a conduits depuis la configuration initiale avec Next.js 13.4, jusqu'à la création de backend avec des actions de serveur, la conception d'une expérience frontale transparente et la garantie que les capacités en temps réel ont été testées et optimisées. Nous avons approfondi les nuances des composants serveur et client, garantissant un équilibre efficace entre le rendu côté serveur et l'interactivité côté client.

L'impact et l'importance des actions serveur de Next.js 13.4 dans le projet

L'introduction des actions de serveur dans Next.js 13.4 a révolutionné notre approche des applications en temps réel. Cela nous a permis de créer une application de chat hautement interactive qui exploite les atouts du rendu serveur et client. Cela a non seulement optimisé les performances, mais également facilité les interactions transparentes des utilisateurs sans compromettre la sécurité ou l'efficacité.

Améliorations futures et fonctionnalités pouvant être ajoutées à l'application

Bien que my-real-time-app ait parcouru un long chemin, le potentiel d'améliorations futures reste vaste :

  1. Intégration du chat vidéo : introduisez des fonctionnalités de chat vidéo en temps réel.
  2. Discussions de groupe : autorisez les utilisateurs à créer, rejoindre ou quitter des discussions de groupe.
  3. Cryptage de bout en bout : Renforcez la sécurité en cryptant les messages afin que seuls l'expéditeur et le destinataire puissent les déchiffrer.
  4. Profils d'utilisateurs personnalisables : offrez aux utilisateurs la possibilité de personnaliser leur profil avec des avatars, des messages d'état et des thèmes.
  5. Chatbots : implémentez des chatbots basés sur l'IA pour des réponses automatisées.


12. Ressources et lectures complémentaires

Alors que vous vous lancez dans votre voyage avec des applications en temps réel et que vous approfondissez les fonctionnalités et les subtilités de Next.js, voici une liste organisée de ressources qui peuvent vous guider, vous inspirer et vous éduquer davantage :

Documents officiels

  • Documentation officielle Next.js : Un guide complet de tout ce qui est nouveau et amélioré dans cette version. Lire ici .
  • Actions de serveur dans Next.js : une plongée approfondie dans le fonctionnement, les meilleures pratiques et le potentiel des actions de serveur, directement depuis la source. En savoir plus .
  • L'App Router : Comprendre les capacités de l'App Router, en particulier concernant les composants du serveur React. Découvrez ici .
  • React Server Components : une introduction sur la meilleure façon d'utiliser les composants du serveur pour des performances et une flexibilité optimisées. Apprenez ici .


La fin

Tout d'abord, un immense merci d'avoir voyagé avec moi dans ce labyrinthe complexe du monde Next.js. Si vous êtes arrivé jusqu'ici, félicitations ! Si vous avez survolé certaines parties, je ne vous en veux pas – il y a eu des moments où j'ai voulu ne pas les écrire !


La création d'applications en temps réel est, à bien des égards, une montagne russe d'émotions. Certains jours, je me sens comme un génie du codage, tandis que d'autres, je remets en question tous les choix de vie qui m'ont amené à devenir développeur.


Avez-vous déjà eu ces moments où vous passez des heures à déboguer un problème, pour vous rendre compte que vous avez manqué un point-virgule ? Ou lorsque vous supprimez accidentellement une partie essentielle de votre code et que vous souhaitez que la vie ait un Ctrl + Z ? Ah les joies de la programmation !


Mais voici le problème : au milieu de toutes les paumes faciales et des tirages de cheveux occasionnels, il y a une magie indescriptible à voir votre création prendre vie, en temps réel. C'est cette petite étincelle de joie lorsque votre code s'exécute sans erreur, la satisfaction lorsque les utilisateurs aiment votre application et la fierté de savoir que vous avez créé quelque chose à partir de zéro.


À tous les développeurs en herbe qui lisent ceci : déboires, frustrations et 'pourquoi cela ne fonctionne-t-il pas ! ?' les moments font partie intégrante de notre voyage. Ce ne sont pas des signes que vous échouez, mais plutôt des tremplins pour devenir meilleur.


Alors la prochaine fois que votre code refuse de coopérer, respirez profondément, prenez un café (ou un thé, je ne juge pas, je suis moi-même un fan de matecocido ), et rappelez-vous que vous n'êtes pas seul dans ce cas.


Continuez à repousser les limites, continuez à apprendre et rappelez-vous que chaque ligne de code, qu'elle fonctionne ou non, ajoute un chapitre à votre histoire de développeur.


Et si jamais vous avez besoin d'un petit rire ou d'une épaule sur laquelle pleurer (virtuellement, bien sûr), sachez que je suis passé par là, que j'ai fait cela et que j'ai été suffisamment frustré pour envisager de jeter mon ordinateur portable par la fenêtre !


Voici plus d'aventures de codage et moins de bogues induits par des points-virgules !

Bravo et bon codage !