Nuxt 4 : Nouveautés et Guide de Migration depuis Nuxt 3
Mark Toledo
29 janvier 2026

Nuxt 4 marque une évolution majeure du framework Vue.js préféré des développeurs. Avec des performances améliorées, une meilleure DX et une compatibilité totale avec Vue 3.5, cette version mérite le détour. Voici tout ce qu'il faut savoir.
Les nouveautés de Nuxt 4
1. Nouvelle structure de dossiers
Nuxt 4 introduit une organisation plus claire :
app/
├── components/
├── composables/
├── layouts/
├── middleware/
├── pages/
├── plugins/
└── app.vue
server/
├── api/
├── middleware/
└── plugins/
shared/
├── types/
└── utils/
nuxt.config.ts
Avantages :
- Séparation claire frontend/backend
- Dossier
shared/pour le code partagé - Plus intuitif pour les nouveaux développeurs
2. Performances améliorées
| Métrique | Nuxt 3 | Nuxt 4 | Amélioration |
|---|---|---|---|
| Build time | 12s | 8s | -33% |
| Cold start | 850ms | 450ms | -47% |
| Bundle size | 245KB | 198KB | -19% |
| Hydration | 180ms | 120ms | -33% |
3. Compatibilité Vue 3.5
Nuxt 4 tire parti des dernières fonctionnalités de Vue 3.5 :
// Nouvelle syntaxe defineProps avec defaults
const { count = 0, title = 'Default' } = defineProps<{
count?: number
title?: string
}>()
// useTemplateRef (remplace ref sur template)
const inputRef = useTemplateRef('input')
// Deferred Teleport
<Teleport to="#modal" defer>
<Modal />
</Teleport>
4. Nouveau système de layers
Les layers sont maintenant plus puissants :
// nuxt.config.ts
export default defineNuxtConfig({
extends: [
'@nuxt/ui-pro', // npm package
'../base-layer', // dossier local
'github:user/repo', // GitHub
],
// Les layers peuvent maintenant avoir leurs propres configs
$production: {
extends: ['./layers/production']
}
})
5. Server Components améliorés
<!-- components/HeavyChart.server.vue -->
<script setup lang="ts">
// Ce composant s'exécute uniquement côté serveur
const data = await $fetch('/api/analytics')
</script>
<template>
<div v-html="renderChart(data)" />
</template>
Avantages :
- Pas de JavaScript côté client
- Accès direct aux APIs
- Performances optimales
6. Nuxt Scripts
Gestion optimisée des scripts tiers :
<script setup lang="ts">
// Chargement optimisé de Google Analytics
useScript('https://www.googletagmanager.com/gtag/js?id=G-XXXXX', {
trigger: 'onNuxtReady', // ou 'visible', 'idle'
bundle: true, // bundle avec l'app
})
</script>
Guide de migration Nuxt 3 → Nuxt 4
Étape 1 : Mise à jour des dépendances
# Mettre à jour Nuxt
npx nuxi upgrade --force
# Ou manuellement
npm install nuxt@^4.0.0
npm install vue@^3.5.0
Étape 2 : Activer le mode compatibilité (optionnel)
// nuxt.config.ts
export default defineNuxtConfig({
future: {
compatibilityVersion: 4,
},
// Mode bridge pour migration progressive
compatibilityMode: true,
})
Étape 3 : Restructurer les dossiers
# Script de migration automatique
npx nuxi migrate structure
# Ou manuellement :
mkdir -p app server shared
mv components app/
mv composables app/
mv pages app/
mv layouts app/
mv middleware app/
mv plugins app/
mv server/api server/
Étape 4 : Mettre à jour les imports
// Ancien (Nuxt 3)
import { useAsyncData } from '#app'
// Nouveau (Nuxt 4)
import { useAsyncData } from '#imports'
// Ou auto-import (recommandé)
Étape 5 : Adapter les composables
// Ancien
const { data } = await useFetch('/api/users', {
key: 'users',
server: true,
})
// Nouveau - getCachedData pour le cache
const { data } = await useFetch('/api/users', {
key: 'users',
getCachedData: (key, nuxtApp) => {
return nuxtApp.payload.data[key] || nuxtApp.static.data[key]
}
})
Étape 6 : Vérifier les breaking changes
// ❌ Déprécié
useHead({ title: 'Page' })
// ✅ Nouveau
useSeoMeta({
title: 'Page',
ogTitle: 'Page',
})
// ❌ Déprécié
definePageMeta({
key: 'static'
})
// ✅ Nouveau
definePageMeta({
key: route => route.path
})
Nouvelles fonctionnalités en détail
Data Fetching amélioré
// Nouveau : getCachedData
const { data, refresh, clear } = await useFetch('/api/posts', {
// Stratégie de cache personnalisée
getCachedData(key, nuxtApp) {
const cached = nuxtApp.payload.data[key]
if (cached && Date.now() - cached.fetchedAt < 60000) {
return cached
}
return null
},
// Transform avec types
transform: (posts): Post[] => posts.map(formatPost),
})
// Nouveau : useRequestFetch pour les requêtes serveur avec cookies
const requestFetch = useRequestFetch()
const user = await requestFetch('/api/me') // Inclut les cookies
Routing amélioré
// pages/users/[id].vue
definePageMeta({
// Validation des params améliorée
validate: async (route) => {
return /^\d+$/.test(route.params.id as string)
},
// Nouveau : middleware inline async
middleware: [
async (to, from) => {
const user = await getCurrentUser()
if (!user) return navigateTo('/login')
}
]
})
Typed Router
// Auto-généré dans .nuxt/typed-router.d.ts
const router = useRouter()
// Autocompletion des routes
router.push({ name: 'users-id', params: { id: '123' } })
// ^^^^^^^^ TypeScript connaît les routes
// Typed useRoute
const route = useRoute('users-id')
route.params.id // string, typé automatiquement
Nouveau système de hooks
// plugins/analytics.ts
export default defineNuxtPlugin({
name: 'analytics',
enforce: 'pre',
setup(nuxtApp) {
// Nouveau hook
nuxtApp.hook('page:transition:finish', () => {
trackPageView()
})
// Hook avec payload
nuxtApp.hook('app:rendered', (ctx) => {
console.log('Rendered in', ctx.renderTime, 'ms')
})
}
})
Bonnes pratiques Nuxt 4
1. Utiliser les Server Components
<!-- Pour le contenu statique ou data-heavy -->
<template>
<div>
<Header />
<HeavyDataTable server /> <!-- Rendu serveur uniquement -->
<Footer />
</div>
</template>
2. Optimiser le data fetching
// Paralléliser les requêtes
const [users, posts, comments] = await Promise.all([
useFetch('/api/users'),
useFetch('/api/posts'),
useFetch('/api/comments'),
])
// Utiliser useLazyFetch pour le non-critique
const { data: analytics } = await useLazyFetch('/api/analytics')
3. Typed everything
// types/index.ts
export interface User {
id: number
name: string
email: string
}
// composables/useUsers.ts
export const useUsers = () => {
return useFetch<User[]>('/api/users')
}
FAQ Nuxt 4
Nuxt 4 est-il stable ?
Oui, depuis la sortie officielle. La migration depuis Nuxt 3 est facilitée par le mode compatibilité.
Dois-je migrer immédiatement ?
Non obligatoire. Nuxt 3 reste maintenu. Mais Nuxt 4 apporte des gains de performance significatifs.
Les modules Nuxt 3 sont-ils compatibles ?
La majorité oui. Vérifiez la compatibilité sur nuxt.com/modules avant migration.
Conclusion
Nuxt 4 représente une évolution mature et performante du framework. Les principales raisons de migrer :
- -33% de temps de build
- -47% de cold start
- Meilleure DX avec Vue 3.5
- Structure de projet plus claire
- Server Components puissants
Commencez par activer le mode compatibilité sur votre projet Nuxt 3, testez, puis migrez progressivement.
Articles connexes :
