Saltar al contenido principal
Tutorial

Creando Aplicaciones Móviles con SvelteKit y Capacitor

Learn how to build a mobile app using SvelteKit, Capacitor, and enhance the Capgo Native Navigation, Transitions, and iOS layout best practices.

Martin Donadieu

Martin Donadieu

Gerente de Contenido

Creando Aplicaciones Móviles con SvelteKit y Capacitor

En este tutorial, comenzaremos con una nueva aplicación SvelteKit y transitaremos a un desarrollo móvil nativo utilizando __CAPGO_KEEP_0__. También puedes agregar la navegación y transiciones nativas de __CAPGO_KEEP_1__ para un sentir móvil nativo, y utilizar tailwind-__CAPGO_KEEP_2__ para áreas seguras. app and transition to native mobile development using Capacitor. You can also add Capgo Native Navigation and Transitions for a native mobile feel, and use tailwind-capacitor for safe areas.

Building Mobile Apps with SvelteKit and Capacitor

Sigue este paso a paso para transformar tu aplicación SvelteKit en una aplicación móvil utilizando Capacitor, con navegación nativa opcional Capgo, transiciones y orientación de iOS.

Sobre Capacitor

CapacitorJS es un juego de cambio! Puede integrarse de manera eficiente en cualquier proyecto web, envolviendo tu aplicación en una vista web nativa y generando proyectos de Xcode y Android Studio nativos para ti. Sus plugins proporcionan acceso a características de dispositivo nativo como la cámara a través de un puente de JavaScript.

Capacitor te permite crear una fantástica aplicación móvil nativa sin ningún setup complicado o curva de aprendizaje pronunciada. Su API y funcionalidad simplificada lo hacen fácil de integrar en tu proyecto. Te sorprenderá la simplicidad con la que puedes lograr una aplicación nativa completamente funcional con Capacitor!

Preparando tu aplicación SvelteKit

Para crear una nueva aplicación SvelteKit, ejecuta el siguiente comando:

npm create svelte@latest my-app
cd my-app
npm install
npm run build

Después de ejecutar el build comando, deberías ver una nueva dist carpeta en la raíz de tu proyecto.

Esta carpeta se utilizará por Capacitor más adelante, pero por ahora, necesitamos configurarla correctamente.

Agregar Capacitor a tu aplicación SvelteKit

Para empaquetar cualquier aplicación web en un contenedor móvil nativo, debemos seguir unos pocos pasos inicialmente. Después de eso, es tan simple como ejecutar un comando único sync command.

Primero, instale el Capacitor CLI como una dependencia de desarrollo y configúrelo dentro de su proyecto. Durante la configuración, puede pulsar “enter” para aceptar los valores predeterminados para el nombre y el ID de paquete.

Segundo, instale el paquete principal y los paquetes relevantes para las plataformas iOS y Android.

Finalmente, agregue las plataformas, y Capacitor creará carpetas para cada plataforma en la raíz de su proyecto:

# Install the Capacitor CLI locally
npm install -D @capacitor/cli

# Initialize Capacitor in your SvelteKit project
npx cap init

# Install the required packages
npm install @capacitor/core @capacitor/ios @capacitor/android

# Add the native platforms
npx cap add ios
npx cap add android

En este punto, debería ver nuevas ios y android carpetas en su proyecto de SvelteKit.

Estos son proyectos nativos reales!

Para acceder al proyecto de Android más tarde, necesitarás instalar Android Studio. Para iOS, necesitarás un Mac y deberías instalar Xcode.

Además, debes encontrar un archivo capacitor.config.ts en tu proyecto, que contiene algunas configuraciones básicas Capacitor utilizadas durante la sincronización. La única cosa a la que debes prestar atención es el webDir, que debe apuntar al resultado de tu comando de compilación. Actualmente, está incorrecto.

Para solucionar esto, abre el archivo capacitor.config.ts y actualiza directorioWeb:

import { CapacitorConfig } from '@capacitor/cli'

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'my-app',
  webDir: 'build',
}

export default config

Ahora que hemos actualizado nuestras configuraciones de Capacitor, vamos a cambiar nuestro proyecto de Sveltekit a una aplicación estática descargando el paquete de adaptador estático adecuado:

npm i -D @sveltejs/adapter-static

Después de instalar el paquete, necesitaremos alterar archivo svelte.config.js desde el adaptador automático a estático:

import adapter from '@sveltejs/adapter-static'
import { vitePreprocess } from '@sveltejs/kit/vite'

/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors
  preprocess: vitePreprocess(),

  kit: {
    // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
    // If your environment is not supported or you settled on a specific environment, switch out the adapter.
    // See https://kit.svelte.dev/docs/adapters for more information about adapters.
    adapter: adapter({
      // default options are shown. On some platforms
      // these options are set automatically — see below
      pages: 'build',
      assets: 'build',
      fallback: null,
      precompress: false,
      strict: true
    })
  }
}

export default config

Con el archivo svelte.config.js actualizado, necesitaremos agregar una opción de pre-renderizado creando una archivo +layout.js página src/rutas y solo agregar la siguiente exportación a +layout.js:

export const prerender = true

Después de agregar y actualizar el +layout.js página, necesitaremos agregar nuestras plataformas móviles, reconstruir nuestro proyecto para crear la carpeta build Puedes hacerlo ejecutando los siguientes comandos:

El primer comando

npm run build
npx cap sync

construirá tu proyecto SvelteKit y copiará la compilación estática, mientras que el segundo comando npm run build syncronizará todos los web __CAPGO_KEEP_0__ en los lugares correctos de las plataformas nativas para que puedan ser visualizados en una aplicación. npx cap sync will sync all the web code into the right places of the native platforms so they can be displayed in an app.

Además, el comando de sincronización podría actualizar las plataformas nativas e instalar plugins, por lo que cuando instales nuevos Capacitor plugins, es hora de ejecutar npx cap sync de nuevo.

Sin darse cuenta, has completado el proceso, así que veamos la aplicación en un dispositivo!

Desarrollar y Desplegar Aplicaciones Nativas

Para desarrollar aplicaciones iOS, necesitas tener Xcode instalado, y para aplicaciones Android, necesitas tener Android Studio instalado. Además, si planeas distribuir tu aplicación en la tienda de aplicaciones, necesitas inscribirte en el Programa de Desarrolladores de Apple para iOS y en el Console de Google Play para Android.

Si eres nuevo en el desarrollo móvil nativo, puedes usar el Capacitor CLI para abrir fácilmente ambos proyectos nativos:

npx cap open ios
npx cap open android

Una vez que hayas configurado tus proyectos nativos, desplegar tu aplicación en un dispositivo conectado es fácil. En Android Studio, solo necesitas esperar a que todo esté listo, y puedes desplegar tu aplicación en un dispositivo conectado sin cambiar ninguna configuración. Aquí tienes un ejemplo:

android-studio-run

En Xcode, debes configurar tu cuenta de firma para desplegar tu aplicación en un dispositivo real en lugar de solo en el simulador. Si no lo has hecho antes, Xcode te guía a través del proceso (pero, una vez más, debes estar inscrito en el Programa de Desarrolladores). Después de eso, puedes simplemente pulsar play para ejecutar la aplicación en tu dispositivo conectado, que puedes seleccionar en la parte superior. Aquí tienes un ejemplo:

xcode-run

Felicidades! Has desplegado con éxito tu aplicación web SvelteKit en un dispositivo móvil. Aquí tienes un ejemplo:

sveltekit-mobile-app

Pero espera, hay una forma más rápida de hacer esto durante el desarrollo…

Capacitor Live Reload

Hasta ahora, probablemente estás acostumbrado a tener hot reload con todas las marcos modernas, y la buena noticia es que puedes tener la misma funcionalidad en un dispositivo móvil con un mínimo esfuerzo!

Habilita acceso a tu aplicación hospedada localmente con live reload On tu red por tener la aplicación Capacitor cargar el contenido desde la URL específica.

El primer paso es determinar tu dirección IP local. Si estás utilizando un Mac, puedes encontrar esto ejecutando el siguiente comando en la terminal:

ipconfig getifaddr en0

On Windows, ejecuta:

ipconfig

Luego busca la dirección IPv4.

Puedemos instruir a Capacitor para que cargue la aplicación directamente desde el servidor agregando otra entrada a nuestro capacitor.config.ts archivo:

import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'my-app',
  webDir: 'dist',
  bundledWebRuntime: false,
  server: {
    url: 'http://192.168.x.xx:3000',
    cleartext: true
  }
};

export default config;

Asegúrate de utilizar la dirección IP y el puerto correctos, tal como se muestra en el ejemplo anterior.

Ahora, podemos aplicar estos cambios copiándolos a nuestro proyecto nativo:

npx cap copy

El copy La orden es similar a syncpero solo copiará los cambios realizados en la carpeta web y la configuración, sin actualizar el proyecto nativo.

Puedes desplegar tu aplicación una vez más a través de Android Studio o Xcode. Después de eso, si cambias algo en tu aplicación Svelte, la aplicación se recargará automáticamente y mostrará los cambios!

Tener en cuenta que si installas nuevos plugins como la cámara, todavía requiere una reconstrucción del proyecto nativo. Esto se debe a que los archivos nativos se han modificado, y no se puede hacer en tiempo real.

Tenga en cuenta que debe utilizar la IP y el puerto correctos en su configuración. El bloque code anterior muestra el puerto por defecto de SvelteKit con fines de demostración.

Usando Capacitor Plugins

Vamos a echar un vistazo a cómo utilizar un plugin Capacitor en acción, que mencionamos antes. Para hacer esto, podemos instalar un plugin simple ejecutando:

npm i @capacitor/share

There’s nothing fancy about the Compartir plugin, pero muestra el diálogo de compartir nativo! share() Para esto, ahora solo necesitamos importar el paquete y llamar a la función desde nuestra aplicación, así que cambiemos el src/routes/index.svelte

<script>
  import { Share } from '@capacitor/share';

  async function share() {
    await Share.share({
      title: 'Open Youtube',
      text: 'Check new video on youtube',
      url: 'https://www.youtube.com',
      dialogTitle: 'Share with friends'
    });
  }
</script>

<h1>Welcome to SvelteKit and Capacitor!</h1>
<button on:click={share}>Share now!</button>

a esto:

npx cap sync

Como se mencionó anteriormente, cuando instalamos nuevos plugins, necesitamos realizar una operación de sincronización y luego volver a desplegar la aplicación en nuestro dispositivo. Para hacer esto, ejecuta el siguiente comando:

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.

Enseguida, puedes hacer que la aplicación se sienta más nativa en iOS y Android con la navegación y transiciones Capgo y solucionar problemas de diseño comunes de iOS que causan desbordamiento horizontal o áreas de seguridad recortadas.

Interfaz de usuario que se siente nativa con __CAPGO_KEEP_0__ Navegación y Transiciones Nativas He trabajado durante años con para construir aplicaciones de múltiples plataformas, pero integrarla con SvelteKit es engorrosa y raramente vale la pena cuando ya tienes Tailwind CSS.

Para un sentir móvil nativo en una aplicación SvelteKit + Capacitor , utilice Capgo plugins en lugar de kits de interfaz de usuario web solo como Konsta UI:

  • @capgo/capacitor-navegación-nativa — barra de navegación nativa, Liquid Glass barra de pestañas en iOS, y un estilo de barra de pestañas difuminado en Android. Su router SvelteKit mantiene el estado de ruta; el plugin es dueño del navegador nativo.
  • @capgo/capacitor-transiciones — transiciones de página estilo Ionic y retroceso de arrastre en iOS en la capa de WebView, sin adoptar la interfaz de usuario de Ionic.

Instale ambos:

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

Configure la navegación nativa con el modo de inserción de CSS para que el contenido web respete las barras nativas:

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

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

Renderice una barra de pestañas de vidrio líquido (iOS utiliza la renderización propiedad del sistema; Android utiliza un fondo difuminado de 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 }) => {
  goto(`/${id}`);
});

Agregue transiciones de página nativas en su capa de aplicación:

<script>
  import { goto } from '$app/navigation';
  import { routerOutlet, page, setDirection } from '@capgo/capacitor-transitions/svelte';
  import '@capgo/capacitor-transitions';

  function openSettings() {
    setDirection('forward');
    goto('/settings');
  }
</script>

<cap-router-outlet use:routerOutlet>
  <cap-page use:page>
    <cap-content slot="content">
      <slot />
    </cap-content>
  </cap-page>
</cap-router-outlet>

Envuelva páginas de ruta en cap-router-outlet, cap-pagey cap-contenty y llamar setDirection('forward') o setDirection('back') antes de navegar. No duplique encabezados o pie de página web cuando la navegación nativa controla esas superficies.

Consulte las guías completas: Usando @capgo/capacitor-navegación-nativa y Usando @capgo/capacitor-transiciones.

Áreas seguras con Tailwind

Para áreas seguras de dispositivos en Tailwind CSS, utilice @capgo/tailwind-capacitor (publicado como tailwind-capacitor On npm). Ofrece safe-areas utilidades y otros plugins de Tailwind compatibles con Capacitor:

bun add -D tailwind-capacitor

En src/app.css:

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

Utilice utilidades como pt-safe, pb-safe, y px-safe en lugar de agregarlos env(safe-area-inset-*) a mano. El proyecto está activamente desarrollado — si algo falta para su configuración de SvelteKit, abre una solicitud de extracción en GitHub.

Corrección de problemas de diseño de iOS (Vista de pantalla, área segura y rebosamiento horizontal)

Si el contenido parece recortado, desplazado o desplazable horizontalmente en iOS, agregar más overflow-x: hidden o ajustar la etiqueta de vista previa sola no suele solucionar el problema. Pase por estas comprobaciones en orden.

Asegúrese de que la etiqueta meta de vista previa se aplique correctamente

Inicia src/app.html, establece la etiqueta meta de viewport en <head>:

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />

Administra el área segura de iOS desde un solo contenedor raíz

Crear un contenedor de aplicación único y aplicar allí el relleno de área segura — no en múltiples componentes anidados:

html,
body,
body {
  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);
}

Envuelve todo el contenido de la página dentro de .app-shell. El relleno de área segura duplicado en encabezados, modales y contenedores de diseño a menudo hace que la interfaz de usuario parezca recortada o demasiado grande.

Con @capgo/tailwind-capacitor, puedes expresar el mismo relleno con utilidades como pt-safe pb-safe px-safe en ese contenedor único.

Establece Capacitor iOS contentInset a never primero

En capacitor.config.ts, prefiera el área de inserción nativa deshabilitada y deja que CSS (o la navegación nativa) tenga el área de seguridad: contentInsetMode: 'css'Mezclar el área de contenido automático de __CAPGO_KEEP_0__ con CSS

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

Mixing Capacitor’s automatic content inset with CSS env(safe-area-inset-*) Encuentra el elemento que está desbordando realmente

El culpable usual es un elemento que utiliza

, Tailwind 100vw, una anchura de píxeles fija, o un tamaño w-screenIn Safari Web Inspector, ejecuta: min-width.

Con Tailwind, reemplaza

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

With Tailwind, replace w-screen con w-full cuando sea posible. Muchos problemas de rebosamiento horizontal provienen de 100vw / w-screenla duplicación de relleno de área segura, o un contenedor de ancho fijo — no del meta etiqueta de viewport en sí.

Conclusión

Capacitor es una excelente opción para crear aplicaciones nativas basadas en un proyecto web existente, ofreciendo una forma sencilla de compartir code y mantener una interfaz de usuario consistente.

Y con la adición de Capgo, es aún más fácil agregar actualizaciones en vivo a tu aplicación, asegurando que tus usuarios siempre tengan acceso a las últimas características y correcciones de errores.

Si deseas aprender a agregar Capgo a tu aplicación SvelteKit, consulta el próximo artículo:

Aprende cómo Capgo puede ayudarte a crear aplicaciones mejoradas más rápido, regístrate para una cuenta gratuita hoy.

Sigue adelante desde Construyendo Aplicaciones Móviles con SvelteKit y Capacitor

Si estás utilizando Construyendo Aplicaciones Móviles con SvelteKit y Capacitor para planificar la automatización de CI/CD, conecta con Capgo CI/CD para el flujo de trabajo del producto en Capgo CI/CD, Capgo Compilaciones Nativas para el flujo de trabajo del producto en Capgo Compilaciones Nativas, Capgo Integraciones para el flujo de trabajo del producto en Capgo Integraciones, Integración de CI/CD para el detalle de implementación en Integración de CI/CD, y GitHub Acciones de Integración para los detalles de implementación en GitHub Acciones de Integración.

Actualizaciones en vivo para aplicaciones Capacitor

Cuando un error de capa web está en vivo, envíe la corrección a través de Capgo en lugar de esperar días para la aprobación de la tienda de aplicaciones. Los usuarios obtienen la actualización en segundo plano mientras los cambios nativos permanecen en el camino de revisión normal.

Inicia ahora

Últimas noticias de nuestro Blog

Capgo te da las mejores herramientas para crear una aplicación móvil profesional.