Next.js : Différence en useRouter dans next/router et dans next/navigation.

La différence entre useRouter provenant de next/router et useRouter provenant de next/navigation dépend principalement de la version de Next.js et du système de routage utilisé (pages traditionnelles ou App Router introduit à partir de Next.js 13).

1. useRouter depuis next/router

  • Utilisation : Conçu pour le système de routage classique basé sur les dossiers dans /pages.
  • Caractéristiques principales :
    • Fonctionne uniquement dans les composants React client-side.
    • Propose des méthodes comme push, replace, reload, et des informations sur la route actuelle (ex. pathname, query).
  • Exemple :
  • import { useRouter } from 'next/router'; const MyComponent = () => { const router = useRouter(); const goToPage = () => { router.push('/another-page'); }; return <button onClick={goToPage}>Go to Another Page</button>; }; export default MyComponent;
  • Pour qui ?
    • Utilisateurs de Next.js <13.
    • Projets qui utilisent encore l’ancienne structure des routes dans /pages.

2. useRouter depuis next/navigation

  • Utilisation : Conçu pour l’App Router, introduit dans Next.js 13 (et versions ultérieures) avec le dossier /app.
  • Caractéristiques principales :
    • Fonctionne avec les composants React server-side et client-side.
    • Propose des fonctionnalités simplifiées :
      • Navigation avec push, replace, et back.
      • Méthodes adaptées au modèle moderne de rendu et de streaming des données.
    • Ne fournit pas directement d’accès aux informations sur la route actuelle (query, pathname, etc.) que vous deviez souvent récupérer autrement dans l’App Router.
  • Exemple : import { useRouter } from 'next/navigation'; const MyComponent = () => { const router = useRouter(); const goToPage = () => { router.push('/another-page'); }; return <button onClick={goToPage}>Go to Another Page</button>; }; export default MyComponent;
  • Pour qui ?
    • Utilisateurs de l’App Router avec le dossier /app dans Next.js 13 et plus.
    • Projets qui souhaitent bénéficier des nouvelles fonctionnalités de Next.js, comme le rendering server-side progressif ou le rendu asynchrone.

Principales Différences

Fonctionnaliténext/routernext/navigation
Version de Next.js<13 (ou système /pages)>=13 (système /app)
Composants Server-sideNon supportéSupporté
Accès à pathname & queryOuiNon (utilisez des hooks comme usePathname)
Navigationpush, replace, reloadpush, replace, back
Mode d’utilisationHistoriqueModerne

Quand Utiliser le Bon useRouter ?

  • Projets pages/ (Legacy) : Continuez avec next/router.
  • Projets app/ (App Router) : Utilisez next/navigation. Pour accéder aux informations de la route, combinez-le avec des hooks comme usePathname ou useSearchParams.

Si vous démarrez un nouveau projet Next.js avec la structure moderne, il est recommandé d’utiliser next/navigation.

Publié dans Cloud computing | Laisser un commentaire

Next.JS : Développez une API avec Next.js, Express et PostgreSQL

Voici un petit projet hybride combinant Next.js 15, Express, et Sequelize, PostgreSQL avec :

  1. Une API Express fonctionnant indépendamment sous /api/express.
  2. Une API Next.js fonctionnant sous /api/nextjs.
  3. Une base de données gérée par Sequelize.

Structure du projet

/my-nextjs-app
├── /app
│   ├── /api
│   │   ├── /nextjs
│   │   │   └── route.js       # API route gérée par Next.js
│   ├── /page.js              # Page d'accueil
├── /backend                  # Application Express + Sequelize
│   ├── /config               # Configuration Sequelize
│   │   └── index.js
│   ├── /models               # Modèles Sequelize
│   │   └── User.js
│   ├── /routes               # Routes Express
│   │   └── userRoutes.js
│   ├── app.js                # Configuration Express
│   └── server.js             # Point d'entrée pour Express
├── /lib
│   └── db.js                 # Connexion à la base de données
├── /public                   # Fichiers statiques
├── .env                      # Variables d'environnement
├── next.config.js            # Configuration Next.js
├── package.json              # Dépendances
└── README.md                 # Documentation


Étape 1 : Configurer Sequelize

1.1. Configuration de la base de données

Créez un fichier backend/config/index.js pour gérer la connexion Sequelize.

// backend/config/index.js
const { Sequelize } = require('sequelize');
require('dotenv').config();

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
  host: process.env.DB_HOST,
  dialect: 'postgres', // Changez selon votre SGBD : mysql, sqlite, etc.
});

module.exports = sequelize;

1.2. Créer un modèle Sequelize

Créez un modèle User dans backend/models/User.js :

// backend/models/User.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/index');

const User = sequelize.define('User', {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
  },
});

module.exports = User;


Étape 2 : Configurer Express

2.1. Ajouter des routes Express

Créez une route userRoutes.js dans backend/routes :

// backend/routes/userRoutes.js
const express = require('express');
const User = require('../models/User');
const router = express.Router();

// Obtenir tous les utilisateurs
router.get('/users', async (req, res) => {
  try {
    const users = await User.findAll();
    res.json(users);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

module.exports = router;

2.2. Configurer l’application Express

Créez un fichier backend/app.js pour configurer Express :

// backend/app.js
const express = require('express');
const bodyParser = require('body-parser');
const userRoutes = require('./routes/userRoutes');

const app = express();
app.use(bodyParser.json());

// Routes
app.use('/api/express', userRoutes);

module.exports = app;

2.3. Point d’entrée Express

Ajoutez un fichier backend/server.js pour démarrer le serveur Express.

// backend/server.js
const app = require('./app');
const sequelize = require('./config/index');

const PORT = process.env.EXPRESS_PORT || 4000;

sequelize.sync().then(() => {
  console.log('Database connected');
  app.listen(PORT, () => {
    console.log(`Express API running on http://localhost:${PORT}`);
  });
});


Étape 3 : Configurer Next.js

3.1. API Next.js

Ajoutez une API route dans app/api/nextjs/route.js :

// app/api/nextjs/route.js
import db from '@/lib/db';
import User from '@/backend/models/User';

export async function GET() {
  try {
    const users = await User.findAll();
    return new Response(JSON.stringify(users), { status: 200 });
  } catch (err) {
    return new Response(JSON.stringify({ error: err.message }), { status: 500 });
  }
}

3.2. Page d’accueil

Ajoutez une page d’accueil dans app/page.js pour consommer les deux API :

// app/page.js
async function fetchData(apiPath) {
  const res = await fetch(apiPath);
  return res.json();
}

export default async function Home() {
  const expressUsers = await fetchData('http://localhost:4000/api/express/users');
  const nextjsUsers = await fetchData('http://localhost:3000/api/nextjs');

  return (
    <div>
      <h1>API Express</h1>
      <pre>{JSON.stringify(expressUsers, null, 2)}</pre>

      <h1>API Next.js</h1>
      <pre>{JSON.stringify(nextjsUsers, null, 2)}</pre>
    </div>
  );
}

3.3. Connexion Sequelize dans Next.js

Ajoutez lib/db.js pour rendre la connexion accessible côté Next.js :

// lib/db.js
const sequelize = require('@/backend/config/index');
export default sequelize;


Étape 4 : Configuration

4.1. .env

Ajoutez vos variables d’environnement :

DB_NAME=your_database_name
DB_USER=your_username
DB_PASSWORD=your_password
DB_HOST=localhost
EXPRESS_PORT=4000

4.2. next.config.js

Ajoutez la configuration pour permettre les imports externes :

// next.config.js
module.exports = {
  experimental: {
    appDir: true,
  },
  webpack: (config) => {
    config.resolve.alias['@/backend'] = require('path').resolve(__dirname, './backend');
    return config;
  },
};


Étape 5 : Lancer l’application

  1. Démarrer Express : node backend/server.js
  2. Démarrer Next.js : npm run dev

Test de l’application

  • Express API : Visitez http://localhost:4000/api/express/users.
  • Next.js API : Visitez http://localhost:3000/api/nextjs.
  • Frontend : Visitez http://localhost:3000 pour voir les deux API consommées.

Publié dans Cloud computing | Tagué , , | Laisser un commentaire

Next.js: Comprendre les Répertoires `app` et `pages`

Dans Next.js, les répertoires app et pages sont utilisés pour organiser les fichiers de votre projet, mais ils fonctionnent différemment et sont associés à différentes approches de gestion des routes. Voici les différences principales :


1. Répertoire pages (Legacy Routing System)

Le répertoire pages est la méthode historique (et toujours supportée) pour définir les routes dans un projet Next.js. Chaque fichier dans ce répertoire correspond automatiquement à une route de votre application.

Caractéristiques principales :

  • Convention de nommage :
    • pages/index.js → Route /
    • pages/about.js → Route /about
    • pages/blog/[slug].js → Route dynamique /blog/:slug
  • Routeur basé sur des fichiers : Les noms des fichiers et des dossiers dans pages définissent directement les URLs.
  • getStaticProps/getServerSideProps :
    • Utilisé pour récupérer des données au moment du rendu (statique ou côté serveur).
  • API Routes :
    • Vous pouvez créer des endpoints API en plaçant des fichiers dans pages/api, par exemple :
      • pages/api/hello.js → API route /api/hello
  • Rendu CSR/SSR/SSG facile :
    • Next.js gère différentes méthodes de rendu (CSR, SSR, ou SSG) dans ce répertoire.

2. Répertoire app (App Directory – Nouveau système avec le Layout Router)

Introduit dans Next.js 13, le répertoire app propose une nouvelle manière de structurer et de gérer les routes avec une approche basée sur des layouts et des React Server Components.

Caractéristiques principales :

  • Structure modulaire avec des layouts :
    • Le répertoire app est conçu pour gérer les layouts imbriqués et partagés. Par exemple :
      • app/layout.js définit le layout principal pour toute l’application.
      • app/dashboard/layout.js définit un layout spécifique pour les pages sous /dashboard.
  • File-based routing avancé :
    • Comme avec pages, les fichiers et dossiers définissent les routes, mais il y a plus de flexibilité :
      • app/page.js → Route /
      • app/about/page.js → Route /about
      • app/blog/[slug]/page.js → Route dynamique /blog/:slug
  • React Server Components par défaut :
    • Les composants dans app sont Server Components par défaut, ce qui améliore les performances en rendant la plupart des pages côté serveur.
  • Chargement asynchrone intégré :
    • Les pages et composants peuvent inclure un état de chargement avec un fichier loading.js.
  • Rendu côté client :
    • Bien que Server Components soient par défaut, vous pouvez rendre des composants côté client avec "use client".
  • API Routes :
    • Les API routes ne sont pas supportées dans app. Pour cela, vous devez continuer à utiliser le répertoire pages/api.

Résumé des différences

AspectRépertoire pagesRépertoire app
DisponibilitéMéthode classique (Next.js < 13)Méthode moderne (Next.js 13+)
Définition des routesBasée sur les fichiersBasée sur les fichiers avec layouts imbriqués
Server ComponentsNon pris en chargePris en charge par défaut
Layouts imbriquésPas de support natifSupport natif
API RoutesSupporté (pages/api)Non supporté
getStaticProps/SSRSupportéNon nécessaire (remplacé par fetch côté serveur)
Utilisation recommandéePour les projets existants ou simplesPour les projets modernes avec Next.js 13+

Quand utiliser quoi ?

  • Si vous démarrez un nouveau projet sur Next.js 13 ou plus, il est recommandé d’utiliser le répertoire app pour bénéficier des dernières fonctionnalités (Server Components, layouts imbriqués, etc.).
  • Si vous travaillez sur un projet existant ou si vous avez besoin d’API routes, le répertoire pages reste pertinent.

Publié dans Cloud computing | Tagué | Laisser un commentaire