Saltare al contenuto principale
Tutorial

Converti la tua App Nuxt in iOS & Android con Capacitor 8

Trasforma la tua applicazione web Nuxt 4 esistente in app mobili native per iOS e Android utilizzando Capacitor 8. Una guida completa per configurare la generazione statica, aggiungere plugin nativi e distribuire le app nei negozi.

Martin Donadieu

Martin Donadieu

Content Marketer

Converti la tua App Nuxt in iOS & Android con Capacitor 8

Introduzione

Hai già un'applicazione web Nuxt? In questo tutorial, imparerai a trasformarla in app mobili native per iOS e Android utilizzando Capacitor 8 — l'ultima versione con prestazioni migliorate e nuove funzionalità.

Capacitor avvolge la tua app web in un contenitore nativo, dando accesso a API di dispositivo come la fotocamera, il filesystem e le notifiche push mentre mantiene il tuo codice esistente Vue. A differenza di Flutter o React Native, non hai bisogno di ricodificare nulla — il tuo Nuxt code funziona come sempre.

Cosa imparerai:

  • Configura la tua app Nuxt esistente per la generazione statica
  • Aggiungi Capacitor 8 con plugin nativi essenziali
  • Costruisci e testa su simulatori iOS e Android
  • Abilita il reload live per un sviluppo più veloce
  • Risolve i problemi di layout iOS comuni (viewport, area sicura, overflow orizzontale)
  • Aggiungi un'interfaccia utente che sembra nativa con Capgo Native Navigation e Transizioni

Desideri iniziare un nuovo progetto da zero? Consulta la nostra guida su Creare un'app mobile Nuxt da zero.

I benefici dell'uso di Nuxt e Capacitor

  • La reusabilità di Code: Condividi i tuoi componenti Vue e la logica tra app web e mobili.
  • Performance: La generazione statica di Nuxt crea bundle ottimizzati perfetti per i dispositivi mobili.
  • Funzionalità native: Accedi alle funzionalità del dispositivo come la fotocamera, la geolocalizzazione e il filesystem attraverso Capacitor plugin.
  • Sviluppo semplificato: Utilizza modelli familiari di Vue/Nuxt senza dover imparare lo sviluppo nativo.

Requisiti preliminari

: Prima di iniziare, assicurati di avere:

  • Node.js 18+ installato
  • Un progetto esistente Nuxt 4 l'applicazione
  • Xcode (per lo sviluppo di iOS, disponibile solo su macOS)
  • Android Studio (per lo sviluppo di Android)

Configurazione dell'app Nuxt per dispositivi mobili

Il primo passo è configurare l'app Nuxt per la generazione statica. Capacitor richiede file HTML/JS/CSS statici per poterli bundle nel'app nativa.

Assicurati che package.json abbia lo script di generazione:

{
  "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"
  }
}

Importante: Se stai utilizzando funzionalità server-side (API percorsi, middleware del server, ecc.), dovrai rifare quelle per utilizzare alternative client-side o API esterne.

Testare la generazione statica eseguendo:

bun run generate

Dovresti vedere una .output/public cartella con i tuoi file statici. Questo è ciò che Capacitor compilerà nel tuo app nativo.

Aggiungere Capacitor 8 al tuo Progetto

Per pacchettizzare la tua app Nuxt in un contenitore mobile nativo, segui questi passaggi:

  1. Installa Capacitor core e CLI:
bun add @capacitor/core
bun add -D @capacitor/cli
  1. Installa i plugin Capacitor comuni che avrai bisogno:
bun add @capacitor/app @capacitor/keyboard @capacitor/splash-screen @capacitor/status-bar @capacitor/preferences

Questi plugin forniscono funzionalità essenziali:

  • @capacitor/app: Gestisci gli eventi di ciclo di vita dell'app (in primo piano/ background, collegamenti profondi)
  • @capacitor/keyboard: Controlla il comportamento del tastierino su mobile
  • @capacitor/schermo di benvenuto: Gestisci lo schermo di benvenuto nativo
  • @capacitor/barra dello stato: Stile la barra dello stato del dispositivo
  • @capacitor/preferenze: Archiviazione chiave-valore (come localStorage ma nativa)
  1. Inizializza Capacitor con i dettagli del tuo progetto:
bunx cap init my-app com.example.myapp --web-dir .output/public

Sostituisci my-app con il nome del tuo app e com.example.myapp con l'ID dell'app (notazione di dominio inverso).

  1. Crea o aggiorna il capacitor.config.ts file con la configurazione corretta:
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. Installare piattaforme native:
bun add @capacitor/ios @capacitor/android
  1. Aggiungi le cartelle delle piattaforme native:
bunx cap add ios
bunx cap add android

Capacitor creerà ios e android cartelle alla radice del tuo progetto contenenti i progetti nativi.

Per costruire il progetto Android, hai bisogno di Android Studio. Per iOS, hai bisogno di un Mac con Xcode.

  1. Costruisci e sincronizza il tuo progetto:
bun run mobile

Questo esegue lo script personalizzato che genera la costruzione statica Nuxt e sincronizza i file con le piattaforme native.

Costruzione e distribuzione di applicazioni native

Per costruire e distribuire la tua app mobile nativa, segui questi passaggi:

Per sviluppare app iOS, devi avere Xcode installato, e per app Android, devi avere Android Studio installato. Inoltre, se hai l'intenzione di distribuire la tua app sul negozio di app, devi iscriverti al programma di sviluppatore Apple per iOS e al Google Play Console per Android.

  1. Apri i progetti nativi:

Per iOS:

bun run mobile:ios

Per Android:

bun run mobile:android

O direttamente con Capacitor CLI:

bunx cap open ios
bunx cap open android
  1. Costruisci e esegui l'app:

android-studio-run

  • In Android Studio, attendi che il progetto fosse pronto e poi clicca sul pulsante “Esegui” per distribuire l'applicazione su un dispositivo o emulatore collegato.

xcode-run

  • In Xcode, configura il tuo account di firma per distribuire l'applicazione su un dispositivo reale. Se non l'hai fatto prima, Xcode ti guiderà attraverso il processo (nota che devi essere iscritto al Apple Developer Program). Una volta configurato, clicca sul pulsante “Play” per eseguire l'applicazione sul tuo dispositivo collegato.

Congratulazioni! Hai distribuito con successo la tua app web Nuxt su un dispositivo mobile.

nuxtjs-mobile-app

Ma aspetta, c'è anche un modo più veloce per farlo durante lo sviluppo…

Capacitor Live Reload

Durante lo sviluppo, puoi sfruttare il live reloading per vedere i cambiamenti istantaneamente sul tuo dispositivo mobile. Per abilitare questa funzionalità, segui questi passaggi:

  1. Trova l'indirizzo IP locale:
  • Su macOS, esegui il seguente comando nel terminale:

    ipconfig getifaddr en0
  • Su Windows, esegui:

    ipconfig

    Cerca l'indirizzo IPv4 nell'output.

  1. Aggiorna il tuo capacitor.config.ts per puntare al tuo server di sviluppo:
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;

Sostituisci YOUR_IP_ADDRESS con l'indirizzo IP locale (ad esempio, 192.168.1.100).

  1. Applica le modifiche al tuo progetto nativo:
bunx cap copy

Il copy comando copia la cartella web e le modifiche di configurazione nel progetto nativo senza aggiornare l'intero progetto.

  1. Avvia il tuo server di sviluppo Nuxt e ricostruisci in Xcode/Android Studio:
bun run dev

Ora, ogni volta che apporti modifiche al tuo app Nuxt, l'app mobile si ricaricherà automaticamente per riflettere quelle modifiche.

Nota: Se installi nuovi plugin o apporti modifiche a file nativi, dovrai ricostruire il progetto nativo poiché la ricarica in tempo reale si applica solo alle modifiche web code.

Utilizzare Capacitor Plugin

I plugin Capacitor consentono di accedere alle funzionalità del dispositivo nativo dal tuo'app Nuxt. Esploriamo come utilizzare il plugin di condivisione come esempio:

  1. Installa il plugin di condivisione:
bun add @capacitor/share
  1. Crea o aggiorna una pagina per utilizzare il plugin di condivisione. In Nuxt 4, le pagine vanno in 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. Sincronizza le modifiche con il progetto nativo:
bun run mobile

O sincronizza senza ricostruire:

bunx cap sync
  1. Ricostruisci e esegui l'app sul tuo dispositivo.

Ora, quando clicchi sul pulsante “Condividi ora!”, apparirà il dialogo di condivisione nativo.

Successivamente, puoi rendere l'app più nativa su iOS e Android con Capgo navigazione e transizioni, e risolvi i problemi di layout comuni di iOS che causano overflow orizzontale o aree sicure tagliate.

Interfaccia utente nativa con Capgo Navigazione e Transizioni Nativa

Ho lavorato per anni con Ionic per costruire applicazioni cross-platform, ma integrarla con Nuxt è un po' complicato e non vale la pena quando già ne hai Tailwind CSS.

Per un aspetto mobile nativo in un'app Nuxt + Capacitor utilizza i plugin Capgo al posto di kit UI web come Konsta UI:

  • @capgo/capacitor-native-navigation — barra di navigazione nativa, Liquid Glass bar delle schede su iOS e stile di barra delle schede sfocata su Android. Il tuo router Nuxt mantiene lo stato delle rotte; il plugin gestisce il chrome nativo.
  • @capgo/capacitor-transitions — transizioni di pagina dello stile Ionic e swipe indietro su iOS nell'layer WebView, senza adottare l'interfaccia utente di Ionic.

Installa entrambi:

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

Configura la navigazione nativa con modalità CSS inset per far rispettare il contenuto web alle barre native:

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

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

Rendi una barra delle schede Liquido Glass (su iOS si utilizza il rendering di sistema; su Android si utilizza un sfondo sfocato di WebView):

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}`);
});

Aggiungi transizioni di pagina native nel contenitore dell'app:

<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>

Avvolgere le pagine di routing in cap-router-outlet, cap-page, e cap-content, e chiamare setDirection('forward') o setDirection('back') prima di navigare. Non duplicare i titoli o i piedi di pagina web quando la navigazione nativa possiede quelle superfici.

Vedi le guide complete: Utilizzare @capgo/capacitor-navigazione-nativa e Utilizzare @capgo/capacitor-transizioni.

Aree sicure con Tailwind

Per le aree sicure del dispositivo in Tailwind CSS, utilizzare @capgo/tailwind-capacitor (pubblicato come tailwind-capacitor su npm). Fornisce safe-areas strumenti e altre Capacitor-compatibili plugin Tailwind:

bun add -D tailwind-capacitor

In app/assets/css/main.css:

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

Per Nuxt 4 con Tailwind CSS 4, mantieni questa importazione nel file CSS richiamato da nuxt.config.ts.

Utilizza strumenti come pt-safe, pb-safe, e px-safe al posto di aggiungerli env(safe-area-inset-*) manualmente. Il progetto è attivamente sviluppato — se qualcosa manca per la tua configurazione Nuxt, apri una PR su GitHub.

Risolvere problemi di layout iOS (Viewport, Area sicura e sovrapposizione orizzontale)

Se il contenuto sembra essere tagliato, spostato o scorrevole orizzontalmente su iOS, aggiungendo più overflow-x: hidden o lavorare sul tag viewport da solo non risolve spesso il problema. Esegui questi controlli in ordine.

Assicurati che il tag meta viewport sia applicato correttamente

in nuxt.config.tsimpostare il viewport tramite app.head:

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

Gestisci l'area sicura di iOS da un solo wrapper radice

Crea un unico contenitore dell'applicazione e applica il padding dell'area sicura lì — non nei componenti nidificati multipli:

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);
}

Avvolgi tutta il contenuto della pagina all'interno .app-shellIl padding dell'area sicura duplicato nei titoli, nei modali e nei wrapper di layout spesso fa sembrare la UI tagliata o troppo grande.

Con @capgo/tailwind-capacitor, puoi esprimere lo stesso padding con utilità come pt-safe pb-safe px-safe su quel singolo contenitore.

Imposta Capacitor iOS contentInset su never primo

In capacitor.config.ts, preferisci l'inserimento nativo disabilitato e lascia che CSS (o la navigazione nativa ') contentInsetMode: 'css') possieda l'area sicura:

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

Il mixaggio di Capacitor’s automatico contenuto insetto con CSS env(safe-area-inset-*) padding è una causa comune di doppia spaziatura.

Trova l'elemento che sta veramente sovrascrivendo

Il solito colpevole è un elemento che utilizza 100vw, Tailwind w-screen, una larghezza in pixel fissata, o un grande min-width.

In Safari Web Inspector, esegui:

[...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,
  }));

Con Tailwind, sostituisci w-screen con w-full quando possibile. Molti problemi di sovrapposizione orizzontale derivano da 100vw / w-screenduplicati padding di area sicura, o da un contenitore di larghezza fissata — non dal tag meta viewport stesso.

Conclusione

Hai avuto successo nel convertire la tua applicazione web Nuxt esistente in app native per iOS e Android utilizzando Capacitor 8. Il tuo codice Vue ora funziona nativamente su dispositivi mobili con accesso alle API di dispositivo.

Cosa hai ottenuto:

  • Configurato Nuxt per la generazione statica
  • Aggiunto Capacitor 8 con plugin essenziali
  • Costruito e distribuito su simulatori iOS e Android
  • Abilitato il reload live per lo sviluppo
  • Risolto problemi di layout iOS comuni (viewport, area sicura, overflow)
  • Aggiunto un'interfaccia utente con un aspetto nativo utilizzando Capgo Navigazione e Transizioni native

Passaggi successivi:

  • Configura Capgo per aggiornamenti in rete senza la riconferma dell'app store
  • Aggiungi più plugin nativi come Camera, Geolocalizzazione o Notifiche Push
  • Configura icone dell'app e schermate di avvio per la produzione
  • Prepara l'app per la sottoscrizione di App Store e Google Play

Stai iniziando un nuovo progetto? Ecco Crea un'app mobile Nuxt da zero per una guida passo dopo passo.

Risorse

Scopri come Capgo possa aiutarti a costruire app migliori in modo più veloce, iscrivi per un account gratuito oggi.

Continua da Converti la tua App Nuxt in iOS &amp; Android con 8 Capacitor

Se stai utilizzando Converti la tua App Nuxt in iOS &amp; Android con 8 Capacitor per pianificare il lavoro del plugin nativo, connettilo con Directory dei Plugin Capgo per il flusso di lavoro del prodotto in Directory dei Plugin Capgo Plugin di Capgo in Capacitor per i dettagli di implementazione in Plugin di Capgo in Capacitor Aggiunta o Aggiornamento dei Plugin per i dettagli di implementazione in Aggiunta o Aggiornamento dei Plugin Alternative per Plugin di Impresa Ionic per il flusso di lavoro del prodotto in Alternative Plugin Enterprise Ionic, e Capgo Costruzioni Native per il flusso di lavoro del prodotto in Capgo Costruzioni Native.

Aggiornamenti in tempo reale per le app Capacitor

Quando un bug del layer web è attivo, invia la correzione attraverso Capgo invece di attendere giorni per l'approvazione della store. Gli utenti ricevono l'aggiornamento in background mentre le modifiche native rimangono nel normale percorso di revisione.

Inizia subito

Ultimi articoli dal nostro Blog

Capgo ti offre le migliori informazioni che ti servono per creare un'app mobile davvero professionale.