Cours Next.js · Module 1: Configuration de Next.js
Turbopack et optimisation de la compilation
Dans cette leçon14
Au cœur de Quantum Metropolis fonctionne un puissant générateur d'énergie appelé TurboCore, qui alimente toute la ville bien plus efficacement que les réacteurs obsolètes. De même, le monde de Next.js a vu apparaître un nouveau moteur de bundling - Turbopack - devenu le bundler par défaut dans Next.js 16, qui révolutionne la vitesse de compilation des applications web.
Qu'est-ce que Turbopack ?
Turbopack est un bundler moderne écrit en Rust, créé par les auteurs de Next.js et de Webpack. Il a été conçu en pensant aux performances et à l'évolutivité maximales, en particulier pour les grandes applications.
Contrairement aux outils plus anciens, Turbopack :
- Compile uniquement les éléments requis, et non l'application entière
- Utilise une mise en cache intelligente pour éviter les recalculs inutiles
- Fonctionne bien plus vite que Webpack, surtout en mode développement
Turbopack dans un projet Next.js 16 - activé par défaut
À Quantum Metropolis, les nouveaux bâtiments sont raccordés dès le départ au réseau énergétique TurboCore, et un seul interrupteur les ramène sur l'ancien réseau. De même, dans Next.js 16, Turbopack fonctionne tout de suite, sans aucun flag :
1# Development server - Turbopack by default
2npx next dev
3
4# Switch back to Webpack (only if your project needs it)
5npx next dev --webpackDans package.json, les scripts n'ont plus besoin du flag --turbo ni --turbopack qui activait Turbopack dans Next.js 15 :
1{
2 "scripts": {
3 "dev": "next dev",
4 "build": "next build",
5 "start": "next start"
6 }
7}Puis lance simplement :
1npm run dev
2# or
3yarn devAvantages de Turbopack
1. Des temps de compilation ultra-rapides
Tout comme TurboCore à Quantum Metropolis fournit de l'énergie presque instantanément, Turbopack réduit drastiquement le temps de compilation :
- Builds de production 2 à 5x plus rapides (
next build) - selon l'équipe Next.js lors de la sortie de Next.js 16 - Fast Refresh (HMR) jusqu'à 10x plus rapide lors des changements de composants
- Cache sur disque - depuis Next.js 16.1 pour
next devet depuis 16.3 aussi pournext build, ce qui rend les redémarrages encore plus rapides
2. Compilation sélective et mise en cache intelligente
Turbopack analyse la structure des dépendances de l'application et ne compile que les parties réellement nécessaires. C'est comme un système énergétique intelligent de la Metropolis qui dirige l'énergie uniquement là où elle est actuellement requise.
1// Turbopack will compile only this component and its dependencies,
2// if it is currently used in the application
3export default function QuantumNavigation() {
4 return (
5 <div className="p-4 bg-gradient-to-r from-indigo-500 to-purple-600 rounded-lg">
6 <h2 className="text-xl font-semibold text-white">Quantum Navigation System</h2>
7 <p className="text-white/80">
8 Choose a destination in the solar system
9 </p>
10 {/* ... */}
11 </div>
12 );
13}3. Compilation incrémentale
Lorsque le code change, Turbopack ne recompile que les fichiers qui ont été modifiés et ceux qui en dépendent directement. Tout comme à Quantum Metropolis, où moderniser un système ne nécessite pas de redémarrer toute la ville.
Compatibilité avec Next.js 16
Dans Next.js 16, Turbopack est stable et utilisé par défaut aussi bien pour next dev que pour next build. Dans Next.js 15, seul le mode développement était stable, et les builds de production ne sont passés en bêta qu'avec Next.js 15.5. Voici les fonctionnalités prises en charge :
- Répertoire
app(App Router) - Compatibilité avec les outils de développement (HMR, Fast Refresh)
- Prise en charge des alias d'import et de
jsconfig.json/tsconfig.json - Prise en charge des variables d'environnement (
.env) - Prise en charge des CSS Modules et du Global CSS
- Prise en charge de Tailwind CSS
- Proxy (
proxy.ts, appelémiddleware.tsdans les versions précédentes) - Prise en charge des API Routes
- Prise en charge de Sass, de PostCSS et des React Server Components
En revanche, Turbopack ne prend pas en charge les plugins Webpack ni une fonction webpack() dans next.config : les projets qui en ont besoin se lancent avec le flag --webpack.
Benchmarking et performances - données TurboCore de la Metropolis
Tout comme les ingénieurs de Quantum Metropolis effectuent des tests de performance sur le nouveau système TurboCore, nous pouvons mesurer les performances de Turbopack dans notre projet. Les chiffres ci-dessous sont des exemples : le gain réel dépend du projet, alors mesure-le toujours sur ta propre application.
| Opération | Webpack | Turbopack | Amélioration |
|---|---|---|---|
| Démarrage à froid | 40s | 2.2s | ~18x plus rapide |
| Rebuild (composant) | 180ms | 15ms | ~12x plus rapide |
| Rebuild (page) | 300ms | 25ms | ~12x plus rapide |
| Rebuild (CSS) | 160ms | 10ms | ~16x plus rapide |
Optimisation de Turbopack et résolution des problèmes
Diagnostic des performances de Turbopack
Turbopack dispose d'outils de diagnostic intégrés. Si la compilation ralentit, enregistre une trace de ce que fait le bundler :
1# Record a trace of Turbopack while the development server runs
2npm run dev -- --internal-trace
3
4# After stopping the server, open the saved file in the trace viewer
5npx next internal trace .next-profiles/trace-turbopack.binTu verras alors des informations exactes sur ce qui se passe pendant la compilation, semblables au diagnostic énergétique de Quantum Metropolis. La seconde commande lance un serveur de traces local, et tu consultes le graphique lui-même sur trace.nextjs.org.
Analyse de la taille du bundle
Pour surveiller la taille du bundle, Next.js 16 te propose deux outils. Avec Turbopack, le bundler par défaut, utilise l'analyseur intégré, disponible en mode expérimental depuis Next.js 16.1 :
1npx next experimental-analyzeIl ouvre une vue interactive de tes modules, où tu filtres par route et vérifies pourquoi un module donné s'est retrouvé dans le bundle. Le plugin classique @next/bundle-analyzer, lui, ne fonctionne qu'avec Webpack :
1npm install --save-dev @next/bundle-analyzerConfiguration dans next.config.js :
1const withBundleAnalyzer = require('@next/bundle-analyzer')({
2 enabled: process.env.ANALYZE === 'true',
3});
4
5/** @type {import('next').NextConfig} */
6const nextConfig = {
7 // Other configuration options...
8};
9
10module.exports = withBundleAnalyzer(nextConfig);Lancer l'analyse :
1ANALYZE=true npx next build --webpackLe flag --webpack est indispensable ici : sans lui, next build utilise Turbopack, détecte la configuration Webpack ajoutée par le plugin et échoue.
Problèmes courants de Turbopack et solutions
| Problème | Solution |
|---|---|
| Absence de prise en charge de certains loaders Webpack | Configure le loader dans l'option turbopack.rules de next.config, ou vérifie dans la documentation de Turbopack s'il existe une alternative |
| Plugins Webpack (Turbopack ne les prend pas en charge) | Cherche une alternative compatible avec Turbopack, ou lance next dev et next build avec le flag --webpack |
| Problèmes de HMR dans les grands projets | Divise le code en modules plus petits et utilise le lazy loading |
Stratégies d'optimisation de la compilation au-delà de Turbopack
Même si tu utilises Turbopack, il existe des stratégies supplémentaires d'optimisation de la compilation dans Next.js 16 :
1. Code splitting et lazy loading
Tout comme Quantum Metropolis distribue les ressources à la demande, tu peux utiliser le lazy loading des composants dans Next.js 16 :
1// components/GalaxyMapLazy.tsx
2"use client";
3
4import dynamic from 'next/dynamic';
5
6// Lazy loading the map component, which can be heavy
7const InteractiveGalaxyMap = dynamic(
8 () => import('@/components/InteractiveGalaxyMap'),
9 {
10 loading: () => <div className="h-96 bg-gray-200 animate-pulse rounded-lg" />,
11 ssr: false, // Disabling SSR works only in a Client Component
12 }
13);
14
15export default InteractiveGalaxyMap;La page reste un Server Component et importe le composant prêt, chargé à la demande (ssr: false écrit dans un Server Component provoque une erreur de compilation) :
1// app/exploration/page.tsx
2import { Suspense } from 'react';
3import InteractiveGalaxyMap from '@/components/GalaxyMapLazy';
4
5export default function ExplorationPage() {
6 return (
7 <div className="container mx-auto py-8">
8 <h1 className="text-3xl font-bold mb-6">Galaxy Exploration</h1>
9
10 <div className="prose max-w-none mb-8">
11 <p>Choose your destination in our interactive galaxy map...</p>
12 </div>
13
14 <Suspense fallback={<div className="h-96 bg-gray-200 animate-pulse rounded-lg" />}>
15 <InteractiveGalaxyMap />
16 </Suspense>
17 </div>
18 );
19}2. Optimisation des imports
À Quantum Metropolis, les transporteurs d'énergie sont optimisés pour acheminer l'énergie par le chemin le plus court possible. De même, tu peux optimiser les imports dans ton code :
1// Bad import - imports all of lodash
2import _ from 'lodash';
3
4// Also a bad import - the lodash package (CommonJS) still ends up in the bundle in full
5import { debounce, throttle } from 'lodash';
6
7// Good import - imports specific functions from submodules
8import debounce from 'lodash/debounce';
9import throttle from 'lodash/throttle';3. Micro-frontends et optimisation du build modulaire
Tout comme Quantum Metropolis est divisée en secteurs autonomes pouvant être améliorés indépendamment, tu peux envisager une approche modulaire :
1quantum-voyages/
2 ├── main/ # Main Next.js application
3 ├── modules/
4 │ ├── bookings/ # Booking module (independent application)
5 │ ├── destinations/ # Destinations module (independent application)
6 │ └── profiles/ # User profiles module (independent application)
7 └── shared/
8 └── ui-components/ # Shared UI components4. Optimisation des images et des ressources statiques
Tout comme Quantum Metropolis optimise la transmission des données visuelles, tu peux optimiser tes images :
1// Using optimized Image component from Next.js
2import Image from 'next/image';
3
4export default function DestinationGallery() {
5 return (
6 <div className="grid grid-cols-3 gap-4">
7 <div className="relative h-48">
8 <Image
9 src="/images/mars-colony.jpg"
10 alt="Mars Colony"
11 fill
12 sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
13 className="object-cover rounded-lg"
14 loading="lazy"
15 />
16 </div>
17 {/* ... more images ... */}
18 </div>
19 );
20}Surveillance des performances de compilation
Tout comme les ingénieurs de Quantum Metropolis surveillent en permanence les performances du système TurboCore, tu peux surveiller les performances de ta compilation. Dans Next.js 16, tu n'as rien à activer : next dev affiche dans le terminal le temps de compilation (Compile) et de rendu (Render) de chaque requête, et next build indique la durée de chaque étape du build :
1npm run build
2
3# Example output in Next.js 16:
4# ▲ Next.js 16 (Turbopack)
5# ✓ Compiled successfully in 615ms
6# ✓ Finished TypeScript in 1114ms
7# ✓ Collecting page data in 208ms
8# ✓ Generating static pages in 239ms
9# ✓ Finalizing page optimization in 5msPour une surveillance plus avancée, tu peux utiliser des plugins d'outils CI/CD qui suivent les temps de build à chaque itération.
Turbopack - l'avenir
Tout comme TurboCore à Quantum Metropolis fait l'objet d'améliorations constantes, Turbopack est activement développé en pensant à l'avenir :
- Prise en charge complète de toutes les fonctionnalités de Next.js
- Écosystème de plugins et de loaders étendu
- Meilleure compatibilité avec les outils et bibliothèques existants
- Des temps de compilation encore plus rapides et une consommation de mémoire réduite
Quand NE PAS utiliser Turbopack ?
Malgré tous ses avantages, TurboCore n'est parfois pas utilisé dans certains secteurs plus anciens de Quantum Metropolis en raison de problèmes de compatibilité. De même, il existe des situations où il vaut mieux rester avec Webpack :
- Lorsque tu utilises des plugins ou des loaders Webpack qui ne sont pas encore pris en charge par Turbopack
- Lorsque ton application a une configuration de build spécifique qui n'est pas prise en charge par Turbopack
- Lorsque
next.configcontient une fonctionwebpack()personnalisée : dans Next.js 16,next buildéchoue avec une telle configuration tant que tu ne la transposes pas en options Turbopack ou que tu n'ajoutes pas le flag--webpack
Outils et plugins de développement pour accélérer le travail
Tout comme les ingénieurs de Quantum Metropolis utilisent des outils avancés pour travailler avec TurboCore, nous pouvons aussi fluidifier notre workflow :
- Extension VSCode pour Next.js : suggestions, navigation et coloration syntaxique
- ESLint : retour instantané sur les problèmes potentiels
- TypeScript : détection des erreurs à la compilation
- Prettier : formatage automatique du code
Pratiques de conception favorisant une compilation efficace
La structure de Quantum Metropolis
Les architectes de Quantum Metropolis ont conçu la ville de manière modulaire - nous pouvons concevoir notre application de la même façon :
- Organise le code par fonctionnalité :
1app/
2 ├── (auth)/ # Logical grouping for auth features
3 │ ├── login/
4 │ └── register/
5 ├── (main)/ # Main functionality
6 │ ├── dashboard/
7 │ └── settings/
8 └── (bookings)/ # Booking functionality
9 ├── destinations/
10 └── checkout/- Conçois des composants en pensant aux performances :
1// components/ui/QuantumButton.tsx
2import { ButtonHTMLAttributes, forwardRef } from 'react';
3import { cva, type VariantProps } from 'class-variance-authority';
4
5// Defining button variants with Tailwind CSS
6const buttonVariants = cva(
7 "relative inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors",
8 {
9 variants: {
10 variant: {
11 default: "bg-blue-600 text-white hover:bg-blue-700",
12 destructive: "bg-red-600 text-white hover:bg-red-700",
13 outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
14 secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
15 ghost: "hover:bg-accent hover:text-accent-foreground",
16 link: "text-primary underline-offset-4 hover:underline",
17 },
18 size: {
19 default: "h-10 px-4 py-2",
20 sm: "h-9 rounded-md px-3",
21 lg: "h-11 rounded-md px-8",
22 icon: "h-10 w-10",
23 },
24 },
25 defaultVariants: {
26 variant: "default",
27 size: "default",
28 },
29 }
30);
31
32export interface ButtonProps
33 extends ButtonHTMLAttributes<HTMLButtonElement>,
34 VariantProps<typeof buttonVariants> {}
35
36const QuantumButton = forwardRef<HTMLButtonElement, ButtonProps>(
37 ({ className, variant, size, ...props }, ref) => {
38 return (
39 <button
40 className={buttonVariants({ variant, size, className })}
41 ref={ref}
42 {...props}
43 />
44 );
45 }
46);
47QuantumButton.displayName = "QuantumButton";
48
49export { QuantumButton, buttonVariants };Exemple pratique d'accélération de la compilation du projet Quantum Voyages
Imagine que nous avons un grand projet Quantum Voyages avec de nombreux composants et pages qui se compile lentement. Voici comment nous allons l'optimiser :
- Vérifier que Turbopack tourne - il est utilisé par défaut dans Next.js 16, il suffit donc de lancer le serveur sans le flag
--webpack:
1npm run dev- Optimiser les imports :
1// components/ui/Dashboard.tsx
2
3// Before optimization
4import _ from 'lodash';
5
6// After optimization - import only the function we need
7import debounce from 'lodash/debounce';- Charger les composants lourds en lazy loading :
1// components/maps/QuantumMap3DLazy.tsx - Client Component
2"use client";
3
4import dynamic from 'next/dynamic';
5
6// Heavy 3D map component loaded lazily
7const QuantumMap3D = dynamic(() => import('@/components/maps/QuantumMap3D'), {
8 loading: () => <p>Loading quantum map...</p>,
9 ssr: false,
10});
11
12export default QuantumMap3D;La page app/destinations/page.tsx reste un Server Component et importe seulement QuantumMap3DLazy.
- Modulariser l'application :
1// Split large files into smaller ones, focused on specific tasks
2// bookings/BookingForm.tsx -> split into:
3// - bookings/components/PassengerDetails.tsx
4// - bookings/components/DestinationPicker.tsx
5// - bookings/components/DateSelection.tsx
6// - bookings/components/PaymentForm.tsxRésumé
Tout comme TurboCore a révolutionné la distribution d'énergie à Quantum Metropolis, Turbopack change la façon dont nous compilons les applications Next.js 16. Grâce à lui :
- Tu accélères considérablement le cycle de développement
- Tu économises des ressources grâce à la compilation sélective
- Tu obtiens une application plus performante grâce à des techniques d'optimisation modernes
- Tu prépares ton application aux futures innovations de l'écosystème Next.js
Dans le prochain chapitre, nous examinerons la configuration de l'environnement de développement et les pratiques qui t'aideront à travailler le plus efficacement possible avec Next.js 16 - comme un ingénieur de Quantum Metropolis contrôlant les vastes systèmes de la ville depuis un seul terminal.
Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. Turbopack est le bundler par défaut de Next.js 16. Quelle option ajoutes-tu à la commande next dev pour utiliser Webpack à sa place ?
2. Quelle fonction de next/dynamic utilises-tu pour charger un composant lourd en lazy loading ?
3. Quel style d'import est le meilleur pour la taille du bundle ?
Tâches pratiques dans le jeu
- Clique dans l'ordre
Ordonne la commande qui lance le serveur de développement avec Webpack au lieu de Turbopack, le bundler par défaut