Introduction à Vue3

Vue3 est un framework progressif pour créer des interfaces utilisateur.

ProgressifCela signifie que vous pouvez n'introduire qu'une partie des capacités de Vue selon les besoins de votre projet : d'une simple amélioration de l'interaction de page, à la création d'applications monopages complètes (SPA), et même d'applications avec rendu côté serveur (SSR), Vue3 en est pleinement capable.

Vue3 est un framework JavaScript progressif pour le front-end, dirigé par Evan You, officiellement publié le 18 septembre 2020, sous le nom de codeOne Piece。

Comparé à Vue2, Vue3 a complètement réécrit l'architecture centrale : le système de réactivité est passé deObject.definePropertymis à niveau versProxy, introduisant la Composition API, et améliorant globalement les performances, la prise en charge de TypeScript, la taille du bundle, et plus encore.

Le positionnement officiel de Vue3 est :un framework facile à prendre en main, mais suffisamment puissant pour prendre en charge des projets complexes. Il n'impose pas d'architecture spécifique comme Angular, ni n'exige d'importantes optimisations manuelles comme React ; au contraire, il trouve un équilibre entre facilité d'utilisation et puissance.

Différences essentielles entre Vue3 et Vue2

Vue3 n'est pas une mise à niveau corrective de Vue2, mais une réécriture complète.

Élément de comparaisonVue2Vue3
Principe de réactivitéObject.defineProperty, ne peut pas observer les propriétés nouvellement ajoutées et les changements d’index de tableauProxy, effectue un proxy complet de toutes les opérations sur l’objet, sans les limitations ci-dessus
Organisation du codeAPI Options : data, methods et computed sont séparésAPI Composition : le code est regroupé par préoccupations logiques
Prise en charge de TypeScriptAdapté plus tard, inférence de type limitéeCode cœur réécrit en TypeScript, TS est un citoyen de première classe
Taille du bundleRuntime : environ 20KB (gzip)Prend en charge le Tree-shaking, le bundling à la demande, minimum seulement 13.5KB
PerformanceRéférenceLe rendu initial est plus rapide d’environ 55 %, le rendu de mise à jour est plus rapide d’environ 133 %, et l’utilisation de la mémoire est réduite d’environ 54 %
Nœud racine du template de composantDoit avoir exactement un élément racinePrend en charge plusieurs nœuds racines (Fragment)
API globaleMontée sur le constructeur Vue, plusieurs instances partagent l'étatViacreateAppcréant des instances indépendantes, avec un isolement plus poussé

Fonctionnalités principales

Les améliorations de Vue3 couvrent quatre dimensions : le système de réactivité, la conception de l'API, le compilateur et les nouveaux composants intégrés.

API de composition

L'API de composition est le changement de conception le plus important de Vue3 ; elle résout les problèmes fondamentaux de l'API Options de Vue2 :La logique associée est dispersée entre différentes options, ce qui rend sa réutilisation difficile。

Dans l'API Options, les données d'une fonctionnalité de « recherche utilisateur » peuvent être dispersées surdata、methods、computed、watchquatre options ; alors que l'API de composition vous permet d'écrire toute la logique d'une même fonctionnalité au même endroit, puis de l'extraire dans des fonctions réutilisables (Composables).

Exemple : API Options vs API de composition

<!-- Approche avec l'API Options (prise en charge par Vue2 / Vue3) -->
<script>
export default {
  data() {
    return {
count: 0, // données du compteur
username: 'example' // données du nom d'utilisateur
    }
  },
  computed: {
doubled() { // double du compteur
      return this.count * 2
    }
  },
  methods: {
increment() { // incrémente le compteur
      this.count++
    }
  }
}
</script>

Exemple : approche recommandée (sucre syntaxique script setup)

<!-- Composition API + script setup (approche recommandée de Vue3) -->
<script setup>
import { ref, computed } from 'vue'

// Les données réactives sont déclarées directement, pas besoin de retourner
const count = ref(0) // ref encapsule les types primitifs
const username = ref('example')

// propriété calculée
const doubled = computed(() => count.value * 2)

// Les méthodes sont directement des fonctions
function increment() {
count.value++ // Remarque : les valeurs encapsulées par ref doivent être accédées via .value
}
</script>

<template>
  <!-- Dans les templates, ref est automatiquement déballé, pas besoin de .value -->
  <p>Utilisateur : {{ username }}</p>
  <p>Compteur : {{ count }}, double : {{ doubled }}</p>
  <button @click="increment">+1</button>
</template>

<script setup>est du sucre syntaxique pour la Composition API, il vous permet de<script>d'écrire directement du code de la Composition API au niveau supérieur, sans avoir à le faire manuellementreturn, toutes les variables et fonctions de niveau supérieur sont automatiquement exposées au template. C'est actuellement la manière la plus largement utilisée d'écrire des composants monofichiers dans Vue3.

Système de réactivité : Proxy remplace defineProperty

La réactivité de Vue2 est basée surObject.defineProperty, cette approche a deux problèmes qui ne peuvent pas être résolus : elle ne peut pas observer les propriétés d'objet nouvellement ajoutées, et elle ne peut pas observer l'affectation directe à des éléments de tableau par index. Vue3Proxypour résoudre fondamentalement ces deux problèmes.

Exemple : ref et reactive

import { ref, reactive, watch } from 'vue'

// ref : convient aux types primitifs (number, string, boolean)
// L'accès et la modification des valeurs nécessitent .value
const count = ref(0)
count.value = 10

// reactive : convient aux objets et aux tableaux
// Accédez directement aux propriétés, pas besoin de .value
const user = reactive({
  name: 'EXAMPLE',
  age: 18,
  skills: ['vue', 'typescript']
})

// Dans Vue3, vous pouvez ajouter de nouvelles propriétés à un objet et la réactivité fonctionne toujours normalement
user.email = '[email protected]'  // Dans Vue2, cette opération ne déclenche pas de mise à jour de la vue

// Vous pouvez également modifier directement les éléments du tableau
user.skills[0] = 'vue3'  // Dans Vue2, cette opération ne déclenche pas de mise à jour de la vue

// Surveiller les changements de données réactives
watch(count, (newVal, oldVal) => {
  console.log(`compte de ${oldVal}à ${newVal}`)
})

Fonctions composables (Composables)

Les composables sont la méthode standard pour réutiliser la logique avec état dans Vue3, comme les Hooks personnalisés de React.

Il est d'usage deusepréfixer le nom, extraire une partie complète de logique réactive dans une fonction indépendante, et la réutiliser dans plusieurs composants.

Exemple : composable personnalisé

// Chemin du fichier : composables/useCounter.js
// Encapsuler la logique du compteur ; n'importe quel composant peut la réutiliser

import { ref, computed } from 'vue'

export function useCounter(initialValue = 0) {
  const count = ref(initialValue)           // État réactif interne
  const doubled = computed(() => count.value * 2)  // État dérivé

  function increment() { count.value++ }
  function decrement() { count.value-- }
  function reset() { count.value = initialValue }

  // Retourner l'état et les méthodes qui doivent être exposés à l'extérieur
  return { count, doubled, increment, decrement, reset }
}

Exemple : Utilisation d'un composable dans des composants

<script setup>
import { useCounter } from './composables/useCounter'

// Déstructurer et utiliser directement ; la réactivité est préservée
const { count, doubled, increment, decrement, reset } = useCounter(10)
</script>

<template>
  <p>Valeur actuelle : {{ count }}, doublée : {{ doubled }}</p>
  <button @click="increment">+1</button>
  <button @click="decrement">-1</button>
  <button @click="reset">Réinitialiser</button>
</template>

Nouveaux composants intégrés

Vue3 introduit trois nouveaux composants intégrés qui résolvent trois scénarios fréquents du développement frontend.

ComposantProblème résoluCas d'utilisation typiques
FragmentVue2 exigeait que les modèles de composants aient un seul nœud racine ; Fragment permet à plusieurs nœuds racine de coexister (aucun div d'enveloppement supplémentaire nécessaire)Composants d'élément de liste, réduisant l'imbrication DOM inutile
TeleportRend le HTML d'un composant à n'importe quelle position spécifiée dans le DOM, en s'affranchissant des limitations de contexte d'empilement CSS du composant parentBoîtes de dialogue modales globales, notifications Toast, barres d'outils flottantes
SuspenseAffiche élégamment un contenu de repli avant que les composants asynchrones aient terminé leur chargement, en gérant uniformément les états d'attente asynchronesÉcrans squelettes pour les composants chargés à la demande, indicateurs de chargement pendant les transitions de route

Exemple : utilisation de Teleport pour implémenter une modale globale

<script setup>
import { ref } from 'vue'
const showModal = ref(false)
</script>

<template>
  <button @click="showModal = true">Ouvrir la modale</button>

  <!--
Teleport monte le contenu de la modale sous body,
plutôt qu'à l'intérieur de l'élément parent du composant actuel, ce qui évite les problèmes de z-index et d'overflow
 -->
  <Teleport to="body">
    <div v-if="showModal" class="modal-mask">
      <div class="modal-box">
        <p>Ceci est une modale globale</p>
        <button @click="showModal = false">Fermer</button>
      </div>
    </div>
  </Teleport>
</template>

Exemple : Utilisation de Suspense pour gérer le chargement asynchrone de composants

<!-- Composant parent App.vue -->
<template>
  <Suspense>
    <!-- Slot par défaut : contenu asynchrone -->
    <template #default>
      <AsyncUserProfile />  <!-- Composants asynchrones qui utilisent await en interne -->
    </template>
    <!-- slot de secours : contenu affiché pendant le chargement -->
    <template #fallback>
      <div class="loading">Chargement...</div>
    </template>
  </Suspense>
</template>

Prise en charge du tree-shaking

Vue3 transforme toutes les API globales en exports nommés. Grâce à la capacité de tree-shaking de bundlers comme Vite / webpack, les API inutilisées ne sont pas intégrées dans la sortie finale.

Exemple : importer des API à la demande

// Vue2 : toutes les API sont accessibles via l'objet global Vue, qui ne peut pas faire l'objet d'un tree-shaking
// Vue.nextTick(...)
// Vue.set(obj, 'key', value)

// Vue3 : import à la demande ; seules les fonctions réellement utilisées sont incluses dans le bundle
import { ref, computed, watch, nextTick, onMounted } from 'vue'

// Seules ces API sont importées ; celles non utilisées (telles que watchEffect, provide, etc.) ne seront pas incluses dans le bundle

Hooks de cycle de vie

Tous les hooks de cycle de vie correspondant à l'API de composition de Vue3 sont préfixés paronet sont appelés danssetupsetup().

API Options de Vue2Vue3 API de compositionMoment de déclenchement
beforeCreate— (setup lui-même remplace ceci)Avant l'initialisation de l'instance
created— (setup lui-même remplace ceci)Instance créée
beforeMountonBeforeMountAvant le montage
mountedonMountedMonté, DOM accessible
beforeUpdateonBeforeUpdateAvant la mise à jour des données et le re-rendu du DOM
updatedonUpdatedUne fois le re-rendu du DOM terminé
beforeDestroyonBeforeUnmountAvant le démontage du composant (nom modifié)
destroyedonUnmountedDémontage du composant terminé (nom modifié)

Exemple : Utilisation des hooks de cycle de vie

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'

const timer = ref(null)
const count = ref(0)

// Exécuté après le montage du composant (le DOM peut être manipulé en toute sécurité)
onMounted(() => {
console.log('Component mounted')
// Démarrer un minuteur qui incrémente le compteur chaque seconde
  timer.value = setInterval(() => {
    count.value++
  }, 1000)
})

// Exécuté lorsque le composant est démonté (nettoyer les effets secondaires pour éviter les fuites de mémoire)
onUnmounted(() => {
  clearInterval(timer.value)
console.log('Timer cleared')
})
</script>

<template>
  <p>Durée d'exécution : {{ count }} secondes</p>
</template>

Prise en charge complète de TypeScript

La bibliothèque principale de Vue 3 est entièrement réécrite en TypeScript, offrant une inférence de type précise. Combinée avec<script setup lang="ts">, vous pouvez utiliser TypeScript directement dans les composants monofichiers sans configuration supplémentaire.

Exemple : Utilisation de TypeScript dans script setup

<script setup lang="ts">
import { ref, computed } from 'vue'

// Interface définissant la structure de données dans le composant
interface User {
  id: number
  name: string
  email?: string
}

// ref infère automatiquement le type à partir de la valeur initiale, ou il peut être spécifié explicitement
const user = ref<User>({
  id: 1,
  name: 'EXAMPLE',
})

// defineProps : déclarer et inférer les types de props
const props = defineProps<{
 title: string       //Requis
 count?: number      //Optionnel
}>()

// defineEmits : déclarer et vérifier le typage des événements personnalisés
const emit = defineEmits<{
 (e: 'update', value: number): void
 (e: 'close'): void
}>()

const displayName = computed(() => user.value.name.toUpperCase())

function handleUpdate() {
  emit('update', 42)
}
</script>

Domaines d’application

En tant qu'écosystème complet de framework frontend, Vue3 couvre un large éventail de scénarios, des applications monopages au rendu côté serveur, du Web au mobile.

Applications monopages (SPA)

C'est le cas d'usage le plus classique de Vue3. Combiné avecVue Router 4pour le routage frontend,Pinia(la bibliothèque de gestion d'état officiellement recommandée par Vue3, remplaçant Vuex) pour gérer l'état global, vous pouvez construire des applications monopages entièrement fonctionnelles.

Types de projets typiques : systèmes d'administration d'entreprise, tableaux de bord de données, vitrines e-commerce.

Rendu côté serveur (SSR) et génération de site statique (SSG)

Nuxt 3est un framework full-stack basé sur Vue3, intégrant profondément les capacités SSR et SSG. Il gère automatiquement la complexité du rendu côté serveur, permettant aux développeurs de créer des applications optimisées pour le SEO comme s'ils écrivaient des composants Vue classiques.

Scénarios adaptés : sites de contenu, blogs, sites de documentation, pages de destination marketing.

Mobile et multiplateforme

uni-appPermet d'utiliser la syntaxe Vue3 pour développer simultanément des Mini Programmes WeChat, des Mini Programmes Alipay, du H5 et des applications (iOS/Android).Ionic + Vue3convient pour créer des applications mobiles hybrides de haute qualité.

Applications de bureau

Electron + Vue3(via des chaînes d'outils comme electron-vite) peut empaqueter des applications Vue3 en applications de bureau multiplateformes.Tauri + Vue3est une alternative populaire ces dernières années, utilisant Rust comme backend, ce qui réduit la taille des applications et améliore les performances.

Écosystème de bibliothèques de composants UI

L'écosystème Vue3 offre un riche choix de bibliothèques de composants matures :

Bibliothèque de composantsPositionnementScénarios adaptés
Element PlusBibliothèque de composants pour PC de bureau, la version Vue3 d'Element UISystèmes d'administration d'entreprise, applications à forte intensité de données
Ant Design VueImplémentation Vue d'Ant Design, avec des spécifications de conception maturesSystèmes middle/back-office, applications d'entreprise
Vant 4Bibliothèque de composants mobiles, légère et performanteH5 mobile, mini-programmes WeChat
Vuetify 3Bibliothèque de composants de style Material DesignApplications web grand public
Naive UIÉcrit en TypeScript, avec de puissantes capacités de personnalisation du thèmeProjets nécessitant une personnalisation approfondie du thème
shadcn-vueBasé sur Radix UI et Tailwind, une collection de composants à copier-collerProjets qui valorisent l'unicité de l'interface utilisateur

Historique du développement

Vue.js est passé d'un projet personnel à l'un des trois principaux frameworks front-end au monde. Chaque version majeure a été motivée par des besoins d'ingénierie clairs.

Origines (2013 - 2014)

Vue.js a été créé par Evan You pendant son passage chez Google. En 2013, il a exploré l'expérience de développement avec Angular, en espérant en extraire sa partie préférée — le mécanisme de mise à jour de la vue piloté par les données — tout en supprimant les parties qu'il jugeait trop lourdes.

En février 2014, Vue.js 0.8.0 a été rendu public. Il a par la suite attiré l'attention de la communauté Laravel et est progressivement devenu bien connu dans la communauté JavaScript.

Ère Vue 1.x (2015)

En octobre 2015, Vue 1.0 a été officiellement publié, sous le nom de code Evangelion. La même année,Vue Router(2015.08)、Vuex(2015.11)、Vue CLI(décembre 2015) ont été publiés successivement, marquant l'évolution de Vue d'une bibliothèque de couche de vue vers un framework progressif complet.

Ère Vue 2.x (2016 - 2020)

En octobre 2016, Vue 2.0 est sorti, introduisant une approche par DOM virtuel (inspirée de React), prenant en charge le rendu côté serveur (SSR) et améliorant considérablement les performances.

L'ère Vue 2 a été la phase d'expansion la plus rapide de l'écosystème Vue : des bibliothèques de composants telles qu'Element UI ont émergé, Nuxt.js est apparu, et Vue est devenu l'un des frameworks front-end comptant le plus d'étoiles GitHub au monde.

En février 2019, Vue 2.6 est sorti, sous le nom de code Macross. C'était la dernière version majeure de Vue 2, faisant le lien entre le passé et l'avenir.

Sortie de Vue 3.0 (2020)

Le développement de Vue3 a commencé fin 2018 et a pris environ deux ans, passant par plus de 30 RFC (Request for Comments), plus de 2600 commits et 628 PR de 99 contributeurs.

Le 18 septembre 2020, Vue 3.0 a été officiellement publiée, sous le nom de code One Piece. Principaux changements :

  • Le système réactif est basé surProxyRéécrit
  • Introduction de la Composition API
  • Prise en charge complète de TypeScript
  • Ajout de Fragment, Teleport, Suspense
  • Prend en charge le Tree-shaking, taille du bundle considérablement réduite

Phase de maturation de l'écosystème (2021 - 2022)

TempsVersion / ÉvénementImportance du jalon
2021-08Vue 3.2<script setup>Le sucre syntaxique s'est officiellement stabilisé,<style> v-bindPrend en charge la liaison dynamique CSS, devenue l'une des versions de Vue 3 les plus populaires
2022-02Vue 3 est devenue la version par défautSur le site officiel de vue.js et npmvueLa version par défaut du package est passée de 2 à 3, marquant la domination officielle de l'écosystème Vue 3
2022-05Pinia est devenue la recommandation officielleLes plans de Vuex 5 ont été abandonnés, Pinia est devenue la bibliothèque de gestion d'état officiellement recommandée pour Vue 3
2022Vue 3.3Prise en charge améliorée des composants génériques, meilleuredefinePropsinférence de type, améliorant considérablement l'expérience TypeScript

Phase d'optimisation continue (2023 - Aujourd'hui)

TempsVersionCaractéristiques clés
2023-12Vue 3.4Réécriture du parseur de template (performances améliorées ~2x), optimisation du système réactif (réduction des déclenchements de calculs invalides),defineModelLa macro est officiellement stabilisée (simplifie la liaison bidirectionnelle v-model)
2024-09Vue 3.5Déstructuration des props réactives officiellement stabilisée (déstructurer tout en conservant la réactivité sans toRef),useTemplateRefNouvelles API, hydratation différée SSR
2025 (en développement)Vue 3.6Système réactif Alien Signals intégré (mémoire de suivi des dépendances réduite d'environ 14%), Vapor Mode est entré en Alpha (contourne complètement le DOM virtuel, taille du bundle réduite de 50KB à ~6KB, temps de montage de 100,000 composants ~100ms)

Vapor Modeest la direction technique future la plus importante pour Vue 3 : grâce à l'analyse statique à la compilation, les templates sont compilés directement en code précis de manipulation native du DOM, contournant complètement le processus de création et de diff du DOM virtuel. Il peut coexister avec le mode DOM virtuel existant et prend en charge la migration progressive. Ne prend actuellement en charge que<script setup>Composition API ; Options API n'est pas applicable.


Position de Vue 3 parmi les trois principaux frameworks

Vue 3, React et Angular sont les trois principaux frameworks du développement front-end. Comprendre leurs positions aide à faire des choix technologiques plus appropriés.

Critère de comparaisonVue3React 18+Angular 17+
PositionnementFramework progressif, fournit officiellement le routage et la gestion d'étatBibliothèque UI, écosystème piloté par la communautéFramework complet, tout dispose de solutions officielles
Style de syntaxeComposants monofichiers (.vue), syntaxe de template intuitiveJSX, écrire du HTML en JavaScriptComposants + templates + décorateurs, haut degré d'ingénierie
Courbe d'apprentissageRelativement accessible, syntaxe de template proche du HTMLModéré, nécessite de comprendre les modèles mentaux de JSX et des HooksAbrupt, nombreux concepts (modules, injection de dépendances, RxJS)
TypeScriptBibliothèque principale réécrite en TS, bon supportBon, nécessite @types/reactTypeScript par défaut, profondément intégré
PerformanceExcellente, réactivité à grain fin, mises à jour précisesBon, React 19 Compiler encore optimiséBon, le mécanisme Signals s'améliore continuellement
Échelle applicableAdapté aux projets de petite et moyenne envergure comme aux grands projetsToutes les échelles, cas matures dans des projets de très grande envergureProjets de grande entreprise, exigences élevées de standardisation des équipes
Part de marché en ChineLa plus élevée, largement utilisée par les entreprisesÉlevéeRelativement faible

Dans l'écosystème front-end national, Vue 3 a le taux d'utilisation le plus élevé. Les bibliothèques de composants disposant d'une documentation chinoise complète telles qu'Element Plus et Ant Design Vue ont grandement abaissé la barrière à l'adoption en entreprise. Si votre objectif est le marché de l'emploi national, Vue 3 est l'un des frameworks qu'il vaut le plus la peine de prioriser.


Limites de Vue3

Comprendre les limites de Vue 3 peut vous aider à porter des jugements techniques plus rationnels.

LimiteManifestation spécifiqueRecommandation
Coût de décision de la coexistence d'Options API et de Composition APIDeux styles d’API coexistent ; les équipes doivent s’accorder sur des normes unifiées, sinon les styles de code seront incohérentsLes nouveaux projets doivent utiliser uniformément<script setup> + Composition API
Charge mentale liée au .value pour les données réactivesrefNécessaire dans les scripts.value, automatiquement déballé dans les templates, les débutants sont facilement confusUtilisez le plugin Volar, l’IDE fournira des indications ; ce n’est plus un problème une fois l’habitude prise
Complexité de la gestion d’état pour les grandes applicationsLa prise en charge de la gestion d’état de Pinia pour les scénarios très volumineux et à forte concurrence est moins mature que celle de ReduxLes applications ultra-volumineuses peuvent évaluer des solutions Pinia + découpage modulaire
Coût d’hydratation du rendu côté serveurLes pages SSR nécessitent une « hydratation », l’initialisation prend plus de temps sur les appareils bas de gammeVue 3.5 a introduit Lazy Hydration, le Vapor Mode de Vue 3.6 améliorera encore cela
Richesse de l'écosystème internationalPar rapport à React, l'activité de la communauté anglophone de Vue et les ressources Stack Overflow sont légèrement moins nombreusesLa documentation officielle est d'une très grande qualité, la documentation chinoise est complète, privilégiez la consultation de la documentation officielle
Autres extensions