Crée un projet Next.js 15 avec TypeScript, Tailwind CSS et App Router.
Renseigne ton email pour débloquer immédiatement cette formation gratuite.
Dans cette première leçon, tu vas installer et configurer un projet Next.js 15 moderne. On y intégrera TypeScript, ESLint, Tailwind CSS et l’App Router, puis on créera une landing page minimale et on gérera une clé d’API via un fichier .env.
Lance la commande officielle pour générer un nouveau projet.
On accepte tous les choix par défaut : TypeScript, ESLint, Tailwind CSS, App Router, Turbopack.
1npx create-next-app@latest movies-speaker
Sélectionne :
srcUne fois l’installation terminée :
1cd movies-speaker2code .
Tu devrais retrouver :
1app/2├─ globals.css3├─ layout.tsx4└─ page.tsx5next.config.js6package.json7...
app/ : nouvelle convention App Routerglobals.css : Tailwind CSS + resetlayout.tsx : balises <html> & <body> globalespage.tsx : page d’accueil par défautOn vérifie tout de suite que ça tourne :
1npm run dev
Ouvre ensuite http://localhost:3000 : tu dois voir la page Next.js par défaut.
Si tu as un port occupé, ajoute -p 3001 à la commande.
Ouvre app/page.tsx et remplace le <main> complet par un titre minimal.
1export default function Home() {2return (3<main className="flex justify-center items-center min-h-screen">4<h1 className="text-5xl font-bold">Movies</h1>5</main>6)7}
Tu peux enrichir app/globals.css ou ajouter du CSS supplémentaire. Par exemple :
1body {2@apply bg-gray-50 dark:bg-gray-900 text-gray-800 dark:text-gray-200;3font-family: sans-serif;4}
Relance ton navigateur : ton titre Movies doit s’afficher centré avec ton style.
Pour sécuriser ta clé TMDB, crée un fichier .env.local à la racine.
1touch .env.local
Ajoute-y :
1THE_MOVIE_DB_API_KEY=ton_token_secret_icI
Les variables .env.local ne sont pas commitées par défaut.
Tu peux aussi ajouter un .env.example sans valeurs.
Pour autoriser les images distantes (si tu veux charger les posters TMDB), édite next.config.js :
1/** @type {import('next').NextConfig} */2const nextConfig = {3images: {4remotePatterns: [5{6protocol: 'https',7hostname: 'image.tmdb.org',8port: '',9pathname: '/t/p/**',10},11],12},13};1415export default nextConfig;
Relance le serveur :
1npm run dev
Pour centraliser l’appel à TMDB, crée un dossier app/server et un fichier movies.ts :
1'use server'23const API_KEY = process.env.THE_MOVIE_DB_API_KEY;4const BASE_URL = 'https://api.themoviedb.org/3';56export async function fetchMovieDb(path: string) {7const res = await fetch(`${BASE_URL}${path}`, {8headers: {9accept: 'application/json',10Authorization: `Bearer ${API_KEY}`,11},12});13return res.json();14}1516export async function getMovies() {17const data = await fetchMovieDb('/movie/popular');18return data.results; // sous-typé pour l’instant19}
Puis dans app/page.tsx tu peux importer et afficher des titres :
1import { getMovies } from './server/movies';23export default async function Home() {4const movies = await getMovies();56return (7<main>8<h1 className="text-4xl">Movies</h1>9<ul>10{movies.slice(0, 5).map((m: any) => (11<li key={m.id}>{m.title}</li>12))}13</ul>14</main>15)16}
Cette logique s’exécute côté serveur grâce au await direct dans le composant.
npx create-next-app@latest pour démarrerapp/ avec layout.tsx et page.tsx.env.local pour stocker les clés secrètesnext.config.js : déclarer remotePatterns pour next/image'use server' pour la logique server-only<h1> et ajoute une sous-phrase en <p>.globals.css.