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 :
src
Une 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
.