Sauter au contenu principal
Guide de tutoriel

Convertissez votre application Nuxt en applications mobiles iOS et Android avec Capacitor 8

Transform your existing Nuxt 4 web application into native iOS and Android mobile apps using Capacitor 8. A complete guide to configuring static generation, adding native plugins, and deploying to app stores.

Martin Donadieu

Écrivain

Valeria

Relecteur

Jordan

Éditeur

Convertissez votre application Nuxt en applications mobiles iOS et Android avec __CAPGO_KEEP_0__ 8

Transformez votre application web Nuxt 4 existante en applications mobiles natives iOS et Android en utilisant Capacitor 8. Un guide complet pour configurer la génération statique, ajouter des plugins natifs et déployer sur les magasins d'applications.

Introduction

Avez-vous une application web Nuxt existante ? Dans ce guide, vous apprendrez à la transformer en applications mobiles natives iOS et Android en utilisant Capacitor 8 — la dernière version avec une meilleure performance et de nouvelles fonctionnalités.

Capacitor wraps your web app in a native container, giving you access to device APIs like camera, filesystem, and push notifications while keeping your existing Vue codebase. Unlike Flutter or React Native, you don’t need to rewrite anything — your Nuxt code runs as-is.

wrappe votre application web dans un conteneur natif, vous donnant accès aux API de l'appareil comme la caméra, le système de fichiers et les notifications push tout en conservant votre codebase Vue existant. Contrairement à Flutter ou React Native, vous n'avez pas besoin de réécrire quoi que ce soit — votre Nuxt fonctionne comme tel.

  • What you’ll learn:
  • Add Capacitor 8 with essential native plugins
  • Ajoutez Capacitor 8 avec les plugins natifs essentiels
  • Construisez et testez sur les simulateurs iOS et Android
  • Activez la reprise en direct pour un développement plus rapide
  • Add native-feeling UI with Capgo Native Navigation and Transitions

Vous cherchez à démarrer un nouveau projet à partir de zéro ? Consultez notre guide sur Créer une application mobile Nuxt à partir de zéro.

Avantages de l'utilisation de Nuxt et Capacitor

  • Code Reutilisation: Partagez vos composants Vue et votre logique entre les applications web et mobile.
  • Performancescontext : Page/zone : Section ou page d'accueil. Rôle : En-tête de section ou de page. Vu dans : page premium-support.astro. Message clé `ps_help_performance_title` (Ps Help Performance Title).
  • : La génération statique de Nuxt crée des bundles optimisés parfaits pour les appareils mobiles.: Access device features like camera, geolocation, and filesystem through Capacitor plugins.
  • : Accédez aux fonctionnalités de l'appareil comme la caméra, la géolocalisation et le système de fichiers à l'aide de __CAPGO_KEEP_0__ plugins.Développement simplifié

: Utilisez les modèles Vue/Nuxt familiers sans apprendre le développement natif.

Avant de commencer, assurez-vous d'avoir :

  • Node.js 18+ installé
  • Un projet existant Nuxt 4 une application
  • Xcode (pour le développement iOS, macOS uniquement)
  • Android Studio (pour le développement Android)

Configuration de votre application Nuxt pour les appareils mobiles

La première étape consiste à configurer votre application Nuxt pour la génération statique. Capacitor nécessite des fichiers HTML/JS/CSS statiques pour les bundler dans l'application native.

Assurez-vous que votre package.json possède le script de génération :

{
  "scripts": {
    "dev": "nuxt dev",
    "build": "nuxt build",
    "generate": "nuxt generate",
    "preview": "nuxt preview",
    "mobile": "bun run generate && bunx cap sync",
    "mobile:ios": "bun run mobile && bunx cap open ios",
    "mobile:android": "bun run mobile && bunx cap open android"
  }
}

Important : Si vous utilisez des fonctionnalités côté serveur (API routes, middleware serveur, etc.), vous devrez refacturer celles-ci pour utiliser des alternatives côté client ou des API externes.

Testez la génération statique en exécutant :

bun run generate

Vous devriez voir un .output/public dossier contenant vos fichiers statiques. C'est ce que Capacitor emballera dans votre application native.

Capacitor 8 dans votre Projet

Pour emballer votre application Nuxt dans un conteneur mobile natif, suivez ces étapes :

  1. Installez Capacitor core et CLI :
bun add @capacitor/core
bun add -D @capacitor/cli
  1. Installez les plugins Capacitor courants que vous aurez probablement besoin :
bun add @capacitor/app @capacitor/keyboard @capacitor/splash-screen @capacitor/status-bar @capacitor/preferences

Ces plugins fournissent des fonctionnalités essentielles :

  • @capacitor/app: Gérer les événements de cycle de vie de l'application (avant-plan/arrière-plan, liens profonds)
  • @capacitor/keyboard: Gérer l'écran de démarrage natif
  • @capacitor/splash-screen: Stockage de valeurs clés-valeurs (comme localStorage mais natif)
  • Initialisez capacitor avec les détails de votre projet :Remplacez
  • @capacitor/preferencesFrench
  1. Initialize Capacitor with your project details:
bunx cap init my-app com.example.myapp --web-dir .output/public

/fr/blog/building-a-native-mobile-app-with-nuxt-and-capacitor/ my-app avec votre nom d'application et com.example.myapp avec votre ID d'application (notation de domaine inversée).

  1. Créez ou mettez à jour le capacitor.config.ts fichier avec la configuration appropriée :
import type { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.myapp',
  appName: 'my-app',
  webDir: '.output/public',
  plugins: {
    SplashScreen: {
      launchShowDuration: 2000,
      launchAutoHide: true,
      androidScaleType: 'CENTER_CROP',
      splashFullScreen: true,
      splashImmersive: true,
    },
    Keyboard: {
      resize: 'body',
      resizeOnFullScreen: true,
    },
    StatusBar: {
      style: 'dark',
    },
  },
};

export default config;
  1. Installez les plateformes natives :
bun add @capacitor/ios @capacitor/android
  1. Ajoutez les dossiers de plateformes natives :
bunx cap add ios
bunx cap add android

Capacitor créera et ios dossiers au niveau de la racine de votre projet contenant les projets natifs. android Pour construire le projet Android, vous avez besoin de

Android Studio . Pour iOS, vous avez besoin d'un Mac avecun Mac avec Xcode.

  1. Construire et synchroniser votre projet :
bun run mobile

Cela exécute votre script personnalisé qui génère la mise en page statique Nuxt et synchronise les fichiers avec les plateformes natives.

La construction et la mise en ligne d'applications natives

Pour construire et déployer votre application mobile native, suivez ces étapes :

Pour développer des applications iOS, vous devez avoir Xcode installé, et pour les applications Android, vous devez avoir Android Studio installé. De plus, si vous prévoyez de distribuer votre application sur l'app store, vous devez vous inscrire au programme Apple Developer pour iOS et au Google Play Console pour Android.

  1. Ouvrir les projets natifs :

Pour iOS :

bun run mobile:ios

For Android :

bun run mobile:android

Ou directement avec Capacitor CLI :

bunx cap open ios
bunx cap open android
  1. Construire et exécuter l'application :

android-studio-run

  • Dans Android Studio, attendez que le projet soit prêt, puis cliquez sur le bouton « Exécuter » pour déployer l'application sur un appareil connecté ou un émulateur.

xcode-run

  • Dans Xcode, configurez votre compte de signature pour déployer l'application sur un appareil réel. Si vous n'avez pas déjà effectué cela, Xcode vous guidera tout au long du processus (notez que vous devez être inscrit dans le programme Apple Developer). Une fois configuré, cliquez sur le bouton « Jouer » pour exécuter l'application sur votre appareil connecté.

Félicitations ! Vous avez réussi à déployer votre application web Nuxt sur un appareil mobile.

nuxtjs-mobile-app

Mais attendez, il existe également une méthode plus rapide pour effectuer cela pendant le développement…

Capacitor Live Reload

Pendant le développement, vous pouvez profiter de la rechargement en direct pour voir les changements instantanément sur votre appareil mobile. Pour activer cette fonctionnalité, suivez ces étapes :

  1. Trouvez votre adresse IP locale :
  • Sur macOS, exécutez la commande suivante dans le terminal :

    ipconfig getifaddr en0
  • Sur Windows, exécutez :

    ipconfig

    Recherchez l'adresse IPv4 dans la sortie.

  1. Mettez à jour votre capacitor.config.ts pour qu'elle pointe vers votre serveur de développement :
import type { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'my-app',
  webDir: '.output/public',
  server: {
    url: 'http://YOUR_IP_ADDRESS:3000',
    cleartext: true,
  },
  plugins: {
    // ... your plugin config
  },
};

export default config;

Remplacez YOUR_IP_ADDRESS par votre adresse IP locale (par exemple, 192.168.1.100).

  1. Appliquez les modifications à votre projet natif :
bunx cap copy

La copy commande copie le dossier web et les modifications de configuration vers le projet natif sans mettre à jour l'ensemble du projet.

  1. Démarrer votre serveur de développement Nuxt et rebuild dans Xcode/Android Studio :
bun run dev

Now, every time you make changes to your Nuxt app, the mobile app will automatically reload to reflect those changes.

Remarque : If you install new plugins or make changes to native files, you’ll need to rebuild the native project since live reloading only applies to web code changes.

Using Capacitor Plugins

Les plugins Capacitor vous permettent d'accéder aux fonctionnalités du dispositif natif depuis votre application Nuxt. Explorons comment utiliser le plugin Partager en tant qu'exemple :

  1. Installez le plugin Partager :
bun add @capacitor/share
  1. Créez ou mettez à jour une page pour utiliser le plugin Partager. Dans Nuxt 4, les pages se trouvent dans app/pages/:
<template>
  <div class="p-6">
    <h1 class="text-2xl font-bold mb-4">Welcome to Nuxt + Capacitor!</h1>
    <button
      @click="shareContent"
      class="px-6 py-3 bg-blue-600 text-white rounded-lg font-semibold"
    >
      Share now!
    </button>
  </div>
</template>

<script setup lang="ts">
import { Share } from '@capacitor/share';

async function shareContent() {
  await Share.share({
    title: 'Check this out!',
    text: 'Built with Nuxt and Capacitor',
    url: 'https://capacitorjs.com',
    dialogTitle: 'Share with friends',
  });
}
</script>
  1. Synchronisez les modifications avec le projet natif :
bun run mobile

Ou synchronisez sans reconstruire :

bunx cap sync
  1. Reconstruit et exécutez l'application sur votre appareil.

Now, when you click the “Cliquez maintenant sur le bouton !”, the native share dialog will appear.

Next, you can make the app feel more native on iOS and Android with Capgo navigation and transitions, and fix common iOS layout issues that cause horizontal overflow or cropped safe areas.

Native-feeling UI with Capgo Native Navigation and Transitions

J'ai travaillé pendant des années avec Ionic pour construire des applications cross-platform, mais l'intégration avec Nuxt est hacky et rarement valable lorsque vous avez déjà Tailwind CSS.

Pour un sentiment de mobile natif dans une application Nuxt + Capacitor, utilisez les plugins Capgo au lieu des kits UI web uniquement comme Konsta UI :

  • @capgo/capacitor-native-navigation — barre de navigation native, Liquid Glass barre de tab sur iOS, et un style de barre de tab flou sur Android. Votre routeur Nuxt conserve l'état de la route ; le plugin possède la barre de chrome native.
  • @capgo/capacitor-transitions — transitions de page à la manière d'Ionic et swipe-back sur l'édge sur iOS dans la couche WebView, sans adopter l’UI d'Ionic.

Installez les deux :

bun add @capgo/capacitor-native-navigation @capgo/capacitor-transitions
bunx cap sync

Configurez la navigation native avec le mode d'insertion CSS pour que le contenu web respecte les barres natives :

import { NativeNavigation } from '@capgo/capacitor-native-navigation';

await NativeNavigation.configure({
  contentInsetMode: 'css',
  animationDuration: 360,
  glass: {
    effect: 'liquidGlass',
  },
});

Affichez une barre de tab de verre liquide (iOS utilise la mise en page système ; Android utilise un fond de fenêtre WebView flou) :

await NativeNavigation.setTabbar({
  selectedId: 'home',
  labelVisibilityMode: 'labeled',
  icons: true,
  colors: { dynamic: true },
  tabs: [
    { id: 'home', title: 'Home', icon: { svg: '...' } },
    { id: 'settings', title: 'Settings', icon: { svg: '...' } },
  ],
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  router.push(`/${id}`);
});

Ajoutez des transitions de page natives dans votre coquille d'application :

<script setup>
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import '@capgo/capacitor-transitions';
import { initTransitions, setDirection, setupRouterOutlet } from '@capgo/capacitor-transitions/vue';

initTransitions({ platform: 'auto' });

const router = useRouter();
const outletRef = ref(null);

onMounted(() => {
  if (outletRef.value) {
    setupRouterOutlet(outletRef.value, { platform: 'auto', swipeGesture: 'auto' });
  }
});

const openSettings = () => {
  setDirection('forward');
  router.push('/settings');
};
</script>

<template>
  <cap-router-outlet ref="outletRef">
    <router-view />
  </cap-router-outlet>
</template>

Enveloppez les pages routées dans cap-router-outlet, cap-pageet cap-contentet appelez setDirection('forward') ou setDirection('back') context : Fragment de texte HTML d'une chaîne de Capgo UI plus longue (clé parente `alternatives_cta_questions`). Page/zone : Page de comparaison de mise à jour en direct de Capacitor. Rôle : Long paragraphe de marketing ou juridique. Voir dans : page alternatives.astro. Conservez les termes de produit et de marque de Capgo ainsi que les termes de développeur exactement. Clé de message `alternatives_cta_questions` (Questions de CTA Alternatives). | Fragment de texte HTML d'une chaîne de Capgo UI plus longue (clé parente `appflow_cta_questions`). Page/zone : Copie de marketing de comparaison/migration d'Appflow. Rôle : Long paragraphe de marketing ou juridique. Voir dans : page ionic-appflow.astro. Conservez les termes de produit et de marque de Capgo ainsi que les termes de développeur exactement. Clé de message `appflow_cta_questions` (Questions de CTA Appflow). | Fragment de texte HTML d'une chaîne de Capgo UI plus longue (clé parente `capwesome_cta_questions`). Page/zone : Page de comparaison de Capawesome. Rôle : Long paragraphe de marketing ou juridique. Voir dans : page capwesome.astro. Conservez les termes de produit et de marque de Capgo ainsi que les termes de développeur exactement. Clé de message `capwesome_cta_questions` (Questions de CTA Capwesome). | Page/zone : Copie de marketing de comparaison/migration d'Appflow. Rôle : Étiquette de navigation ou élément de navigation court. Voir dans : page ionic-appflow.astro, page ionic-enterprise-plugins.astro, page solutions/ionic-enterprise-plugins.astro. Clé de message `appflow_plugins_or` (Appflow Plugins Or).

avant de naviguer. N'ajoutez pas de titres ou de pieds de page web lorsqu'une navigation native possède ces surfaces. Using @capgo/capacitor-native-navigation Utiliser @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-native-navigation En utilisant @capgo/capacitor-transitions.

Aires de sécurité avec Tailwind

Pour les aires de sécurité des appareils dans Tailwind CSS, utilisez @capgo/tailwind-capacitor Paru sous le titre tailwind-capacitor sur npm. Il fournit safe-areas des utilitaires et d'autres plugins de Tailwind compatibles avec Capacitor:

bun add -D tailwind-capacitor

Dans app/assets/css/main.css:

@import 'tailwindcss';
@plugin "@capgo/tailwind-capacitor/platform";
@plugin "@capgo/tailwind-capacitor/safe-areas";

Pour Nuxt 4 avec Tailwind CSS 4, gardez cette importation dans le fichier CSS référencé à partir de nuxt.config.ts.

Utilisez des utilitaires comme pt-safe, pb-safeet px-safe au lieu de les répandre env(safe-area-inset-*) par votre propre main. Le projet est actuellement développé — si quelque chose manque pour votre configuration Nuxt, ouvrir une PR sur GitHub.

Résoudre les problèmes de mise en page iOS (Vueport, Zone de sécurité, et Débordement horizontal)

Si le contenu semble coupé, décalé ou scrollable horizontalement sur iOS, ajouter plus overflow-x: hidden ou ajuster seul le tag de vueport ne suffit généralement pas. Travaillez à travers ces vérifications dans l'ordre.

Assurez-vous que le tag de métadonnées de vueport est appliqué correctement

In nuxt.config.ts, définissez la vueport par app.head:

export default defineNuxtConfig({
  app: {
    head: {
      meta: [
        {
          name: 'viewport',
          content: 'width=device-width, initial-scale=1, viewport-fit=cover',
        },
      ],
    },
  },
});

Gérer la zone de sécurité iOS à partir d'un seul wrapper racine

Créez une coquille d'application unique et appliquez la mise en page de la zone de sécurité là-bas — et non dans plusieurs composants imbriqués :

html,
body,
#__nuxt {
  width: 100%;
  min-height: 100%;
  margin: 0;
  padding: 0;
  overflow-x: hidden;
}

* {
  box-sizing: border-box;
}

.app-shell {
  min-height: 100dvh;
  width: 100%;
  padding-top: env(safe-area-inset-top);
  padding-right: env(safe-area-inset-right);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
}

Enveloppez tout le contenu de la page à l'intérieur .app-shellLe doublonnement de la mise en page de la zone de sécurité dans les en-têtes, les modales et les enveloppes de mise en page peut rendre l'interface utilisateur coupée ou trop grande.

With @capgo/tailwind-capacitor, vous pouvez exprimer la même marge avec des utilitaires comme pt-safe pb-safe px-safe sur cette seule coquille.

Fixez Capacitor iOS contentInset à never context : Page/zone : Page de produits de mise à jour en temps réel. Rôle : Étiquette de navigation ou élément de l'IHM court. Clé de message `live_update_dynamic_label_to` (Étiquette dynamique de mise à jour en temps réel pour).

premier capacitor.config.tsIn contentInsetMode: 'css', préférez l'insérer natif désactivé et laissez CSS (ou la navigation native)

const config: CapacitorConfig = {
  appId: 'com.example.myapp',
  appName: 'my-app',
  webDir: 'out',
  ios: {
    contentInset: 'never',
  },
};

Mixing Capacitor’s automatic content inset with CSS env(safe-area-inset-*) Mélanger les marges automatiques de contenu de __CAPGO_KEEP_0__ avec CSS

Trouvez l'élément débordant réel

Le coupable habituel est un élément utilisant 100vw, Tailwind w-screen, une largeur de pixels fixe, ou une large min-width.

Inpecteur Web Safari, exécutez :

[...document.querySelectorAll('*')]
  .filter(el => el.scrollWidth > document.documentElement.clientWidth)
  .map(el => ({
    el,
    tag: el.tagName,
    class: el.className,
    scrollWidth: el.scrollWidth,
    clientWidth: document.documentElement.clientWidth,
  }));

Avec Tailwind, remplacez w-screen avec w-full lorsque possible. De nombreux problèmes de débordement horizontal proviennent de 100vw / w-screen, de la duplication de la marge de sécurité, ou d'un conteneur à largeur fixe — et non de la balise meta de la vue portée elle-même.

Conclusion

Vous avez réussi à convertir votre application web existante Nuxt en applications natives iOS et Android en utilisant Capacitor 8. Votre code Vue s'exécute maintenant nativement sur les appareils mobiles avec accès aux API de l'appareil.

Ce que vous avez accompli :

  • Configuré Nuxt pour la génération statique
  • Added Capacitor 8 avec les plugins essentiels
  • Bâti et déployé vers les simulateurs iOS et Android
  • Activé la rechargement en direct pour le développement
  • Corrigé les problèmes de mise en page iOS courants (vueport, zone de sécurité, débordement)
  • Added une interface utilisateur ressemblant à celle des natives avec Capgo Navigation et Transitions Native

Étapes suivantes :

  • Configurer Capgo pour les mises à jour hors ligne sans ré-envoi de l'application sur l'app store
  • Ajoutez plus de plugins natives comme la Caméra, la Géolocalisation ou les Notifications Push
  • Configurez les icônes et les écrans de démarrage de l'application pour la production
  • Préparez votre application pour la soumission sur l'App Store et Google Play

Vous commencez un nouveau projet ? Consultez Créer une application mobile Nuxt à partir de zéro pour une présentation guidée.

Ressources

Apprenez comment Capgo peut vous aider à créer des applications meilleures et plus rapides inscrivez-vous à un compte gratuit aujourd'hui.

Continuez à partir de Convertir votre application Nuxt en iOS &amp; Android avec Capacitor 8

Si vous utilisez Convertir votre application Nuxt en iOS &amp; Android avec Capacitor 8 à planifier le travail du plugin natif, connectez-l’avec Capgo Répertoire des plugins pour le flux de travail du produit dans Capgo Répertoire des plugins Capacitor Plugins par Capgo pour les détails d'implémentation dans Capacitor Plugins par Capgo Ajouter ou Mettre à Jour les Plugins pour les détails d'implémentation dans Ajouter ou Mettre à Jour les Plugins Alternatives aux Plugins Entreprise Ionic pour le flux de travail du produit dans Alternatives aux Plugins Entreprise Ionic, et Capgo Bâtiments Natives pour le flux de travail du produit dans Capgo Bâtiments Natives.

Live updates for Capacitor apps

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Support humain de Martin

Commencez Maintenant

Dernières Actualités de notre Blog

Capgo vous offre les meilleures informations nécessaires pour créer une application mobile véritablement professionnelle.